Dart 多次调用颤振初始状态

Dart 多次调用颤振初始状态,dart,flutter,Dart,Flutter,每次我离开一个小部件,然后再回到它,我都会得到一个对该小部件的initState方法的“n+1”调用 我的设置与此类似。我从小部件A开始,当识别卡上的点击时,我们执行Navigator.pushNamed(B.routeName)来显示该项目的详细信息屏幕。一旦完成了一些额外的处理,用户单击B上的“提交”按钮,并返回到a,带有Navigator.pushNamed(a.routeName) A类扩展了StatefulWidget{ 静态字符串routeName='aroutename'; A({

每次我离开一个小部件,然后再回到它,我都会得到一个对该小部件的
initState
方法的“n+1”调用

我的设置与此类似。我从小部件A开始,当识别卡上的点击时,我们执行
Navigator.pushNamed(B.routeName)
来显示该项目的详细信息屏幕。一旦完成了一些额外的处理,用户单击B上的“提交”按钮,并返回到a,带有
Navigator.pushNamed(a.routeName)

A类扩展了StatefulWidget{
静态字符串routeName='aroutename';
A({Key}):超级(Key:Key);
_AState createState()=>_AState();
}
类_AState扩展状态{
@凌驾
void initState(){
super.initState();
getSomeDataForScreenA()。然后((结果)=>setState(…);
}
whenDone(){
Navigator.of(context.pushNamed)(B.routeName);
}
@凌驾
小部件构建(构建上下文){
返回容器(
);
}
}
类扩展了StatefulWidget{
B({Key}):超级(Key:Key);
_BState createState()=>BState();
}
类_BState扩展状态{
静态字符串routeName='broutename';
@凌驾
void initState(){
super.initState();
getSomeDataForScreenB()。然后((结果)=>setState(…);
}
whenDone(){
Navigator.of(context.pushNamed)(A.routeName);
}
@凌驾
小部件构建(构建上下文){
返回容器(
);
}
}
我们第一次看到A,没关系,它只运行一次。然后我们转到B,一旦我们返回A,initState()将被调用两次。我们第三次做这个循环,叫做3次,等等


希望有人能给我指出我做错了什么。我知道这可能是由于对(上下文)内部工作方式的
Navigator.缺乏了解,但我似乎在任何地方都找不到答案。

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

这就是你正在做的:

  • 路由A被添加到导航器堆栈中。堆栈:[A]
  • 路由B被添加到导航器堆栈中。堆栈:[A,B]
  • 路由A被添加到导航器堆栈中。堆栈:[A、B、A]
  • 我的猜测是,因为堆栈中所有As和Bs的routeName都是相同的,所以状态被恢复

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

    当一个人看起来像这样时:

    whenDone(){
    Navigator.of(context.pop();
    }
    
    好的,问题似乎出在我使用
    flatter\u redux
    插件的方式上。不完全确定是什么原因造成的,但我可以想象,这只是因为我如何使用它而强制呈现一个重复的状态

    长话短说,我是在redux状态下为
    BottomTab
    存储
    active_选项卡,而不是我拥有的
    Home
    屏幕容器的本地状态。首先,我这样做的原因是,我可以将一条路由推到主路径上,然后还可以操作它将首先渲染为活动的选项卡

    我想我只需要重构并使用类似于这里的东西来允许我将参数传递给我的路由,这样我就可以呈现一个特定的选项卡


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

    完成后,为什么不使用Navigator pop?如果这能解决您的问题,请告诉我。如果没有,那么让我知道你有什么问题。所以我可以这样做,但我之所以选择“推送”路线,是因为我希望重新运行init state(不是两次,而是在重新初始化时再次运行)这样应用程序就可以检索可能在屏幕B上更新的最新版本。我意识到这在网络请求方面有点浪费,但是,它大大简化了确保本地状态与服务器端状态匹配的逻辑。我目前正在使用VSCode单步调试程序来尝试确定(n+1)initState发生的原因。我将保持此线程的更新,以防我发现它为每个推送的路由提供“key:UniqueKey”,这可能会解决问题。这是一个重复状态的问题。
    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(
    
        );
      }
    }