Flutter 防止Cupertino标签在切换标签时保持状态
材质的Scaffold&BottomNavigationBar的默认实现是在每次选项卡更改中销毁并重新创建每个选项卡 在CupertinoTabScaffold、CupertinoTabView和CupertinoPageScaffold的情况下,行为是不同的:每个选项卡的状态都保持不变,因此在选项卡之间切换不会在每次更改中重新触发选项卡的initState()方法 我的问题是:如何修改此行为,使其与材质相同?我希望销毁并重新创建每个选项卡,从而在每个选项卡更改中调用initState()方法,与Material小部件相同Flutter 防止Cupertino标签在切换标签时保持状态,flutter,tabs,flutter-layout,flutter-cupertino,Flutter,Tabs,Flutter Layout,Flutter Cupertino,材质的Scaffold&BottomNavigationBar的默认实现是在每次选项卡更改中销毁并重新创建每个选项卡 在CupertinoTabScaffold、CupertinoTabView和CupertinoPageScaffold的情况下,行为是不同的:每个选项卡的状态都保持不变,因此在选项卡之间切换不会在每次更改中重新触发选项卡的initState()方法 我的问题是:如何修改此行为,使其与材质相同?我希望销毁并重新创建每个选项卡,从而在每个选项卡更改中调用initState()方法,
谢谢。我想说这是一种黑客行为,但真正让元素重建的一种方法是只使用新元素 但是很明显,您需要呈现相同的小部件类,那么它怎么可能是新的呢
键
颤振检查小部件的类型
,以及它的键
(如果提供),以验证小部件是否相同,以便重建
你可以这样使用钥匙。考虑这个简单的例子。
@override
Widget build(BuildContext context) {
return CupertinoTabScaffold(
tabBar: CupertinoTabBar(
items: [
BottomNavigationBarItem(icon: Icon(Icons.add_a_photo)),
BottomNavigationBarItem(icon: Icon(Icons.add)),
BottomNavigationBarItem(icon: Icon(Icons.calendar)),
],
),
tabBuilder: (_, i) => Sample(
key: ValueKey(Random().nextInt(255)),
),
);
}
我有一个示例
类,用于在cupertinabscaffold
中构建每个屏幕。但是我没有像Sample()
那样使用它,而是传递了一个额外的键
参数,它只是一个随机数
现在,我的示例
类如下所示
class Sample extends StatefulWidget {
Sample({Key key}) : super(key: key);
@override
State<StatefulWidget> createState() {
return SampleState();
}
}
类示例扩展StatefulWidget{
样本({Key}):超级(Key:Key);
@凌驾
状态createState(){
返回SampleState();
}
}
现在,即使您更改了SampleState
类中的某些内容,然后访问另一个选项卡
,然后返回到上一个选项卡
,因为您正在使用一个新的键
,Flatter也会认为它是一个新的小部件
,并会重新构建它
问题解决了
然而,我必须问,为什么呢?你好。发布关于您的代码目前的样子的示例。你在遵循什么样的结构?我想要这种行为,因为每个选项卡在切换时都必须加载当前数据,所以我可以转到选项卡a,更改某些内容,然后转到选项卡B,选项卡a中所做的更改会影响选项卡B。我明白了。很高兴能帮上忙:)哇,我在使用“唯一”键时发现了一个奇怪的行为。如果我尝试打开两个对话框,当打开上下文:Frase:DARType 909(“他的小部件已经卸载”,因此状态不再有上下文(应该被认为已经失效)时,会抛出FututError错误。考虑在“处置”或使用“安装”时取消任何活动的工作。“getter以确定状态是否仍处于活动状态。”)。这仅在CupertinoApp上下文中,而不是在Material App中。如果删除uniquer键,错误将消失。如果不解决此问题,我将无法应用您的解决方案:(我正在考虑向选项卡发送一个流事件,使其自行刷新,我试图避免此解决方案,但我认为我会这样做。这很奇怪。如何打开对话框?能否使用pastebin发布完整代码?