Flutter 英雄小部件多次初始化子小部件

Flutter 英雄小部件多次初始化子小部件,flutter,dart,Flutter,Dart,每当我有一个关于StatefulWidget的Hero小部件时,该方法被调用三次,而不是在导航到该页面时调用一次。 显然,只有当另一个页面也有一个具有相同标记的英雄时,才会发生这种情况 类页面扩展了无状态小部件{ 常量页({Key}):超级(Key:Key); @凌驾 小部件构建(BuildContext上下文)=>Scaffold(body:Hero(tag:'tag',child:HeroContent()); } 类HeroContent扩展StatefulWidget{ HeroCont

每当我有一个关于
StatefulWidget
Hero
小部件时,该方法被调用三次,而不是在导航到该页面时调用一次。
显然,只有当另一个页面也有一个具有相同标记的
英雄时,才会发生这种情况

类页面扩展了无状态小部件{
常量页({Key}):超级(Key:Key);
@凌驾
小部件构建(BuildContext上下文)=>Scaffold(body:Hero(tag:'tag',child:HeroContent());
}
类HeroContent扩展StatefulWidget{
HeroContent({Key}):超级(Key:Key);
@凌驾
createState()=>\u HeroContentState();
}
类ContentState扩展了状态{
@凌驾
void initState(){
打印(“\u HeroContentState.initState”);//使用“Hero”小部件打印三次,一次不使用
super.initState();
}
@凌驾
小部件构建(BuildContext上下文)=>Container();
}
每当我导航到
页面
\u HeroContentState.initState
都会打印三次(弹出路由时打印两次)。
完全可复制的示例。
如果我将
页面
的构建方法更改为如下所示(删除
英雄
小部件):

@覆盖
小部件构建(BuildContext上下文)=>Scaffold(body:HeroContent());
现在,
\u HeroContentState.initState
只被调用一次


如何避免将小部件插入三次?如何确保只调用一次
initState
,或者使用只调用一次的不同方法?

对此您无能为力

Hero
的工作方式是,它分3步在小部件树中的不同位置移动:

  • 原址
  • 内部覆盖,在英雄过渡期间
  • 在新页面中
  • 通常,对于此类问题,您会使用
    GlobalKey
    ,但这与
    Hero
    不兼容


    因此,最好重构代码,使
    initState
    无关紧要。

    我尝试使用
    Hero
    运行,但它只调用了一次,而不是三次。我使用了
    页面
    作为
    主页
    MaterialApp
    @CopsOnRoad中。那么,你需要使用
    英雄
    。。创建另一个具有相同英雄的页面,然后从该页面导航到
    页面
    。好的,我以为您发布了完整的代码。@CopsOnRoad仅为您创建了一个要点:感谢您的洞察力。我通过将一个值作为参数传递解决了这个问题,该参数在第一次
    initState
    调用时将只等于另一个参数。这样我就可以区分第一个调用和其他两个调用。@CreativeCreatorMorMaybeno这种方法对您仍然有效吗?你能分享你的代码吗?谢谢