#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 .
Но ваш виджет использует полностью построенный дочерний элемент и функцию инициализации.
Для этого требуется, чтобы дочерний элемент был создан первым, чтобы быть переданным в качестве параметра.
Это то, что вы видите.