gpt4 book ai didi

dart - 多次调用 Flutter Initstate

转载 作者:IT王子 更新时间:2023-10-29 06:45:21 28 4
gpt4 key购买 nike

每次我离开一个小部件然后返回到它时,我都会收到对该小部件的 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) 内部工作原理的理解,但我似乎无法在任何地方找到答案。

最佳答案

Navigator 像堆栈一样工作。它用于推送和弹出“路由”。最上面的路线是可见的。

这就是你正在做的:

  1. 路线 A 被添加到导航器堆栈中。堆栈:[A]
  2. 路线 B ​​被添加到导航器堆栈中。堆栈:[A,B]
  3. 路线 A 被添加到导航器堆栈中。堆栈:[A,B,A]...

我的猜测是因为堆栈中所有 A 和 B 的 routeName 都相同,所以状态已恢复。

你应该做的是:完成后弹出 B,而不是再次按下 A。

whenDone 应该是这样的:

whenDone(){
Navigator.of(context).pop();
}

关于dart - 多次调用 Flutter Initstate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55582425/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com