抖动状态和流

时间:2020-03-09 20:29:55

标签: flutter stream state

这种代码结构问题。我的应用程序page1和page2中有两个页面。第2页与您无关,只是您可以从第1页导航到第2页,然后返回到第1页。

在第1页中,我使用此plugin 。它显示一个对话框,您可以使用所选语言进行回叫。我使用Stream是因为我必须加载预定义的语言,而共享偏好是异步的。我的意图是将_lang传递给page2。我所拥有的代码按预期工作。但是,如果您从第2页导航回第1页,则会获得默认语言,因为我没有调用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 个答案:

答案 0 :(得分:3)

您需要使用某种state management。我会使用provider。如何实现此目的,您将拥有一个扩展了ChangeNotifierlanguageModel的{​​{1}}的应用程序级别模型。该模型将如下所示:

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小部件,如第一个链接所示。

我希望这对您有所帮助,您可能需要与提供者一起对状态管理进行更多的研究以实现此目的,但是使用某种形式的状态管理是解决问题的最干净的方法,因此您无需围绕框架工作,让它帮助您。如果这对您有帮助,请感到困惑并接受表决并发表评论。