我想使用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
。我打开其中之一。我关闭了应用程序。重新开始。我打开的上一个参数仍为true
。
答案 0 :(得分:1)
我遇到了同样的问题,并通过在顶部添加以下内容在Android /../ MainActivity.java中进行了修复:
<p>
Select text then hit Enter to expand selection to word edges.<br>
Works with <b>nested <i>tags</i></b> as well.
</p>
以及在super.onCreate(savedInstanceState)下;
import io.flutter.plugins.GeneratedPluginRegistrant;
问题来自使用
GeneratedPluginRegistrant.registerWith(this);
我是从Flutter Test MissingPluginException获得的,但似乎清除了所有共享的偏好设置。
但是,如果删除SharedPreferences.setMockInitialValues({});
并且MainActivity.java中没有上述两行,则会得到:
MissingPluginException(未找到方法getAll的实现 频道颤动:plugins.flutter.io/shared_preferences)
希望对您有帮助!
答案 1 :(得分:1)
嗨,我也遇到了同样的问题。做了很多事情。没有帮助。这可能对某人有所帮助。第一件事,按照此URL进行更改
1.https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects
2。运行命令 动态升级
3。更改了pubspec.yaml文件中的共享首选项插件
shared_preferences:“> = 0.5.10 <2.0.0”
4。从已安装的flutter位置删除发布缓存
C:\ Users \ myuser \ AppData \ Local \ Pub \ Cache \ hosted \ pub.dartlang.org
5.flutter构建apk --debug
6.flutter构建apk --profile
7.flutter运行--release(如果我直接运行此命令,则找不到debug.jar之类的抛出错误,因此我运行了命令5和6)
命令7用于-验证其在发布模式下是否正常工作。
最后,我尝试在不缩小代码的情况下生成应用程序构建。然后成功了
flutter build apk-无收缩 颤抖的构建附件-无收缩
答案 2 :(得分:0)
import 'package:shared_preferences/shared_preferences.dart';
class MySharedPreferences {
MySharedPreferences._privateConstructor();
static final MySharedPreferences instance =
MySharedPreferences._privateConstructor();
setStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
myPrefs.setString(key, value);
}
Future<String> getStringValue(String key) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
return myPrefs.getString(key) ?? "";
}
Future<bool> containsKey(String key) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
return myPrefs.containsKey(key);
}
removeValue(String key) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
return myPrefs.remove(key);
}
removeAll() async{
SharedPreferences myPrefs = await SharedPreferences.getInstance();
return myPrefs.clear();
}
}