效果

不多逼逼

Tabbar

先看Tabbar的参数

const TabBar({Key key,@required this.tabs, // itemthis.controller, //控制器this.isScrollable = false, //是否可以滑动this.indicatorColor, //指示器的颜色this.indicatorWeight = 2.0,this.indicatorPadding = EdgeInsets.zero,this.indicator,//自定义指示器this.indicatorSize,this.labelColor, // 选中文字颜色this.labelStyle, // this.labelPadding, // 文字的内边距this.unselectedLabelColor, // 未选中文字颜色this.unselectedLabelStyle,this.dragStartBehavior = DragStartBehavior.start, this.onTap,// 点击事件})
复制代码

TabBarView

 const TabBarView({Key key,@required this.children, // 每页的viewthis.controller, // 控制器this.physics,this.dragStartBehavior = DragStartBehavior.start,})
复制代码

好了,这两个必须关联起来用. 不然会报错

DefaultTabController

这个是一个无状态的控制器,很简单.但是要做成动态Tabbar的话,不能用这个.

TabController

也很简单.

 TabController({ int initialIndex = 0, @required this.length, @required TickerProvider vsync })
复制代码

主要是这个TickerProvider.作用是获取每一帧刷新的通知.

其实也简单

直接 实现TickerProviderStateMixin就好了.

class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin{TabController _tabController;@overridevoid initState() {super.initState();_tabController = new TabController(length: _spList.length, vsync: this);// 直接传this}
}
复制代码

如何动态创建

SharedPreferences 这里我使用了本地缓存来做的

添加插件

写个工具

class SpUtils {static Future<List<String>> getSpList(String key) async {SharedPreferences prefs = await SharedPreferences.getInstance();return prefs.getStringList(key) ?? [];}static setSpList(String key, List<String> list) async {SharedPreferences prefs = await SharedPreferences.getInstance();prefs.setStringList(key, list);}
}
复制代码

这样使用就简单很多了


完整的代码

import 'package:flutter/material.dart';
import '../util/SpUtils.dart';class MyHomePage extends StatefulWidget {@override_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {var _bottomIndex = 0;var _spList = [];TabController _tabController;@overridevoid initState() {super.initState();_tabController = new TabController(length: _spList.length, vsync: this);}@overrideWidget build(BuildContext context) {SpUtils.getSpList('tabmenu').then((s) {if (_spList == s) {return;}setState(() {_spList = s;_tabController = new TabController(length: _spList.length, vsync: this);});});return Scaffold(appBar: new AppBar(titleSpacing: 0,title: Center(child: new TabBar(controller: _tabController,isScrollable: true,labelColor: Colors.white,tabs: _spList.map((f) {return Center(child: new Text(f),);}).toList(),),),actions: <Widget>[new Container(child: new Icon(Icons.arrow_drop_down),width: 48,)],),body: TabBarView(controller: _tabController,children: _spList.isEmpty? []: _spList.map((f) {return Center(child: new Text(f),);}).toList()),floatingActionButton: FloatingActionButton(onPressed: () {},tooltip: 'Increment',child: Icon(Icons.add),),bottomNavigationBar: new BottomNavigationBar(items: [new BottomNavigationBarItem(icon: Icon(Icons.home),title: new Container(),),new BottomNavigationBarItem(icon: Icon(Icons.whatshot),title: new Container(),),new BottomNavigationBarItem(icon: Icon(Icons.search),title: new Container(),),new BottomNavigationBarItem(icon: Icon(Icons.book),title: new Container(),),new BottomNavigationBarItem(icon: Icon(Icons.person),title: new Container(),),],currentIndex: _bottomIndex,type: BottomNavigationBarType.fixed,backgroundColor: Colors.white,selectedItemColor: Colors.blue,unselectedItemColor: Colors.grey,onTap: (i) {setState(() {_bottomIndex = i;});},), );}
}
复制代码

注意的点:

1._tabController 要重新创建.因为需要更新长度

SpUtils.getSpList('tabmenu').then((s) { //获取缓存if (_spList == s) {//防止递归刷新return;}setState(() {_spList = s;_tabController = new TabController(length: _spList.length, vsync: this);});});
复制代码

2.Tabbar放Appbard的title位置上

TabBar需要使用center包装.不然默认高度是不会占满的,当然也可以用其它办法

isScrollable需要设置为true.才能滑动.

 appBar: new AppBar(titleSpacing: 0,title: Center(child: new TabBar(controller: _tabController,isScrollable: true,labelColor: Colors.white,tabs: _spList.map((f) {return Center(child: new Text(f),);}).toList(),),),actions: <Widget>[new Container(child: new Icon(Icons.arrow_drop_down),width: 48,)],),
复制代码

最后

你怎么没说怎么动态的呢!

很简单.只要更新SharedPreferences的缓存值.就可以了.像 掘金的效果是跨页面开关的.所以使用SharedPreferences的缓存来做


期待你的留言 点赞

交流群:

Flutter:782978118

Android:493180098

转载于:https://juejin.im/post/5ce8dd43f265da1b6a346fc4

Flutter 仿掘金之动态Tabbar相关推荐

  1. Flutter 仿掘金推特点赞按钮,给2021的移动开发一些建议

    color: isLiked ? Colors.deepPurpleAccent : Colors.grey, size: buttonSize, ); }, likeCount: 665, coun ...

  2. uniapp 移动端上传文件_基于 uniapp 实现动态路由和动态 Tabbar

    本文转载自 字节逆旅 公众号,感谢作者的好文分享✌️,点击阅读原文可以查看作者的掘金链接. uniapp用来开发app还是比较方便快捷的,官网教程[1]挺细致,几乎所有问题都能找到答案.网上也有不少入 ...

  3. |flutter仿微信界面聊天室

    1.项目介绍 Flutter 是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如 阿里闲鱼 , 美团 , 腾讯 等大公司都有投入相关案例生产使用. flutter_ch ...

  4. 仿掘金 Vue+Express+mysql 开源项目,多端适配

    仿掘金博客网站 最近闲来无事,想着练一个项目,顺带给自己写一个博客网站,于是便仿照掘金官网写了一个练练手 网站基于vue3.0 + element 开发的响应式项目 适配PC与wap端 在线地址 后台 ...

  5. flutter图片聊天泡泡_基于 Flutter+Dart 聊天实例 | Flutter 仿微信界面聊天室

    1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. flutter_chatroom项 ...

  6. android仿钉钉日程日历,Flutter仿钉钉考勤日历的示例代码

    本文主要介绍了Flutter仿钉钉考勤日历的示例代码,分享给大家,具体如下: 效果 原型 开发 1. 使用 // 考勤日历 DatePickerDialog( initialDate: DateTim ...

  7. Flutter 仿微信右上角弹窗pop menus

    Flutter 仿微信右上角弹窗pop menus 效果图 代码实现 效果图 代码实现 代码比较简单直接上代码 import 'package:flutter/material.dart'; impo ...

  8. android测试 掘金,仿掘金框架之listview全解(一)

    文章首发:Android程序员日记 作者:贤榆的鱼 测试阅读时间:8min 前言 有有很长一段时间没有更新了,这次给大家带来了一个框架Demo--仿掘金App,希望可以通过这个Demo和大家分享一些控 ...

  9. flutter 基于掘金App实现的UI页面

    flutter 基于掘金App实现的UI页面 项目地址: https://github.com/JunIce/juejin_flutter_ui 项目启动 众所周知的原因, 国内能查到的有关flutt ...

最新文章

  1. 2017-1-11 css3布局
  2. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)...
  3. 打造高效的工作环境 – SHELL 篇
  4. 电脑连接到网络显示未连接到服务器未响应,电脑dns服务器未响应怎么办?
  5. 免疫算法(二进制)算例(源码实现)
  6. 支付宝回调地址index.php,支付宝支付成功回调地址怎么不改变当前页面?
  7. java中堆和栈有什么区别?
  8. 【飞鸽传书3.0】飞鸽传书3.0关键字布局
  9. 在centos 下安装和使用MySQL
  10. 带孩子们做环球旅行的读后感_孩子少言寡语、不爱说话怎么办?家长们可以这样做...
  11. Home_W的握手问题(思维+打表)
  12. 使用ipop共享串口提高工作效率
  13. UWB DW1000 TWR测距定位功能实现
  14. 基于MATLAB APP Designer 和 Python 的音视频剪辑App_02
  15. 血族手游Lua脚本及资源文件解密
  16. 在线教育平台项目——整体架构
  17. Web09——新闻数据分页
  18. 【经典算法】:狐狸抓兔子问题
  19. 地表最强gVim编写Verilog插件 automatic-verilog
  20. 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen

热门文章

  1. 图灵奖得主、AAAI候任主席展望“AI未来10年”
  2. 某微信公众号2019 SAP模块精华帖汇总
  3. 【转】人脸识别功能的用户体验设计优化
  4. 百度大脑开放日:24 种新 AI 能力 20 个经典案例 助力 AI 落地
  5. 布局自动驾驶L3级,探访北汽福田发动机生产基地!
  6. 流行的14个机器学习编程语言框架和工具
  7. Tengine 一个注重性能和兼容性的AI框架
  8. 机器学习Basics-第九期-CNN卷积神经网络详解
  9. 机器学习的教训:5家公司分享的错误经验
  10. 340亿美元买下红帽!IBM百年以来最大手笔,云市场翻身之战!