这种代码结构问题。我的应用程序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();
}
},
),
我处在鸡蛋状态。谢谢。
答案 0 :(得分:3)
您需要使用某种state management。我会使用provider。如何实现此目的,您将拥有一个扩展了ChangeNotifier
或languageModel
的{{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
小部件,如第一个链接所示。
我希望这对您有所帮助,您可能需要与提供者一起对状态管理进行更多的研究以实现此目的,但是使用某种形式的状态管理是解决问题的最干净的方法,因此您无需围绕框架工作,让它帮助您。如果这对您有帮助,请感到困惑并接受表决并发表评论。