Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 防止Cupertino标签在切换标签时保持状态_Flutter_Tabs_Flutter Layout_Flutter Cupertino - Fatal编程技术网

Flutter 防止Cupertino标签在切换标签时保持状态

Flutter 防止Cupertino标签在切换标签时保持状态,flutter,tabs,flutter-layout,flutter-cupertino,Flutter,Tabs,Flutter Layout,Flutter Cupertino,材质的Scaffold&BottomNavigationBar的默认实现是在每次选项卡更改中销毁并重新创建每个选项卡 在CupertinoTabScaffold、CupertinoTabView和CupertinoPageScaffold的情况下,行为是不同的:每个选项卡的状态都保持不变,因此在选项卡之间切换不会在每次更改中重新触发选项卡的initState()方法 我的问题是:如何修改此行为,使其与材质相同?我希望销毁并重新创建每个选项卡,从而在每个选项卡更改中调用initState()方法,

材质的Scaffold&BottomNavigationBar的默认实现是在每次选项卡更改中销毁并重新创建每个选项卡

在CupertinoTabScaffold、CupertinoTabView和CupertinoPageScaffold的情况下,行为是不同的:每个选项卡的状态都保持不变,因此在选项卡之间切换不会在每次更改中重新触发选项卡的initState()方法

我的问题是:如何修改此行为,使其与材质相同?我希望销毁并重新创建每个选项卡,从而在每个选项卡更改中调用initState()方法,与Material小部件相同


谢谢。

我想说这是一种黑客行为,但真正让元素重建的一种方法是只使用新元素

但是很明显,您需要呈现相同的小部件类,那么它怎么可能是新的呢

颤振检查小部件的
类型
,以及它的
(如果提供),以验证小部件是否相同,以便重建

你可以这样使用钥匙。考虑这个简单的例子。

@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发布完整代码?