Flutter Tab
发布于: 2021 年 05 月 14 日
Flutter Tab
本文通过提供几个例子介绍 Flutter Tab 的使用
http://cairuoyu.com/flutter_demo
Demo
使用 TabController
使用时需要 with TickerProviderStateMixin
List<Tab> tabs = <Tab>[
Tab(text: 'tab1'),
Tab(text: 'tab2'),
];
List<Widget> tabBarViews = <Widget>[
Center(child: Text('tabPage1')),
Center(child: Text('tabPage2')),
];
复制代码
class TabSimple extends StatefulWidget {
@override
_TabSimpleState createState() => _TabSimpleState();
}
class _TabSimpleState extends State<TabSimple> with TickerProviderStateMixin {
TabController _tabController;
@override
void initState() {
super.initState();
_tabController = TabController(length: tabs.length, vsync: this);
}
@override
Widget build(BuildContext context) {
var result = Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
bottom: TabBar(controller: _tabController, tabs: tabs),
),
body: TabBarView(controller: _tabController, children: tabBarViews),
);
return result;
}
}
复制代码
使用 DefaultTabController
简单的功能可以使用 DefaultTabController,它其实是对 TabController 的封装,可以减少代码量
class TabSimpleDefault extends StatelessWidget {
@override
Widget build(BuildContext context) {
var result = DefaultTabController(
length: tabs.length,
child: Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
bottom: TabBar(tabs: tabs),
),
body: TabBarView(children: tabBarViews),
),
);
return result;
}
}
复制代码
切换 Tab 时保持状态
当切换 Tab 时,页面会调用 init 和 build 重新渲染,从而失去状态。官方推荐使用 AutomaticKeepAliveClientMixin 来控制每个页面是否需要保持状态
import 'package:flutter/material.dart';
import 'data.dart';
class TabKeepAlive extends StatelessWidget {
@override
Widget build(BuildContext context) {
var result = DefaultTabController(
length: tabs.length,
child: Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
bottom: TabBar(tabs: tabs),
),
body: TabBarView(children: [
KeepAlivePage(
title: 'page1',
),
KeepAlivePage(
title: 'page2',
),
]),
),
);
return result;
}
}
class KeepAlivePage extends StatefulWidget {
final String title;
const KeepAlivePage({Key key, this.title}) : super(key: key);
@override
_KeepAlivePageState createState() => _KeepAlivePageState();
}
class _KeepAlivePageState extends State<KeepAlivePage> with AutomaticKeepAliveClientMixin {
@override
void initState() {
super.initState();
print('init--' + widget.title);
}
@override
Widget build(BuildContext context) {
super.build(context);
print('build--' + widget.title);
var result = TextField(
decoration: InputDecoration(hintText: '请输入' + widget.title),
);
return result;
}
@override
bool get wantKeepAlive => true;
}
复制代码
动态 Tab
可动态增加或减少 Tab
class TabDynamic extends StatefulWidget {
@override
_TabDynamicState createState() => _TabDynamicState();
}
class _TabDynamicState extends State<TabDynamic> with TickerProviderStateMixin {
TabController tabController;
int tabNum = 3;
@override
Widget build(BuildContext context) {
int index = tabController?.index ?? 0;
index = tabNum > index ? index : tabNum - 1;
tabController?.dispose();
tabController =
TabController(length: tabNum, vsync: this, initialIndex: index);
tabController.animateTo(tabNum - 1);
var tabs = List.generate(
tabNum,
(index) => Tab(
child: Row(
children: [
Text('tab' + index.toString()),
IconButton(
splashRadius: 10,
iconSize: 10,
icon: Icon(Icons.close_outlined),
onPressed: () {
setState(() {
tabNum--;
});
},
)
],
),
// icon: Icon(Icons.add),
),
);
var tabPages = List.generate(
tabNum,
(index) => Center(
child: TestPage(index),
),
);
var tabBar = TabBar(
isScrollable: true,
tabs: tabs,
controller: tabController,
);
var tabBarView = TabBarView(
children: tabPages,
controller: tabController,
);
var result = Scaffold(
appBar: AppBar(automaticallyImplyLeading: false, bottom: tabBar),
body: tabBarView,
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
setState(() {
tabNum++;
});
},
),
);
return result;
}
}
复制代码
附
源码地址:
https://github.com/cairuoyu/flutter_demo
更多复杂功能参考:
https://github.com/cairuoyu/flutter_admin/blob/master/lib/pages/layout/layout_center.dart
划线
评论
复制
发布于: 2021 年 05 月 14 日阅读数: 14
Geek_7e907c
关注
还未添加个人签名 2021.01.18 加入
还未添加个人简介
评论