gpt4 book ai didi

flutter - 英雄小部件多次初始化子小部件

转载 作者:IT王子 更新时间:2023-10-29 07:18:03 24 4
gpt4 key购买 nike

无论何时,我都有一个关于 StatefulWidgetHero 小部件,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 会被打印三次(弹出路由时打印两次)。
as a gist on GitHub 的完全可重现示例.
如果我更改 Page 的构建方法,看起来像这样(删除 Hero 小部件):

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

现在,_HeroContentState.initState 只被调用一次,这是应该的。

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

最佳答案

对此你无能为力。

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

  1. 原始位置
  2. 在 Hero 转换期间在 Overlay 内
  3. 在新页面

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

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

关于flutter - 英雄小部件多次初始化子小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56698362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com