当前位置:   article > 正文

Flutter TabBar

flutter tabbar

Tab关键元素

  • TabController
    这是Tab页的控制器,用于定义Tab标签和内容页的坐标,还可配置标签页的切换动画效果等。

TabController一般放入有状态控件中使用,以适应标签页数量和内容有动态变化的场景,如果标签页在APP中是静态固定的格局,则可以在无状态控件中加入简易版的DefaultTabController以提高运行效率,毕竟无状态控件要比有状态控件更省资源,运行效率更快。

  • TabBar
    Tab页的Title控件,切换Tab页的入口,一般放到AppBar控件下使用,内部有*Title属性。其子元素按水平横向排列布局,如果需要纵向排列,请使用ColumnListView控件包装一下。子元素为Tab类型的数组。

  • TabBarView
    Tab页的内容容器,其内放置Tab页的主体内容。子元素可以是多个各种类型的控件。

先看一下Tab的构造方法:

  1. TabBar({
  2. Key key,
  3. @required this.tabs,
  4. this.controller,
  5. this.isScrollable: false,
  6. this.indicatorColor,
  7. this.indicatorWeight: 2.0,
  8. this.indicatorPadding: EdgeInsets.zero,
  9. this.indicator,
  10. this.indicatorSize,
  11. this.labelColor,
  12. this.labelStyle,
  13. this.unselectedLabelColor,
  14. this.unselectedLabelStyle,
  15. })
属性意义
tabs一般使用Tab对象,当然也可以是其他的Widget
controllerTabController对象
isScrollable是否可滚动
indicatorColor指示器颜色
indicatorWeight指示器厚度
indicatorPadding底部指示器的Padding
indicator指示器decoration,例如边框等
indicatorSize指示器大小计算方式
labelColor选中Tab文字颜色
labelStyle选中Tab文字Style
unselectedLabelColor未选中Tab中文字颜色
unselectedLabelStyle未选中Tab中文字style

Tab使用方法

 

  1. import 'package:flutter/material.dart';
  2. class MyHomePage extends StatefulWidget {
  3. @override
  4. createState() => new MyHomePageState();
  5. }
  6. class MyHomePageState extends State<MyHomePage> {
  7. final List<Tab> myTabs = <Tab>[
  8. Tab(text: '明教'),
  9. Tab(text: '霸刀'),
  10. Tab(text: '天策'),
  11. Tab(text: '纯阳'),
  12. Tab(text: '少林'),
  13. Tab(text: '藏剑'),
  14. Tab(text: '七秀'),
  15. Tab(text: '五毒'),
  16. ];
  17. @override
  18. Widget build(BuildContext context) {
  19. return DefaultTabController(
  20. length: myTabs.length,
  21. child: Scaffold(
  22. appBar: AppBar(
  23. backgroundColor: Colors.blue,
  24. title: TabBar(
  25. tabs: myTabs,
  26. isScrollable: true,
  27. indicatorColor: Colors.red,
  28. labelColor: Colors.white,
  29. ),
  30. ),
  31. body: TabBarView(
  32. children: myTabs
  33. .map((Tab tab) => Center(child: Text(tab.text)))
  34. .toList()),
  35. ),
  36. );
  37. }
  38. }

 

Flutter切换tab后保留tab状态

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

AutomaticKeepAliveClientMixin

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

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

详细官方文档请看这里。 

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

  1. /*
  2. * Created by 李卓原 on 2018/9/13.
  3. * email: zhuoyuan93@gmail.com
  4. *
  5. */
  6. import 'package:flutter/material.dart';
  7. class TweetsListPage extends StatefulWidget {
  8. @override
  9. State<StatefulWidget> createState() => TweetListState();
  10. }
  11. class TweetListState extends State<TweetsListPage>
  12. with AutomaticKeepAliveClientMixin {
  13. @override
  14. Widget build(BuildContext context) {
  15. return Center(
  16. child: Text('TweetsListPage'),
  17. );
  18. }
  19. @override
  20. void dispose() {
  21. print('TweetsListPage dispose');
  22. super.dispose();
  23. }
  24. // 当页面不显示的时候也常驻在内存中
  25. @override
  26. bool get wantKeepAlive => true;
  27. }

动态改变tab

有时候我们需要手动的改变当前显示的tab , 这时候就需要自己创建一个controller了 , 

 

  1. TabController tabController;
  2. @override
  3. void initState() {
  4. // TODO: implement initState
  5. super.initState();
  6. tabController = TabController(length: myTabs.length, vsync: this);
  7. }

 这时, 我们外面套用的 DefaultTabController 就可以去掉了 , 它的作用就是当我们没写controller的时候使用的 , 因为tabbar以及tabbarView是必须有个controller的. 

执行

tabController.animateTo(index)

就会跳转到对应的tab , 当然 要在tabBar 以及tabbarView 中都设置controller . 

 

炫酷版:

 

代码: github

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/431749
推荐阅读
相关标签
  

闽ICP备14008679号