Почему функция build() виджета с полным состоянием вызывается перед initState()?

#flutter #dart

#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
  

Почему step2 печатается перед step1?

Flutter 1.22.2 стабильный

Ответ №1:

Вы ошибаетесь. Ваша собственная функция сборки не вызывается перед initState .

Но ваш виджет использует полностью построенный дочерний элемент и функцию инициализации.

Для этого требуется, чтобы дочерний элемент был создан первым, чтобы быть переданным в качестве параметра.

Это то, что вы видите.