Flutter 如何在颤振中设置选项卡栏选项卡之间的状态?

Flutter 如何在颤振中设置选项卡栏选项卡之间的状态?,flutter,Flutter,我已经解决了这个问题,但没有任何成功 我的主页是有状态类,带有两个选项卡的选项卡栏。第一个选项卡包含一些来自全局变量的文本和两个文本字段,这些文本字段也预先填充了全局变量。 第二个选项卡有一个按钮和ontap,它调用setstate来更改变量,这些变量在第一个选项卡上使用,然后对第一个选项卡设置动画。 我的问题是,第一个标签文本不会更改为新值。同时,文本字段将具有新值。若我在第一个选项卡上返回文本之前添加打印命令,代码将打印出新值,但并没有设置文本的状态,同时将设置textfields状态。 目

我已经解决了这个问题,但没有任何成功

我的主页是有状态类,带有两个选项卡的选项卡栏。第一个选项卡包含一些来自全局变量的文本和两个文本字段,这些文本字段也预先填充了全局变量。 第二个选项卡有一个按钮和ontap,它调用setstate来更改变量,这些变量在第一个选项卡上使用,然后对第一个选项卡设置动画。 我的问题是,第一个标签文本不会更改为新值。同时,文本字段将具有新值。若我在第一个选项卡上返回文本之前添加打印命令,代码将打印出新值,但并没有设置文本的状态,同时将设置textfields状态。 目前不可能添加代码,但我希望我对mu问题的描述足够好


谢谢大家!

使用简单的状态管理解决方案。这两个选项卡都可以侦听和修改所需的值。没有代码很难演示。但是您不能简单地从另一个小部件更改一个小部件的状态,使用provider会更容易。

要更新并收听更改,请使用
StreamController
StreamBuilder
。您可以将第一个选项卡与
SingleTickerProviderStateMixin
组合在一个小部件中,以防止其重新加载。我创建了一个简单的应用程序进行演示:

完整示例:
main.dart

导入'dart:async';
导入“dart:math”;
进口“包装:颤振/材料.省道”;
void main(){
runApp(MaterialApp(home:MyApp());
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类_MyAppState使用SingleTickerProviderStateMixin扩展状态{
最终StreamController _StreamController=StreamController();
TabController\u TabController;
@凌驾
void initState(){
_tabController=tabController(长度:2,vsync:this);
super.initState();
}
@凌驾
无效处置(){
_streamController.close();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“示例应用程序”),
),
底部导航栏:选项卡栏(
控制器:\ tab控制器,
labelColor:Colors.red,
选项卡:[选项卡(文本:“选项卡1”)、选项卡(文本:“选项卡2”)],
),
正文:选项卡视图(
控制器:\ tab控制器,
儿童:[
第一个选项卡(_streamController),
容器(
儿童:中心(
孩子:文本按钮(
child:Text('Press me'),
已按下:(){
最后一段文字=
'随机数:'+Random().nextInt(100).toString();
_streamController.add(_someText);
_tabController.animateTo(0);
},
),
),
),
],
),
);
}
}
类FirstTab扩展StatefulWidget{
最终流量控制器_流量控制器;
FirstTab(此._streamController);
@凌驾
_FirstTabState createState()=>\u FirstTabState();
}
类_FirstTabState扩展状态
使用AutomaticEpaLiveClientMixin{
@凌驾
bool get wantKeepAlive=>true;
@凌驾
小部件构建(构建上下文){
super.build(上下文);
返回容器(
儿童:中心(
孩子:StreamBuilder(
initialData:'空文本',
流:小部件。\u streamController.stream,
生成器:(上下文,快照){
返回文本(snapshot.data);
}),
),
);
}
}

我尝试了很多东西,现在我得到了一个奇怪的工作解决方案,可以满足我的需求。 若我只是设置了新的变量,然后让tabcontroller设置dirst页面的动画,页面状态将不会被设置,但若我添加了小的延迟,那个么它就会按照我想要的方式工作。如果有人能解释原因,我真的很感激

onPressed: () {
  setProduct();
  Timer(Duration(milliseconds: 100), animateToFirstPage);

}

欢迎来到堆栈溢出!请拿着这本书读一读。请编辑这篇文章,把你自己的努力包括在解决这个问题上。后者最好是在代码中,这称为。