先看一下Tab的构造方法:

TabBar({
Key key,
@required this.tabs,
this.controller,
this.isScrollable: false,
this.indicatorColor,
this.indicatorWeight: 2.0,
this.indicatorPadding: EdgeInsets.zero,
this.indicator,
this.indicatorSize,
this.labelColor,
this.labelStyle,
this.unselectedLabelColor,
this.unselectedLabelStyle,
})

Tab使用方法

import 'package:flutter/material.dart';

class MyHomePage extends StatefulWidget {
@override
createState() => new MyHomePageState();
} class MyHomePageState extends State<MyHomePage> {
final List<Tab> myTabs = <Tab>[
Tab(text: '明教'),
Tab(text: '霸刀'),
Tab(text: '天策'),
Tab(text: '纯阳'),
Tab(text: '少林'),
Tab(text: '藏剑'),
Tab(text: '七秀'),
Tab(text: '五毒'),
]; @override
Widget build(BuildContext context) {
return DefaultTabController(
length: myTabs.length,
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.blue,
title: TabBar(
tabs: myTabs,
isScrollable: true,
indicatorColor: Colors.red,
labelColor: Colors.white,
),
),
body: TabBarView(
children: myTabs
.map((Tab tab) => Center(child: Text(tab.text)))
.toList()),
),
);
}
}

Flutter切换tab后保留tab状态
Flutter中为了节约内存不会保存widget的状态,widget都是临时变量。当我们使用TabBar,TabBarView是我们就会发现,切换tab后再重新切换回上一页面,这时候tab会重新加载重新创建,体验很不友好。Flutter出于自己的设计考虑并没有延续android的ViewPager这样的缓存页面设计,毕竟控件两端都要开发,目前还在beta版本有很多设计还不够完善,但是设计的拓展性没得说,flutter还是为我们提供了解决办法。我们可以强制widget不显示情况下保留状态,下回再加载时就不用重新创建了。

AutomaticKeepAliveClientMixin
AutomaticKeepAliveClientMixin 是一个抽象状态,使用也很简单,我们只需要用我们自己的状态继承这个抽象状态,并实现 wantKeepAlive 方法即可。

继承这个状态后,widget在不显示之后也不会被销毁仍然保存在内存中,所以慎重使用这个方法。

详细官方文档请看这里。

这里还有一个说的比较详细的 demo。

/*
* Created by 李卓原 on 2018/9/13.
* email: zhuoyuan93@gmail.com
*
*/ import 'package:flutter/material.dart'; class TweetsListPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => TweetListState();
} class TweetListState extends State<TweetsListPage>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
return Center(
child: Text('TweetsListPage'),
);
} @override
void dispose() {
print('TweetsListPage dispose');
super.dispose();
} // 当页面不显示的时候也常驻在内存中
@override
bool get wantKeepAlive => true;
}

最新文章

  1. 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
  2. python图片添加水印(转载)
  3. Java多线程17:中断机制
  4. HTTP访问的两种方式(HttpClient+HttpURLConnection)整合汇总对比(转)
  5. Win7 桌面应用图标不见了
  6. Spring文件上传出错:java.lang.ClassCastException: org.apache.catalina.connector.Request
  7. UnicodeEncodeError: &#39;gbk&#39; codec can&#39;t encode character &#39;\xa0&#39; in position 46:illegal multibyte sequence
  8. Mysql中的force index和ignore index
  9. vxWorks驱动架构
  10. profile.go
  11. Laravel修改验证提示信息为中文
  12. JavaScript 函数调用和this指针
  13. 增加tomcat的运行速度
  14. HttpClient Timeout waiting for connection from pool 问题解决方案
  15. CentOS6.5下搭建VNC服务器
  16. Xposed MultiDex Hook
  17. thinkphp 网址后台典型页面
  18. hibernate联合主键
  19. JUC——延迟队列
  20. nginx+php-fpm配置后页面显示空白的解决方法(yum形式的安装)

热门文章

  1. _new_()与_init_()的区别
  2. IIS Express 配置 Json
  3. C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇)
  4. 为Linux集群创建新账户,并配置hadoop集群
  5. python获取动态网站上面的动态加载的数据(selenium+Firefox)
  6. 搭建互联网架构学习--003--maven以及nexus私服搭建
  7. python基础笔记之注释三种方法
  8. 【好书分享】容器网络到kubernetes网络
  9. centos6.5 + 7 静态ip配置
  10. crontab的用法