Це має значення для mixins (і через це також для вас )
Це парадигма , в рамках Flutter для виклику методу супер при перевизначенні методів життєвого циклу в State. Ось чому навіть deactivateє mustCallSuperанотація .
Крім того , деякі mixinочікують, що ви викличете супер методи цих методів життєвого циклу в певний момент функції.
Це означає, що вам слід дотримуватися документації та зателефонувати super.dispose в кінці свого disposeметоду, оскільки mixins Stateу рамках очікують, що це так.
Наприклад: TickerProviderStateMixinі стверджувати в кінці:SingleTickerProviderStateMixin super.dispose
Перед тим, як зателефонувати на super.dispose (), потрібно видалити усі [..].
Ще один приклад: AutomaticKeepAliveMixinвиконує логіку в initStateі dispose.
Висновок
Почніть свій initStateзsuper.initState і закінчити ваш disposeзsuper.dispose , якщо ви хочете бути на легкій і безпечної стороні додавання mixinS до вашого 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 десь у своєму власному методі, ви не втратите жодної цінності без того, щоб міксинг додав додаткову функціональність.