Флаттер состояние и потоки - PullRequest
0 голосов
/ 09 марта 2020

Это вопрос типа структуры кода. У меня есть две страницы в моем приложении page1 и page2. Страница2 y не имеет значения, за исключением того, что вы можете перемещаться со страницы 1 на страницу 2 и обратно на страницу 1.

На странице 1 я использую этот плагин . Он показывает диалог, и вы предоставляете обратный вызов с выбранным языком. Я использую Stream, потому что мне нужно загрузить предопределенный язык с общими настройками asyn c. Мое намерение - передать _lang на страницу2. Код, как у меня есть, работает как положено. Но если вы вернетесь на страницу 1 со страницы 2, вы получите язык по умолчанию, потому что я не вызывал setState. Если я добавлю setState внутри обратного вызова, изменения не сохранятся, потому что поток каждый раз перестраивается. И я не могу вывести поток, если я хочу, чтобы по умолчанию показывалось при запуске.

StreamBuilder(
                  stream: langStream.stream,
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      _lenguaje = snapshot.data;
                      return ListTile(
                        leading: Icon(Icons.language),
                        title: Text('${snapshot.data.name}'),
                        trailing: Text('Your Lang'),
                        onTap: () {
                          showLangPicker(
                            context,
                            (Language lang) {
                              _lang = lang;
                              langStream.update(lang);
                            },
                          );
                        },
                      );
                    } else {
                      return Container();
                    }
                  },
                ),

Я в ситуации куриного яйца. Спасибо.

1 Ответ

3 голосов
/ 10 марта 2020

Вам нужно использовать какое-то управление состоянием . Я бы использовал провайдера . Как бы вы достигли sh, у вас будет модель уровня приложения, которая расширяет ChangeNotifier и называется languageModel или settingsModel. Модель будет выглядеть примерно так:

class SettingsModel extends ChangeNotifier {
  Language _lang;
  Language get lang => _lang;
  set lang(Language lang) {
    _lang= lang;
    notifyListeners();
  }
}

Затем на второй странице, когда вы получите свой язык, просто позвоните:

Provider.of<SettingsModel>(context, listen: false).lang = yourSelected Language

Затем в вашем ListView вы можете получить язык с помощью следующее: вызов Provider.of<SettingsModel>(context).lang или использование Consumer виджета, как показано в первой ссылке.

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

...