flutter - 为什么在 initState() 之前调用 Statefull 小部件的 build() 函数?
问题描述
我创建了一个包装器来使用无状态小部件调用 init():
class StatefulWrapper extends StatefulWidget {
StatefulWrapper({this.child, this.init});
final Widget child;
final void Function() init;
@override
_StatefulWrapperState createState() => _StatefulWrapperState();
}
class _StatefulWrapperState extends State<StatefulWrapper> {
@override
void initState() {
if (widget.init != null) widget.init();
super.initState();
}
@override
Widget build(BuildContext context) => widget.child ?? SizedBox();
}
这是一个使用它的简单示例:
class SomeView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StatefulWrapper(
init: () => print('---------- step 1'),
child: Scaffold(
body: generateWidget(),
),
);
}
}
Widget generateWidget() {
print('---------- step 2');
return Container(width: 50, height: 50);
}
输出:
I/flutter ( 2810): ---------- step 2
I/flutter ( 2810): ---------- step 1
为什么 step2 在 step1 之前打印?
Flutter 1.22.2 稳定版
解决方案
你误会了。您自己的构建函数不会在initState 之前被调用。
但是您的小部件需要一个完全构建的子组件和一个 init 函数。
这要求首先构建孩子以作为参数传递。
这就是你所看到的。
推荐阅读
- php - Laravel 中的 required_if 验证
- javascript - 使用 javascript 创建 xls 文件,下载不支持的格式
- php - 变量存在且为真时的刀片条件渲染
- python - django.db.utils.ProgrammingError:关系“ogs_features_product”的列“价格”不存在
- c# - c# camt54 (iso 20022) 中的日期时间反序列化问题
- c++ - 创建 4GB std::string 时出现错误分配错误
- spring-boot - 在 Pipeline 中使用 docker 进行基于 Spring Boot 环境的配置
- couchbase - Couchbase:MetaData.Metrics 总是包含默认值?
- docker - 合并具有公共基础的 docker 图像
- spring-boot - yaml 配置不允许某些字符 - 无效标签