每次我离开一个小部件,然后回到它,我得到一个“n + 1”调用该小部件的initState
方法。
我的设置与此类似。我从小部件A开始,当识别出卡片上的点击时,我们执行Navigator.pushNamed(B.routeName)
以显示该项目的详细信息屏幕。完成一些额外的处理后,用户单击B上的“提交”按钮,然后返回到Navigator.pushNamed(A.routeName)
。
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)
内部工作的理解,但我似乎无法在任何地方找到答案。
Navigator
像堆栈一样工作。它用于推送和弹出“路线”。最顶层的路线是可见的。
这就是你在做什么:
我的猜测是,因为堆栈中所有As和B的routeName是相同的状态被恢复。
你应该做的是:完成时弹出B而不是再次按A.
whenDone应该是这样的:
whenDone(){
Navigator.of(context).pop();
}
好的,所以问题似乎与我使用flutter_redux
插件的方式有关。不完全确定是什么导致它,但我想它只是强迫重复状态被渲染,因为我是如何使用它。
长话短说,我把active_tab
存放在redux状态的BottomTab
,而不是我所拥有的Home
屏幕容器的本地状态。我之所以这样做的原因是我可以将一条路线推到家里,然后还操纵它首先要呈现为活动状态的标签。
我想我会在这里重构和使用类似Fluro的东西,允许我将参数传递给我的路由,以便我可以渲染一个特定的选项卡。
希望如果其他任何人遇到这个问题这有帮助,提前道歉,不一定找到它为什么重做渲染的根本原因。