颤振初始化状态被多次调用

时间:2019-04-08 22:06:01

标签: dart flutter

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

2 个答案:

答案 0 :(得分:0)

Navigator的作用类似于堆栈。它用于推送和弹出“路线”。可见最上面的路线。

这就是您正在做的事情:

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

我的猜测是,由于堆栈中所有As和B的routeName都相同,因此状态得以恢复。

您应该做的是: 完成后弹出B,请再次按A。

whenDone应该如下所示:

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

答案 1 :(得分:0)

好的,所以问题似乎出在我使用flutter_redux插件的方式上。不能完全确定是什么原因造成的,但是我想这只是因为我使用它的方式而迫使呈现重复状态。

长话短说,我将active_tab的{​​{1}}存储在redux状态,而不是我拥有的BottomTab屏幕容器的本地状态。首先我这样做的原因是,我可以将一条路线推到主页上,然后再操纵将其首先渲染为活动状态的选项卡。

我想我将在这里重构并使用类似Fluro的名称,以允许我将参数传递给路由,以便呈现特定的标签。

希望如果有人遇到此问题会有所帮助,请提前道歉,因为不必一定找到其进行重新渲染的根本原因。