每次我离开一个小部件然后回到它时,都会收到对该小部件的initState
方法的“ n + 1”调用。
我的设置与此类似。我从小部件A开始,当识别出对卡的单击时,我们执行Navigator.pushNamed(B.routeName)
以显示该项目的详细信息屏幕。完成一些附加处理后,用户单击B上的“提交”按钮,然后使用Navigator.pushNamed(A.routeName)
返回到a。
class A extends StatefulWidget {
static String routeName = 'aroutename';
A({Key key}) : super(key: key);
_AState createState() => _AState();
}
class _AState extends State<A> {
@override
void initState() {
super.initState();
getSomeDataForScreenA().then((result) => setState(...));
}
whenDone(){
Navigator.of(context).pushNamed(B.routeName);
}
@override
Widget build(BuildContext context) {
return Container(
);
}
}
class B extends StatefulWidget {
B({Key key}) : super(key: key);
_BState createState() => _BState();
}
class _BState extends State<B> {
static String routeName = 'broutename';
@override
void initState() {
super.initState();
getSomeDataForScreenB().then((result) => setState(...));
}
whenDone(){
Navigator.of(context).pushNamed(A.routeName);
}
@override
Widget build(BuildContext context) {
return Container(
);
}
}
我们第一次看到A很好,它只运行一次。然后我们转到B,然后回到A,则两次调用initState()。我们第三次执行此循环,称为3次,等等...
希望有人可以在这里指出我做错了正确的方向。我知道这可能是由于缺乏对Navigator.of(context)
内部工作原理的了解,但是我似乎无法在任何地方找到答案。
答案 0 :(得分:0)
Navigator
的作用类似于堆栈。它用于推送和弹出“路线”。可见最上面的路线。
这就是您正在做的事情:
我的猜测是,由于堆栈中所有As和B的routeName都相同,因此状态得以恢复。
您应该做的是: 完成后弹出B,请再次按A。
whenDone应该如下所示:
whenDone(){
Navigator.of(context).pop();
}
答案 1 :(得分:0)
好的,所以问题似乎出在我使用flutter_redux
插件的方式上。不能完全确定是什么原因造成的,但是我想这只是因为我使用它的方式而迫使呈现重复状态。
长话短说,我将active_tab
的{{1}}存储在redux状态,而不是我拥有的BottomTab
屏幕容器的本地状态。首先我这样做的原因是,我可以将一条路线推到主页上,然后再操纵将其首先渲染为活动状态的选项卡。
我想我将在这里重构并使用类似Fluro的名称,以允许我将参数传递给路由,以便呈现特定的标签。
希望如果有人遇到此问题会有所帮助,请提前道歉,因为不必一定找到其进行重新渲染的根本原因。