Ответ
Метод 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() можно выполнить действия, которые необходимы при повторном появлении виджета: проверить актуальность данных, возобновить анимации или обновить подписки на стримы.