【问题标题】:Flutter Init State Called Multiple Times多次调用 Flutter Initstate
【发布时间】:2019-08-30 03:12:55
【问题描述】:

每次我离开一个小部件,然后返回到它时,我都会收到对该小部件的 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 pop?

标签: dart flutter


【解决方案1】:

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

这就是你正在做的:

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

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

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

whenDone 应该如下所示:

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

【讨论】:

  • 如果这能解决您的问题,请告诉我。如果没有,请告诉我您遇到了什么问题。
  • 所以我可以这样做,但我选择“推送”路线的原因是我希望再次运行 init 状态(不是两次,而是在重新初始化时再次运行一次),以便应用程序可以检索屏幕 B 上可能更新的最新版本。
  • 我意识到这在网络请求方面有点浪费,但是,它大大简化了确保本地事物状态与服务器端事物状态匹配的逻辑。
  • 我目前正在使用 VSCode 逐步调试器来尝试确定 initState 发生 (n + 1) 的原因。如果我能找到它,我会保持更新这个帖子
  • @KeithDC popUntil 是我所做的
【解决方案2】:

好的,所以问题似乎与我使用flutter_redux 插件的方式有关。不完全确定是什么原因造成的,但我想它只是因为我使用它的方式而强制呈现重复状态。

长话短说,我将BottomTabactive_tab 存储在redux 状态,而不是我拥有的Home 屏幕容器的本地状态。我首先这样做的原因是我可以将路线推送到主页,然后还可以操作它将首先呈现为活动的选项卡。

我想我会在这里重构并使用Fluro 之类的东西来允许我将参数传递给我的路由,以便我可以呈现特定的选项卡。

希望如果其他人遇到这个问题,这会有所帮助,提前道歉不一定找到重新渲染的根本原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 2021-08-13
    • 2021-11-14
    • 2022-10-25
    • 2021-03-05
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    相关资源
    最近更新 更多