Когда вызывается метод activate() у State в Flutter?

«Когда вызывается метод activate() у State в Flutter?» — вопрос из категории Жизненный цикл, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод activate() вызывается у объекта State, когда соответствующий StatefulWidget повторно вставляется в дерево виджетов после того, как был из него удалён. Это происходит, например, при навигации назад на экран или когда родительский виджет перестраивается, временно убирая и возвращая дочерний виджет.

Типичный сценарий из практики:

class MyDetailsScreen extends StatefulWidget {
  @override
  _MyDetailsScreenState createState() => _MyDetailsScreenState();
}

class _MyDetailsScreenState extends State<MyDetailsScreen> {
  @override
  void initState() {
    super.initState();
    print('initState: Вызывается только при ПЕРВОМ создании.');
  }

  @override
  void activate() {
    super.activate();
    print('activate: Вызывается при каждом повторном показе экрана (например, после Navigator.pop).');
    // Здесь можно обновить данные, если они могли измениться за время отсутствия виджета в дереве
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Details')),
      body: Center(child: Text('Content')),
    );
  }
}

Отличие от initState():

  • initState() — вызывается один раз при создании объекта State.
  • activate() — может вызываться многократно, когда виджет возвращается в дерево. Он всегда вызывается перед build() при такой реактивации.

Зачем это нужно? В activate() можно выполнить действия, которые необходимы при повторном появлении виджета: проверить актуальность данных, возобновить анимации или обновить подписки на стримы.