Как сохранить состояние виджетов с помощью BottomNavigationBar во Flutter?
У меня есть BottomNavigationBar
в частности, BubbleBottomBar. Я вложил MaterialApp
с, чтобы дать новый Navigator
к внутренним виджетам. Однако, когда я переключаю вкладки, каждый виджет в нижней панели навигации перестраивается. Это не хорошо для меня, так как я хочу держать виджеты в том же состоянии. Как бы я этого достиг?
2 ответа
Вы можете использовать AutomaticKeepAliveClientMixin для принудительного удаления содержимого нижней панели. Но чтобы эта вещь работала, вам, возможно, придется BottomNavigationBar
внутри Stateful Widget
,
Я думаю, что этот вопрос может иметь подробный ответ, который вы ищете.
Пример:
class CustomBottomBar extends StatefulWidget {
@override
_CustomBottomBarState createState() => _CustomBottomBarState();
}
class _CustomBottomBarState extends State<CustomBottomBar> with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
return BubbleBottomBar(
/*Your bottom bar code goes here*/
);
}
// Setting it true will force the bottom bar to never be disposed. This could be dangerous.
@override
bool get wantKeepAlive => true;
}
Я думаю, что вы можете легко решить эту проблему с помощью CupertinoTabScaffold
&CuppertinoTabBar
&CupertinoTabView
у него есть эта особенность.
прочитайте больше о там, если вам нужно: Виджеты Купертино
официальный пример: навигация Купертино и TabBar
это мой код, он работает так, как вы хотите, чтобы он работал (не перестраивая при смене вкладок), вы можете преобразовать его в свой:
import 'package:flutter/cupertino.dart';
CupertinoTabScaffold(
tabBar: CupertinoTabBar(items: [
BottomNavigationBarItem(
icon: Icon(Icons.explore), title: Text('Explore')),
BottomNavigationBarItem(
icon: Icon(Icons.card_travel), title: Text('Adventure')),
BottomNavigationBarItem(
icon: Icon(Icons.search), title: Text('Search')),
BottomNavigationBarItem(
icon: Icon(Icons.collections_bookmark),
title: Text('Bookmarks')),
BottomNavigationBarItem(
icon: Icon(Icons.person), title: Text('Profile')),
]),
tabBuilder: (context, index) {
return CupertinoTabView(
builder: (context) {
switch (index) {
case 0:
return ExplorePage();
break;
case 1:
return AdventurePage();
break;
case 2:
return SearchTourPage();
break;
case 3:
return Text('Bookmark Page');
break;
case 4:
return ProfilePage();
break;
default:
return SearchTourPage();
}
},
);
})