Я использую 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