首页 > 解决方案 > 为什么在 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 稳定版

标签: flutterdart

解决方案


你误会了。您自己的构建函数不会initState 之前被调用。

但是您的小部件需要一个完全构建的子组件和一个 init 函数。

这要求首先构建孩子以作为参数传递。

这就是你所看到的。


推荐阅读