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