Flutter DefaultTabController неожиданно инициализирует виджет во время анимации при переходе от вкладки 0 к вкладке 2 - PullRequest
1 голос
/ 08 апреля 2019

Я использую DefaultTabController для управления 3 вкладками. Контроллер вкладок по умолчанию настроен так:

DefaultTabController(
        length: 3,
        initialIndex: 1,
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Material(
              type: MaterialType.canvas,
              elevation: 1.0,
              child: Container(
                color: Color(0xFFe3f2fd),
                child: TabBar(tabs: [Tab(text: 'ACTIVITY'), Tab(text: 'LEADERBOARD',) ,Tab(text: 'SETTINGS',)
                  ],
                  labelColor: Theme.of(context).primaryColor,
                  indicatorColor: Theme.of(context).primaryColor,
                  labelPadding: EdgeInsets.all(0.0),
                  labelStyle: TextStyle(fontWeight: FontWeight.bold, fontFamily: 'Montserrat'),
                  indicatorPadding: EdgeInsets.symmetric(horizontal: 20.0),
                ),
              ),
            ),
            Expanded(
              child: Container(
                child: TabBarView(
                    children: [
                      ActivityTab(),
                      LeaderBoardTab(),
                      SettingsTab(rebuildLeaderBoard: refreshLeaderBoard,),
                    ]),
              ),
            )
          ],
        ),
      );

У меня возникают ошибки setState при переходе с вкладки 0 на 2 или с 2 на 0. В ходе тестирования я обнаружил два неожиданных поведения:

1) При переходе от ActivityTab () к SettingsTab () (т. Е. От 0 до 2) LeaderboardTab () инициализируется, а затем удаляется. Это вызывает ошибку setState.

2) Во время той же навигации я обнаружил, что при выходе из вкладки первое, что происходит, - это то, что вкладка, которую я покидаю, инициализируется, вызывая другую ошибку setState.

Эта странная функциональность не возникает при перемещении только 1 вкладки влево или вправо. Это происходит только при перемещении на две вкладки. Здесь я нашел некоторые подсказки: https://github.com/flutter/flutter/issues/13848, но, похоже, в этом обсуждении рассматривается проблема поведения с касанием и постукиванием, с которой я не сталкиваюсь.

Я перестроил только этот сегмент проекта в новый проект, поместил операторы печати в initState и утилизировал. Вот что выдается при переходе от вкладки 0 к вкладке 2.

flutter: INIT TAB ZERO
flutter: DISPOSE TAB ZERO
flutter: INIT TAB TWO
flutter: INIT TAB ONE
flutter: DISPOSE TAB ZERO
flutter: DISPOSE TAB ONE
...