【问题标题】:Flutter SharedPreference do not persistFlutter SharedPreference 不持久
【发布时间】:2019-06-28 15:26:24
【问题描述】:

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

【问题讨论】:

标签: dart flutter sharedpreferences


【解决方案1】:

我遇到了同样的问题,并在 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 on 的实现 通道颤动:plugins.flutter.io/shared_preferences)

希望对你有帮助!

【讨论】:

  • 你能帮我解决这个问题吗?我的 MainActivity 中已经有 2 行,但我的 sharedpreference 在启动时为空,我在任何地方的代码中都没有找到这行 SharedPreferences.setMockInitialValues({});
  • 我所能建议的就是尝试pub.dartlang.org/packages/shared_preferences上的参考:_incrementCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); int counter = (prefs.getInt('counter') ?? 0) + 1; print('Pressed $counter times.'); await prefs.setInt('counter', counter); }
  • 我有同样的问题,但这个解决方案不起作用。 @jérémy 你找到解决方案了吗?
  • 这个解决方案对 ios 有影响吗?我在 ios 中遇到了同样的问题。
【解决方案2】:

您好,我也遇到了同样的问题。做了那么多事。没有任何帮助。这可能对某人有所帮助。第一件事,按照这个网址进行更改

1.https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects

2.运行命令 颤振升级

3.更改了pubspec.yaml文件中的共享首选项插件

shared_preferences: ">=0.5.10

4.从已安装的 Flutter 位置删除 pub 缓存

C:\Users\myuser\AppData\Local\Pub\Cache\hosted\pub.dartlang.org

5.flutter build apk --debug

6.flutter build apk --profile

7.flutter run --release (如果我直接运行这个命令,它会抛出类似 debug.jar not found 的错误,所以我运行了命令 5 和 6)

命令 7 用于 - 验证其在发布模式下是否正常工作。

最后,我尝试在不压缩代码的情况下生成应用程序构建。然后就成功了

flutter build apk --no-shrink flutter build appbundle --no-shrink

【讨论】:

    【解决方案3】:
    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

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 1970-01-01
      • 2023-01-17
      • 2019-10-29
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2020-08-23
      • 2019-03-06
      相关资源
      最近更新 更多