Це має значення для mixin
s (і через це також для вас )
Це парадигма , в рамках Flutter для виклику методу супер при перевизначенні методів життєвого циклу в State
. Ось чому навіть deactivate
є mustCallSuper
анотація .
Крім того , деякі mixin
очікують, що ви викличете супер методи цих методів життєвого циклу в певний момент функції.
Це означає, що вам слід дотримуватися документації та зателефонувати super.dispose
в кінці свого dispose
методу, оскільки mixin
s State
у рамках очікують, що це так.
Наприклад: TickerProviderStateMixin
і стверджувати в кінці:SingleTickerProviderStateMixin
super.dispose
Перед тим, як зателефонувати на super.dispose (), потрібно видалити усі [..].
Ще один приклад: AutomaticKeepAliveMixin
виконує логіку в initState
і dispose
.
Висновок
Почніть свій initState
зsuper.initState
і закінчити ваш dispose
зsuper.dispose
, якщо ви хочете бути на легкій і безпечної стороні додавання mixin
S до вашого State
.
Крім того, слідкуйте за документацією щодо інших методів життєвого циклу (будь-який метод, який ви перезаписуєте State
), оскільки рамки очікують, що ви викличете супер методи, як описано в документації.
Таким чином, наступне - що ви повинні зробити:
void initState() {
super.initState();
//DO OTHER STUFF
}
Однак це не має особливого значення State
, про що я поясню в наступному, і навіть для комбінацій, це має значення лише для тверджень, судячи з того, що я міг би знайти - так це не вплине на ваше виробництво.
Це не має значення State
Я думаю, що попередні два відповіді від Пабло Баррери та CopsOnRoad вводять в оману, оскільки правда в тому, що це насправді не має значення і не потрібно шукати далеко.
Єдині діями , які super.initState
і super.dispose
приймають в State
класі самі по собі є твердженнями і так assert
-statements оцінюються тільки в режимі налагодження , це не має значення один раз побудувати ваше додаток, тобто в режимі виробництва.
Далі я проводжу вас через те, що робити super.initState
і що super.dispose
робити State
, який є весь код, який буде виконуватися, коли у вас немає додаткових комбінацій.
initState
Давайте розглянемо, який саме код виконується в super.initState
першому ( джерело ):
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
Як бачите, існує лише твердження життєвого циклу, і його мета - забезпечити правильність роботи вашого віджета. Тому поки ви подзвоните super.initState
десь у себе initState
, ви побачите, AssertionError
чи ваш віджет працює не за призначенням. Не має значення, чи вживали ви попередніх дій, оскільки це assert
означає лише повідомити, що щось у вашому коді все одно не так, і ви побачите це, навіть якщо ви зателефонуєте super.initState
в самому кінці свого методу.
dispose
dispose
Метод аналогічний ( джерело ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
Як бачите, він також містить лише твердження, які обробляють перевірку життєвого циклу налагодження . Другий assert
тут приємний трюк, оскільки він гарантує, що _debugLifecycleState
змінено значення лише в режимі налагодження (оскільки- assert
заяви виконуються лише в режимі налагодження).
Це означає, що доки ви зателефонуєте super.dispose
десь у своєму власному методі, ви не втратите жодної цінності без того, щоб міксинг додав додаткову функціональність.