首页 > 解决方案 > Flutter 状态和流

问题描述

这种代码结构问题。我的应用程序 page1 和 page2 中有两个页面。Page2 y 无关紧要,只是您可以从 page1 导航到 page2 并返回到 page1。

在 page1 我使用这个插件。它显示一个对话框,您可以使用所选语言进行回调。我使用 a 是Stream因为我必须从异步的共享首选项中加载预定义的语言。我的意图是传递_lang到第 2 页。我拥有的代码按预期工作。但是,如果您从 page2 导航回 page1,您将获得默认语言,因为我没有调用 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();
                    }
                  },
                ),

我处于鸡蛋的状态。谢谢。

标签: flutterstreamstate

解决方案


您需要使用某种状态管理。我会使用提供者。您将如何实现这一点,您将拥有一个扩展ChangeNotifier名为languageModelor的应用程序级模型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第一个链接中所示的小部件。

我希望这会有所帮助,并且您可能需要与提供者一起对状态管理进行更多研究以实现此目的,但是使用某种形式的状态管理是解决您的问题的最干净的解决方案,因此您不是围绕框架工作,而是让它有所帮助你。


推荐阅读