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这种方法对您仍然有效吗?你能分享你的代码吗?谢谢