Flutter Init State被称为多次

问题描述 投票:0回答:2

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

dart flutter
2个回答
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(); 
}

0
投票

好的,所以问题似乎与我使用flutter_redux插件的方式有关。不完全确定是什么导致它,但我想它只是强迫重复状态被渲染,因为我是如何使用它。

长话短说,我把active_tab存放在redux状态的BottomTab,而不是我所拥有的Home屏幕容器的本地状态。我之所以这样做的原因是我可以将一条路线推到家里,然后还操纵它首先要呈现为活动状态的标签。

我想我会在这里重构和使用类似Fluro的东西,允许我将参数传递给我的路由,以便我可以渲染一个特定的选项卡。

希望如果其他任何人遇到这个问题这有帮助,提前道歉,不一定找到它为什么重做渲染的根本原因。

© www.soinside.com 2019 - 2024. All rights reserved.