dart - Flutter SharedPreference 不持久

标签 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。我打开其中一个。我关闭应用程序。重新开始。我打开'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/

相关文章:

dart - RangeError : Invalid value: Not in range 0. .1114111,包括:-1 尝试使用升级命令时

mongodb - 维护的Dart ORM(特别适用于mongodb)

flutter - 如何在 Flutter 中使用 SharedPreferences 保存 DateFormat?

java - 如何在 Asynctask 中获取共享首选项?

flutter - 如何使用 flutter cloud_firestore 插件从 DocumentID 获取 documetReference

flutter - Firebase 排序在 flutter 中无法正常工作

push-notification - 自定义声音推送通知不起作用(Flutter)

firebase - 如何从Firebase存储中获取具有存储在数据库中的文件名的图像?

flutter - StatelessWidget 中的 Futurebuilder - Flutter

android - 保存 ArrayList 内容的最佳方法是什么?