我想使用Flutter的保存用户首选项SharedPreference。但是注册的首选项在新的开始时为空(应用程序已关闭时,并非没有问题)。
SharedPreference
settings.dart :
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class SettingsPage extends StatefulWidget{ @override _SettingsPageState createState() => new _SettingsPageState(); } class _SettingsPageState extends State<SettingsPage>{ bool _param1IsON; bool _param2IsON; bool _param3IsON; @override void initState() { super.initState(); _param1IsON = false; _param2IsON = false; _param3IsON = false; loadPreferences(); } Future<Null> loadPreferences() async { SharedPreferences _preferences = await SharedPreferences.getInstance(); if(_preferences.getBool('setted') == null || !_preferences.getBool('setted')) SharedPreferences.setMockInitialValues({}); // Library fix line bool param1IsON = _preferences.getBool('param1IsON'); bool param2IsON = _preferences.getBool('param2IsON'); bool param3IsON = _preferences.getBool('param3IsON'); setState(() { _param1IsON = (param1IsON != null)? param1IsON : _param1IsON; _param2IsON = (param2IsON != null)? param2IsON : _param2IsON; _param3IsON = (param3IsON != null)? param3IsON : _param3IsON; }); _preferences.setBool('setted', true); } Future<Null> setBoolSettings(String key, bool value) async { switch(key){ case 'param1IsON': setState(() { _param1IsON = value; }); break; case 'param2IsON': setState(() { _param2IsON = value; }); break; case 'param3IsON': setState(() { _param3IsON = value; }); break; default: print("Unknown settings '$key'"); } SharedPreferences _preferences = await SharedPreferences.getInstance(); await _preferences.setBool(key, value); } @override Widget build(BuildContext context) { return new ListView( children: <Widget>[ new ListTile( title: new Text(Param 1'), trailing: new Switch(value: _param1IsON, onChanged: (bool newValue) { setBoolSettings('param1IsON', newValue); }), ), new ListTile( title: new Text('Param 2'), trailing: new Switch(value: _param2IsON, onChanged: (bool newValue) { setBoolSettings('param2IsON', newValue); }), ), new ListTile( title: new Text('Param 3'), trailing: new Switch(value: _param3IsON, onChanged: (bool newValue) { setBoolSettings('param3IsON', newValue); }), ), ] ); } }
我得到的是:
午餐时有3个参数false。如果我打开其中一个,请等待2秒钟(这不是异步问题),然后关闭应用程序并再次启动…我的所有参数均为false。
false
我想要的是:
午餐时有3个参数false。我打开其中之一。我关闭了应用程序。重新开始。我打开的上一个参数仍然是true。
true
我遇到了同样的问题,并通过在顶部添加在Android /../ MainActivity.java中进行了修复:
import io.flutter.plugins.GeneratedPluginRegistrant;
以及在super.onCreate(savedInstanceState)下;
GeneratedPluginRegistrant.registerWith(this);
问题来自使用
SharedPreferences.setMockInitialValues({});
我从Flutter Test MissingPluginException获得了它,但似乎清除了所有共享的首选项。
但是,如果删除SharedPreferences.setMockInitialValues({});并在MainActivity.java中没有上面的两行,则会得到:
MissingPluginException(在通道抖动上未找到方法getAll的实现:plugins.flutter.io/shared_preferences)
希望对您有所帮助!