Flutter BottomNavigationBar切换会刷新当前页面解决方
问题描述
BottomNavigationBar 是flutter 中最常用的UI组建,刚接触时发现在切换tab 的时候,会刷新当前的所有状态,每个页面都会重新刷新。于是乎,在这里先记录下解决方案。
BottomNavigationBar基本代码
以下Home 是首页,切入三个tab,代码如下:
class Home extends StatefulWidget {
@override
createState() => _Home();
}
class _Home extends State<Home> {
int _currentIndex = 0;
List<Widget> _pages;
@override
void initState() {
_pages = [
new Guild(),
new ActivityList(),
new Mine(),
];
super.initState();
}
@override
void dispose() {
super.dispose();
_pageController.dispose();
}
var _pageController = PageController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: PageView.builder(
controller: _pageController,
physics: NeverScrollableScrollPhysics(),
onPageChanged: _pageChanged,
itemCount: _pages.length,
itemBuilder: (context, index) => _pages[index]),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,
fixedColor: Colors.black,//点击选择
type: BottomNavigationBarType.shifting,
onTap: onTabTapped,
items: [
BottomNavigationBarItem(
//backgroundColor: Theme.of(context).appBarTheme.color
icon: Icon(Icons.home),
title: Text("公会"),
backgroundColor: Theme.of(context).appBarTheme.color),
BottomNavigationBarItem(
icon: Icon(Icons.notifications),
title: Text("活动"),
backgroundColor: Theme.of(context).appBarTheme.color),
BottomNavigationBarItem(
icon: Icon(Icons.person),
title: Text("我的"),
backgroundColor: Theme.of(context).appBarTheme.color),
],
),
);
}
void _pageChanged(int index) {
setState(() {
if (_currentIndex != index) _currentIndex = index;
});
}
void onTabTapped(int index) {
_pageController.jumpToPage(index);
}
}
这样像简单的写,其实就会出现 切换tab 的时候,重新刷新当前页面的现象,之前保留的状态就会消失。
解决方案
解决方案分为四个步骤(以下我将其中一个页面名字叫做:DemoPage):
- 第一步将tab里面的页面DemoPage需要实现 AutomaticKeepAliveClientMixin
- 第二步设置DemoPage 实现代码 bool get wantKeepAlive => true;
- 第三步DemoPage 里面实现 Widget build(BuildContext context) 调用 super.build(context);
- 第四步 PageView.builder 设置NeverScrollableScrollPhysics(),//禁止页面左右滑动切换 (可选,好像这部不设置也没关系,具体看实际情况来)
具体 代码如下:
1、class _DemoPageState extends State<DemoPage> with AutomaticKeepAliveClientMixin{//要点1
2、 @override
bool get wantKeepAlive => true;//要点2
3、@override
Widget build(BuildContext context) {
super.build(context);//要点3
4、使用PageView构建
PageView.builder(//要点1
physics: NeverScrollableScrollPhysics(),//禁止页面左右滑动切换
controller: _pageController,
onPageChanged: _pageChanged,//回调函数
itemCount: _pages.length,
itemBuilder: (context,index)=>_pages[index]
)
参看文献:
https://blog.csdn.net/tgbus18990140382/article/details/81181879(这个好像没起什么作用啊)
https://blog.csdn.net/weixin_34121282/article/details/88241346
Flutter BottomNavigationBar切换会刷新当前页面解决方的更多相关文章
- 15 Flutter BottomNavigationBar自定义底部导航条 以及实现页面切换 以及模块化
效果: /** * Flutter BottomNavigationBar 自定义底部导航条.以及实现页面切换: * BottomNavigationBar是底部导航条,可以让我们定义底部Tab ...
- vue案例 - vuex+sessionstorage解决vue项目刷新后页面空白/数据丢失
第一部分 SessionStorage 首先查看sessionStorage的地方在控制台的 Application > Storage > Session Storage这里: 根据se ...
- jQuery实现AJAX定时刷新局部页面实例
本篇文章通过两种方法实例讲解ajax定时刷新局部页面,当然方法有很多种,也可以不使用ajax来刷新页面,可以使用jquery中的append来给指定内容加东西,但是都不太实用,最实用的方法还是ajax ...
- 使用ajax实现无刷新改变页面内容
如何使用ajax实现无刷新改变页面内容(也就是ajax异步请求刷新页面),下面通过一个小demo说明一下,前端页面代码如下所示 1 <%@ Page Language="C#" ...
- 使用ajax和history.pushState无刷新改变页面URL
表现 如果你使用chrome或者firefox等浏览器访问本博客.github.com.plus.google.com等网站时,细心的你会发现页面之间的点击是通过ajax异步请求的,同时页面的URL发 ...
- 使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 使用ajax和history.pushState无刷新改变页面URL onpopstate(转)
Javascript代码 var htmlData1 = $.ajax( { url: "/getXXXResponse", async: false }).re ...
- Asp.net页面使用showModalDialog时Postback弹出新页面解决办法
今天碰到一个让我一开始觉得莫名其妙的问题, 用window.showModalDialog打开一个.aspx文件,然后点击这个页面上一个button, 把页面的数据存入数据库之后,居然又打开一个这个页 ...
- 使用ajax和history.pushState无刷新改变页面URL(转)
表现 如果你使用chrome或者firefox等浏览器访问本博客.github.com.plus.google.com等网站时,细心的你会发现页面之间的点击是通过ajax异步请求的,同时页面的URL发 ...
随机推荐
- 3.1 开始使用 redux
前面我们介绍了 flux 架构以及其开源实现 redux,在这一节中,我们将完整的介绍 redux: redux 介绍 redux 是什么 redux 概念 redux 三原则 redux Store ...
- shell txt1写入txt2,并放在txt2中指定字符串的后面
# 先找到指定字符串aaa的行号 row=`grep -w -n "aaa" txt2 | cut -d ":" -f 1` # 将txt1中内容写入txt2中 ...
- 前端(十五)—— JavaScript事件:绑定事件方式、事件的冒泡和默认事件、鼠标事件、键盘事件、表单 事件、文档事件、图片事件、页面事件
JS事件:绑定事件方式.事件的冒泡和默认事件.鼠标事件.键盘事件.表单 事件.文档事件.图片事件.页面事件 一.事件的两种绑定方式 1.on事件绑定方式 document.onclick = func ...
- 深入理解JAVA虚拟机原理之Dalvik虚拟机(三)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 本文是Android虚拟机系列文章的第三篇,专门介绍Andorid系统上曾经使用 ...
- hdu6321 /// 状压DP
题目大意: 将一个 顶点不重复的边 的边集称为图中的matching 在一个n个点的零图中进行m次操作 + u v为在u v之间加一条边 存在重边 - u v为去掉u v之间的一条边 每次操作后 输出 ...
- 自动化监控系统(三) 搭建xadmin做网站后台
Django有个自带的admin后台,不过界面不怎么好看,这里我用xadmin 我的python版本是3.5,可以使用支持py3的xadmin:https://github.com/sshwsfc/x ...
- CyberArk
CyberArk PIM 套件由5个部分组成: · CyberArk EPV (Enterprise Password Vault)– 企业密码保险库 基于CyberArk 专利的Vault技术,为企 ...
- wpf 解决 WPF SelectionChanged事件向上传递造成重复执行不想执行的函数的问题
例如 tabcontrol里有一个tabitem tabitem里有一个combox和一个datagrid tabcontrol combox datagrid都有SelectionChanged事件 ...
- 原生js如何获取某一元素的高度
三种方法: 1.document.getElementById("id").style.height,这种方法的前提是必须之前已经显示的在css中声明过height,才能取得正确的 ...
- Delphi流
一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实 ...