Обновление Flatter SharedPreference при добавлении дочернего маршрута - PullRequest
0 голосов
/ 07 декабря 2018

Я немного знаком с флаттером и начинаю работать с SharedPreference.Все работает как шарм, но когда я изменяю дочерний маршрут, родительский маршрут не обновляется.

Я использую параметр маршрута MaterialApp:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'Flutter app',
        home: Counter(),
        routes: <String, WidgetBuilder>{
          '/settings': (BuildContext context) => new Settings(),
        });
  }
}

У меня есть родительский маршрут с initStateкоторая работает при запуске приложения, но когда я открываю новую страницу, а затем вносю изменения в SharedPreference, и после того, как я возвращаюсь к основному маршруту, SharedPreference не изменяется, потому что initState не запускается, когда вы извлекаете маршрут из стека.

void initState() {
        SharedPreference().getLightsOn().then(updateLight);
        super.initState();
    }
    void updateLight(bool lt) {
        setState(() {
            _lights = lt;
        });
    }

Мой обходной путь - поместить его в виджет сборки, чтобы получить значение, но я думаю, что это не очень хороший метод, потому что он повторяется снова и снова.

Widget build( BuildContext context ) {
  SharedPreference().getLightsOn().then(updateLight);
  ...

1 Ответ

0 голосов
/ 07 декабря 2018

Когда вы нажимаете новую страницу / Widget, вы можете использовать ключевое слово await, чтобы дождаться появления страницы.Как это:

      callNextPage() async {
        await Navigator.of(context).push(....);
        _readPreferences();
      }

      _readPreferences() {
        SharedPreference().getLightsOn().then(updateLight);
      }

      @override
        void initState() {
          _readPreferences();
          super.initState();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...