Flutter SharedPreference不持久

时间:2019-02-04 20:20:45

标签: dart flutter sharedpreferences

我想使用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

3 个答案:

答案 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();
  }
 
}

更多参考:Flutter Shared Preferences Tutorial