每当我有一个关于Hero
的{{1}}小部件时,State.initState
方法被称为 3 次,而不是导航到该页面时的一次。 br />
显然,只有在其他页面也有带有相同标签的StatefulWidget
时,这种情况才会发生。
Hero
每当我导航到class Page extends StatelessWidget {
const Page({Key key}) : super(key: key);
@override
Widget build(BuildContext context) => Scaffold(body: Hero(tag: 'tag', child: HeroContent()));
}
class HeroContent extends StatefulWidget {
HeroContent({Key key}) : super(key: key);
@override
createState() => _HeroContentState();
}
class _HeroContentState extends State<HeroContent> {
@override
void initState() {
print('_HeroContentState.initState'); // printed three times with `Hero` widget and once without
super.initState();
}
@override
Widget build(BuildContext context) => Container();
}
时,Page
都会被打印3次(弹出路线时两次)。
此as a gist on GitHub的完全可复制的示例。
如果我更改了_HeroContentState.initState
的构建方法,则看起来像这样(删除了Page
小部件):
Hero
现在,@override
Widget build(BuildContext context) => Scaffold(body: HeroContent());
仅应被称为一次。
如何避免_HeroContentState.initState
三次插入窗口小部件?如何确保Hero
仅被调用一次,或者有不同的方法仅被调用一次?
答案 0 :(得分:1)
您无能为力。
Hero
的工作方式是分3个步骤在小部件树中的不同位置移动:
通常,对于此类问题,您将使用GlobalKey
,但与Hero
不兼容。
因此,最好重构代码以使initState
无关紧要。