flutter - 英雄小部件多次初始化子小部件
问题描述
每当我有一个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 上的要点
的完全可重现的示例。
如果我将 , 的构建方法更改为如下所示(删除小部件):Page
Hero
@override
Widget build(BuildContext context) => Scaffold(body: HeroContent());
现在,它应该_HeroContentState.initState
只被调用一次。
如何避免Hero
插入我的小部件三次?如何确保initState
仅调用一次或使用仅调用一次的不同方法?
解决方案
你对此无能为力。
工作方式Hero
是它通过 3 个步骤移动到小部件树中的不同位置:
- 原来的位置
- 在 Overlay 内部,在 Hero 过渡期间
- 在新页面中
通常,对于此类问题,您会使用 a GlobalKey
,但这与Hero
.
因此,最好重构您的代码以使其initState
无关紧要。
推荐阅读
- oracle - 如何在 Cognos Oracle 查询的字符串列中搜索多个值
- python - python多少步才能归零
- node.js - AWS Elasticbeanstalk Nodejs 应用程序部署错误
- cheerio - 使用cheeriojs 按原样输出特定标签
- django - Django ListView 通过模型关系
- nginx - Http2 hpack 头表大小
- python - python beautifulsoup获取列表中列表的文本
- javascript - 计算第 n 个斐波那契数的函数
- reactjs - 如何将 Redux 工具包与 RTK Query 集成
- r - 如何每小时更新一次表格或当用户按下刷新按钮时?