当前位置: 首页 > news >正文

flutter 自定义TabBar 【top 0 级别】

flutter 自定义TabBar 【top 0 级别】

  • 前言
  • 一、基础widget
  • 二、tab 标签
  • 三、barView
  • 总结


前言

在这里插入图片描述

在日常开发中,tab 标签选项,是一个我们特别常用的一个组件了,往往我们在一个项目中,有很多地方会使用到它,每次单独去写,真的是太繁琐,这里我会定义一个通用的tab 选择器,喜欢的朋友可以拿去试试


一、基础widget

直接先上代码

class YSTabbarWidget extends StatefulWidget {/// tabListfinal List<String> tabs;/// 是否可滑动  (居左)final bool? isScrollable;/// 高亮文字大小final double? textSize;/// 非高亮文字大小final double? unTextSize;/// 小线颜色final Color? tabColors;/// 文字高亮颜色final Color? labelColor;/// 非高亮文字颜色final Color? unselectedLabelColor;/// controller 必传final TabController? controller;/// tab间距final double? horizontal;/// 下划线颜色,根据文字大小  根据tab大小final double lineBottom;final TabBarIndicatorSize? indicatorSize;/// page Listfinal List<Widget> tabbarViewList;final Function(int)? didSelectIndex;/// 是否显示分割线final bool? showLine;const YSTabbarWidget({Key? key,required this.tabs,required this.controller,this.tabbarViewList = const [],this.unselectedLabelColor,this.isScrollable,this.textSize = 16.0,this.unTextSize = 16.0,this.tabColors,this.labelColor,this.horizontal,this.lineBottom = 0,this.indicatorSize,this.didSelectIndex,this.showLine = true}): super(key: key);State<YSTabbarWidget> createState() => _YSTabbarWidgetState();
}class _YSTabbarWidgetState extends State<YSTabbarWidget> {void initState() {// TODO: implement initStatesuper.initState();}Widget build(BuildContext context) {return Column(// mainAxisAlignment: MainAxisAlignment.start,crossAxisAlignment: CrossAxisAlignment.start,mainAxisSize: MainAxisSize.min,children: [getTabbarWidget(),widget.showLine == true? Container(height: 0.5,color: const Color(0xffe5e5e5),): Container(),getTabbarViewWidget(),],);}
}

通过上面的代码,我们可以看到,这里定义了很多属性,当然每个属性都有注释进行解释,这里就不赘述了。

二、tab 标签

上面的代码中,我们可以看到这个getTabbarWidget() 自定义的组件,它就是我们需要自定义的一个tab 按钮部分了

Widget getTabbarWidget() {return TabBar(isScrollable: widget.isScrollable ?? false,controller: widget.controller,indicatorColor: widget.tabColors ?? Colours.app_main,// indicatorWeight:10,indicatorSize: widget.indicatorSize ?? TabBarIndicatorSize.label,indicatorPadding: const EdgeInsets.only(left: 0),indicator: UnderlineTabIndicator(insets: EdgeInsets.only(bottom: widget.lineBottom),borderRadius: const BorderRadius.all(Radius.circular(1)),borderSide: BorderSide(color: widget.tabColors ?? Colours.app_main,width: 2, //高度),),labelColor: widget.labelColor ?? Colours.app_main,unselectedLabelColor: widget.unselectedLabelColor ?? Colours.textBlack3,labelPadding:EdgeInsets.symmetric(horizontal: widget.horizontal ?? 20.w),labelStyle: TextStyle(fontSize: widget.textSize,fontWeight: FontWeight.w600,),unselectedLabelStyle: TextStyle(fontSize: widget.unTextSize),onTap: (value) {if (widget.didSelectIndex != null) {widget.didSelectIndex!(value);}},tabs: widget.tabs.map<Tab>((String tab) {return Tab(text: tab,);}).toList());
}

结合篇头的代码及注释,我们可以简单的理解上面的每一行代码。这里需要说明的是,如果你想自定义tab 的样式或者是其他的一些功能需求,都可以直接在上面的代码中进行修改调整。

有人可能会有疑问,代码的中的showLine到底判断的是啥?

widget.showLine == true? Container(height: 0.5,color: const Color(0xffe5e5e5),): Container(),

其实它就是一个分界线,可以根据自己的需求进行调整样式,也可以根据showLine 参数,进行判断是否需要添加分界线。

三、barView

既然我们封装的使用通用的tabbar,那么barview 肯定是必不可少的,接来下我们看看getTabbarViewWidget() 这个自定义的组件。

Widget getTabbarViewWidget() {if(widget.tabbarViewList.isNotEmpty){return Expanded(child: TabBarView(controller: widget.controller,children: widget.tabbarViewList,),);}else{return Container();}
}

getTabbarViewWidget 的代码就比较少了,简单的来说,就是穿一个个上下文controller, 再传入你的widget 就可以了。

看到这里,你学废了没?


总结

简简单单一个widget,复制粘贴直接用,废话不多说,啥?没有写怎么调用?不知道怎么调用,你还是去看看前面的文章吧。

相关文章:

  • Selector SelectionKey基础学习
  • 【Excel/Matlab】绘x-y图并求切线和截距(详细图解)
  • C# IList 与List区别二叉树的层序遍历
  • C语言实现ARM MCU SWD离线调试器
  • cesium 融合视频
  • [Ubuntu 18.04] RK3399搭建SSH服务实现远程访问
  • 六、ZooKeeper Java API操作
  • KaiwuDB 多模数据库-时序性能优化
  • 【Matlab】如何快速入门一项新技能-以Matlab/Simulink入门为例
  • R语言中的机器学习
  • 15.oracle的 listagg() WITHIN GROUP () 行转列函数使用
  • Docker 容器日志查看和清理
  • c语言,输入整数n(行数,本例为4),按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
  • 接口测试 —— 接口测试的意义
  • 微信小程序生成二维码并保存到本地方法
  • 分享一款快速APP功能测试工具
  • HTML中设置input等文本框为不可操作
  • Javascript Math对象和Date对象常用方法详解
  • java正则表式的使用
  • js面向对象
  • Just for fun——迅速写完快速排序
  • Promise面试题2实现异步串行执行
  • TCP拥塞控制
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue的全局变量和全局拦截请求器
  • 安装python包到指定虚拟环境
  • 第十八天-企业应用架构模式-基本模式
  • 浮动相关
  • 技术:超级实用的电脑小技巧
  • 理解在java “”i=i++;”所发生的事情
  • 你真的知道 == 和 equals 的区别吗?
  • 全栈开发——Linux
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 用Canvas画一棵二叉树
  • 扩展资源服务器解决oauth2 性能瓶颈
  • $.proxy和$.extend
  • (C++20) consteval立即函数
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm高校实验室 毕业设计 800008
  • (三)c52学习之旅-点亮LED灯
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)汇编语言——简单程序
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core 中的路径问题
  • .Net Core和.Net Standard直观理解
  • .net core控制台应用程序初识
  • .net 无限分类
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • ;号自动换行
  • @拔赤:Web前端开发十日谈
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [ASP]青辰网络考试管理系统NES X3.5