为什么要在initState()之前调用Statefull小部件的build()函数?

时间:2020-10-26 11:12:29

标签: flutter dart

我创建了一个包装器,以使用无状态小部件调用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

为什么在步骤1之前打印步骤2?

Flutter 1.22.2稳定

1 个答案:

答案 0 :(得分:0)

您误会了。您的 own 构建函数不会不会在initState之前被调用。

但是您的小部件需要一个完整的子代和一个init函数。

这需要先构建 child ,然后才能将其作为参数传递。

这就是你所看到的。