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 加入
还未添加个人简介











 
    
评论