Почему Flutter размещает мой объект состояния виджета в интерфейсе с вкладками? - PullRequest
1 голос
/ 25 апреля 2019

У меня есть интерфейсы Flutter с вкладками, использующие DefaultTabController с 3 страницами, каждый с виджетом с отслеживанием состояния.Кажется, я могу просто переключаться между двумя первыми вкладками, но когда я перехожу на 3-ю страницу, объект состояния для первой страницы удаляется.Последующие обновления состояния (с использованием setState ()) затем завершаются неудачей.

Я переопределил метод dispose () объекта состояния для первой страницы, чтобы он выводил сообщение при утилизации.Он становится доступным, как только я нажимаю на третью вкладку.Я не могу найти документацию о том, почему Flutter располагает объектами состояния.(Много в жизненном цикле, но не причины для прохождения этапов.)

Ничего необычного в настройке вкладок, я не думаю.

 @override
  Widget build(BuildContext context) {
    return new MaterialApp(

      home: DefaultTabController(
        length: 3,
        child: Scaffold(
          appBar: AppBar(
            title: Text(title),
            bottom: TabBar(
              tabs: [
                // Use these 3 icons on the tab bar.
                Tab(icon: Icon(Icons.tune)),
                Tab(icon: Icon(Icons.access_time)),
                Tab(icon: Icon(Icons.settings)),
              ],
            ),
          ),
          body: TabBarView(
            children: [
              // These are the 3 pages relating to to the tabs.
              ToolPage(),
              TimerPage(),
              SettingsPage(),
            ],

Сами страницы довольно просты.Нет анимации.Просто переключатели, ползунки и т. Д. Я думаю о единственных отклонениях, которые я сделал из примеров кода, которые я видел, - это то, что я сделал виджет основного приложения с состоянием, я расширил вкладки для поддержки wantKeepAlive () иЯ перезаписываю wantKeepAlive, чтобы установить для него значение true (хотя это может помочь), и я вызываю setState () на первых двух вкладках внешнего объекта, который Android Studio помечает со слабым предупреждением.Состояние на первых двух страницах обновляется при чтении из веб-сокета, это приложение открывает на удаленном сервере.При дальнейшем тестировании я заметил, что это происходит только при переходе с первой на третью страницу.Переход от первого к второму или от второго к третьему не запускает удаление.

Я ожидаю, что объект State, связанный с StatefulWidget, останется и с wantKeepAlive = true не поймет, почему он удаляется, когда я нажимаюна третью вкладку, особенно потому, что этого не происходит, когда я нажимаю на вторую или со второй на третью.

1 Ответ

0 голосов
/ 25 апреля 2019

Это происходит потому, что TabBarView не всегда показывает все вкладки. Некоторые могут быть за пределами экрана.

В этом случае поведение по умолчанию заключается в том, что Flutter размонтирует эти виджеты для оптимизации ресурсов.

Это поведение можно изменить с помощью того, что Флаттер называет «поддерживать жизнь».

Самый простой способ - использовать AutomaticKeepAliveClientMixin mixin для State подкласса, который находится внутри вашей вкладки, как таковой:

class Foo extends StatefulWidget {
  @override
  _FooState createState() => _FooState();
}

class _FooState extends State<Foo> with AutomaticKeepAliveClientMixin {
  @override
  bool wantKeepAlive = true;

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

Это говорит Флаттеру, что Foo не следует выбрасывать, когда он покидает экран.

...