Flutter: запустить метод сборки виджета
Я хотел бы иметь возможность запускать функции после завершения сборки/загрузки виджета, но я не уверен, как. Мой текущий вариант использования - проверить, прошел ли пользователь аутентификацию, и если нет, перенаправить в представление входа в систему. Я не хочу проверять ранее и выдвигать либо вид входа в систему, либо основной вид, это должно произойти после загрузки основного вида. Есть ли что-нибудь, что я могу использовать для этого?
Ответы
Ответ 1
Вы можете использовать
https://github.com/slightfoot/flutter_after_layout
который выполняет функцию только один раз после завершения компоновки. Или просто посмотрите на его реализацию и добавьте его в свой код :-)
Что в основном
void initState() {
super.initState();
WidgetsBinding.instance
.addPostFrameCallback((_) => yourFunction(context));
}
Ответ 2
ОБНОВЛЕНИЕ: Флаттерv1.8.4
Оба упомянутых кода работают сейчас:
Working:
WidgetsBinding.instance
.addPostFrameCallback((_) => yourFunction(context));
Работа
import 'package:flutter/scheduler.dart';
SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
Ответ 3
Флаттер 1,2 - дротик 2,2
В соответствии с официальными правилами и источниками, если вы хотите быть уверены, что также последний кадр вашего макета был нарисован, вы можете написать, например:
import 'package:flutter/scheduler.dart';
void initState() {
super.initState();
if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.persistentCallbacks) {
SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
}
}
Ответ 4
Если вы ищете ReactNative componentDidMount
эквивалент, Flutter есть. Это не так просто, но работает точно так же. В Flutter Widget
не обрабатывает свои события напрямую. Вместо этого они используют объект State
для этого.
class MyWidget extends StatefulWidget{
@override
State<StatefulWidget> createState() => MyState(this);
Widget build(BuildContext context){...} //build layout here
void onLoad(BuildContext context){...} //callback when layout build done
}
class MyState extends State<MyWidget>{
MyWidget widget;
MyState(this.widget);
@override
Widget build(BuildContext context) => widget.build(context);
@override
void initState() => widget.onLoad(context);
}
State.initState
сразу же будет вызван, когда экран закончит рендеринг макета. И никогда больше не будет вызываться даже при горячей перезагрузке, если вы находитесь в режиме отладки, пока явно не достигнет этого времени.