在使用BottomNavigationBar组件进行页面切换时,页面切走时组件会销毁,再切回来时又会重新创建,如何保持页面切走不销毁组件呢(缓存状态)?
有以下两种方法:
1、使用IndexedStack组件缓存页面
IndexedStack组件会把组件一次性先创建好,堆叠窗口,通过index切换显示对应的窗口
List<Widget> _MainList = [HomePage(), KnowledgePage(), MenstrualCalendarPage(), UserPage()];
int currentIndex = 0;
body: IndexedStack(
index: currentIndex,
children: _MainList,
),
2、使用PageView组件,组件混入AutomaticKeepAliveClientMixin配合使用**(推荐使用)**
List<Widget> _MainList = [HomePage(), KnowledgePage(), MenstrualCalendarPage(), UserPage()];
int currentIndex = 0;
late PageController _pageController;
@override
void initState() {
super.initState();
this._pageController = PageController(initialPage: this.currentIndex, keepPage: true);
}
@override
void dispose() {
_pageController.dispose();
super.dispose();
}
Scaffold(
body: PageView(
physics: NeverScrollableScrollPhysics(), // 禁止左右滑动切换页面
controller: _pageController,
children: _MainList,
),
bottomNavigationBar: BottomNavigationBar(
onTap: (int index) {
setState(() {
this.currentIndex = index;
_pageController.jumpToPage(index);
});
},
);
);
然后在需要缓存的组件里混入AutomaticKeepAliveClientMixin
class _MenstrualCalendarPageState extends State<MenstrualCalendarPage> with AutomaticKeepAliveClientMixin {
@override
void initState() {
super.initState();
print('创建分类页面');
}
@override
Widget build(BuildContext context) {
super.build(context);
return Container(child: MyText('缓存的组件'),);
}
@override
bool get wantKeepAlive => true; // 是否开启缓存
}
如果觉得有用随手点个赞吧,谢谢
关注我,不定时分享技术干货~
扫二维码关注公众号