Флаттер SharedPreference не сохраняется - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу сохранить пользовательские настройки, используя SharedPreference Flutter.Но зарегистрированные настройки ВСЕ пустые при новом запуске (когда приложение закрыто, но не удалено).

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.Если я включу «ON» одного из них, подождите 2 секунды (это не проблема асинхронности), затем закройте приложение и снова запустите ... Все мои параметры false.

ЧтоЯ хочу:

На обед 3 параметра false.Я включаю один из них.Я закрываю приложение.Начните снова.Предыдущий параметр, который я включил, все еще true.

1 Ответ

0 голосов
/ 07 февраля 2019

У меня была такая же проблема, и я исправил ее в Android /../ MainActivity.java, добавив вверху:

import io.flutter.plugins.GeneratedPluginRegistrant;

, а также в super.onCreate (saveInstanceState);

GeneratedPluginRegistrant.registerWith(this);

Проблема возникает из-за использования

SharedPreferences.setMockInitialValues({}); 

Я получил его из Flutter Test MissingPluginException , но, похоже, он очищает все общие настройки.

Однако есливы удаляете SharedPreferences.setMockInitialValues({});, и у вас нет двух строк выше в MainActivity.java, вы получите:

MissingPluginException (Не найдена реализация для метода getAll на канале flutter: plugins.flutter.io / shared_preferences)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...