Какие методы жизненного цикла приложения во Flutter используются для отслеживания сворачивания и разворачивания
Что проверяют
Отличаете ли вы жизненный цикл приложения от жизненного цикла виджета и знаете ли, как состояния Flutter ложатся на Android. Следом обычно спрашивают, где сохранять данные, если пользователь смахнёт приложение из списка недавних.
Как отвечать
Состояние приложения описывает AppLifecycleState, у него пять значений:
resumed: приложение на экране и принимает ввод;inactive: видно, но без фокуса. На Android это шторка уведомлений, системный диалог разрешения, разделённый экран или картинка в картинке;hidden: окна скрыты. На мобильных платформах Flutter синтезирует это состояние междуinactiveиpaused;paused: приложение в фоне и не рисует кадры, примерно соответствуетonStop()активности;detached: движок работает без привязанного экрана.
При сворачивании цепочка такая: resumed, inactive, hidden, paused. При возврате она идёт в обратном порядке.
Подписаться можно двумя способами. Классический: подмешать WidgetsBindingObserver в State, зарегистрироваться через WidgetsBinding.instance.addObserver(this) в initState(), отписаться в dispose() и обрабатывать didChangeAppLifecycleState(state). Современный, с Flutter 3.13: AppLifecycleListener с отдельными колбэками onHide, onShow, onPause, onResume, onStateChange, его тоже освобождают через dispose(). Текущее состояние в любой момент лежит в WidgetsBinding.instance.lifecycleState.
Где спотыкаются
Называют initState() и dispose() методами жизненного цикла приложения. Это жизненный цикл виджета, в них только подписываются и отписываются.
Ставят паузу видео или событие аналитики «ушёл из приложения» на inactive. Оно приходит и при открытой шторке или диалоге разрешения, хотя пользователь никуда не уходил.
Сохраняют данные в detached. При смахивании из недавних Android просто завершает процесс, и до этого состояния дело может не дойти, поэтому сохранять нужно на paused или раньше.