Сохранять состояние StatefulWidget между перестроениями

Корневой виджет маршрута приложения

@override
  Widget build(BuildContext context) {
    return SafeArea(
      child: MyStatefulWidget(),
    );
  }

Во внутреннем виджете с отслеживанием состояния у меня есть текстовое поле с управлением фокусом. FocusNode удаляется в обратном вызове dispose (). И, наконец, если клавиатура открыта - весь экран перестраивается, и мой виджет с отслеживанием состояния также полностью перестраивается вместе с состоянием. Вызывается Dispose, и клавиатура исчезает из-за удаления узла фокуса.

Мой вывод - все контроллеры должны быть предоставлены из корневого виджета маршрута, потому что только корневой виджет живет все время без воссоздания. Это очень странно и неудобно - у меня не может быть самоуправляемых виджетов и я должен предоставлять все элементы управления извне? Если это правда, то как работают анимации, текстовые поля и другие виджеты? Это означает, что каждое перестроение вызывает воссоздание состояния и все анимации и т. Д. Останавливаются при перестроении? .. Или есть способ сохранить состояние между воссозданием виджета? Сохранять состояние и восстанавливать (например, Android) между перерывами?


person Nickolay Savchenko    schedule 16.11.2020    source источник
comment
Этот вопрос следует улучшить, чтобы он был полезен другим. В частности, больше внимания и минимально воспроизводимый пример. Члены сообщества, пожалуйста, используйте отметку / закрытие голосов, чтобы улучшить этот вопрос.   -  person Alex.F    schedule 16.11.2020
comment
Смысл государства - выжить после перестройки. Не могли бы вы опубликовать код и рассказать, что вы делаете, что происходит и чего вы ожидаете вместо этого?   -  person nvoigt    schedule 16.11.2020
comment
Я не понимаю, насколько это необычное поведение. Разве вы не устанавливаете focusNode в методе initState ()?   -  person Joy Terence    schedule 16.11.2020
comment
Хм. В другом месте моего проекта тот же код работает нормально - dispose not called между воссозданиями виджетов. Одно отличие в том, что проблемный виджет размещен внутри вкладки. Таким образом, это может вызвать другое поведение, и виджет всегда отключается при отдыхе ...   -  person Nickolay Savchenko    schedule 16.11.2020
comment
@ Alex.F вкратце: простой StatefulWidget размещает на каждой сборке своего родителя. Родитель помещен в TabBarView - возможно, это важно. Я не могу найти документы о жизненном цикле состояния. Когда и почему флаттер решает избавиться или сохранить состояние.   -  person Nickolay Savchenko    schedule 16.11.2020


Ответы (2)


Пожалуйста, попробуйте использовать AutomaticKeepAliveClientMixin миксин, этот миксин перестроен из старого виджета.

Подробный визит: https://medium.com/@diegoveloper/flutter-persistent-tab-bars-a26220d322bc

person Wisnu Saputra    schedule 16.11.2020
comment
Спасибо, но проблема была в другом месте - у моего Scaffold есть GlobalKey, который был создан в StatefulWidget вместо State, - person Nickolay Savchenko; 16.11.2020

Я обнаружил свою проблему: у Scaffold есть GlobalKey, который создается в StatefulWidget вместо State. И все дерево со состояниями воссоздавалось при каждой перестройке :)

person Nickolay Savchenko    schedule 16.11.2020