首页 > 解决方案 > 英雄小部件多次初始化子小部件

问题描述

每当我有一个Hero关于 a 的小部件时,当导航到该页面时StatefulWidget,该State.initState方法被调用三次而不是一次。
这显然只发生在另一个页面也具有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_HeroContentState.initState都会打印三次(弹出路线时打印两次)。作为 GitHub 上的要点
的完全可重现的示例。 如果我将 , 的构建方法更改为如下所示(删除小部件):
PageHero

@override
Widget build(BuildContext context) => Scaffold(body: HeroContent());

现在,它应该_HeroContentState.initState只被调用一次。

如何避免Hero插入我的小部件三次?如何确保initState仅调用一次或使用仅调用一次的不同方法?

标签: flutterdart

解决方案


你对此无能为力。

工作方式Hero是它通过 3 个步骤移动到小部件树中的不同位置:

  1. 原来的位置
  2. 在 Overlay 内部,在 Hero 过渡期间
  3. 在新页面中

通常,对于此类问题,您会使用 a GlobalKey,但这与Hero.

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


推荐阅读