英雄小部件多次将其子小部件初始化

时间:2019-06-21 06:56:44

标签: flutter dart

每当我有一个关于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仅被调用一次,或者有不同的方法仅被调用一次?

1 个答案:

答案 0 :(得分:1)

您无能为力。

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

  1. 原始位置
  2. 覆盖层,在英雄过渡期间
  3. 在新页面中

通常,对于此类问题,您将使用GlobalKey,但与Hero不兼容。

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