我想使用 Flutter 的 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
。
我想要什么:
午餐时 3 个参数为 false
。我打开其中一个。我关闭应用程序。重新开始。我打开'ON'的前一个参数仍然是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(No implementation found for method getAll on channel flutter: plugins.flutter.io/shared_preferences)
希望对你有帮助!
关于dart - Flutter SharedPreference 不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54523760/