Flutter 仿掘金之动态Tabbar
效果
不多逼逼
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相关推荐
- Flutter 仿掘金推特点赞按钮,给2021的移动开发一些建议
color: isLiked ? Colors.deepPurpleAccent : Colors.grey, size: buttonSize, ); }, likeCount: 665, coun ...
- uniapp 移动端上传文件_基于 uniapp 实现动态路由和动态 Tabbar
本文转载自 字节逆旅 公众号,感谢作者的好文分享✌️,点击阅读原文可以查看作者的掘金链接. uniapp用来开发app还是比较方便快捷的,官网教程[1]挺细致,几乎所有问题都能找到答案.网上也有不少入 ...
- |flutter仿微信界面聊天室
1.项目介绍 Flutter 是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如 阿里闲鱼 , 美团 , 腾讯 等大公司都有投入相关案例生产使用. flutter_ch ...
- 仿掘金 Vue+Express+mysql 开源项目,多端适配
仿掘金博客网站 最近闲来无事,想着练一个项目,顺带给自己写一个博客网站,于是便仿照掘金官网写了一个练练手 网站基于vue3.0 + element 开发的响应式项目 适配PC与wap端 在线地址 后台 ...
- flutter图片聊天泡泡_基于 Flutter+Dart 聊天实例 | Flutter 仿微信界面聊天室
1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. flutter_chatroom项 ...
- android仿钉钉日程日历,Flutter仿钉钉考勤日历的示例代码
本文主要介绍了Flutter仿钉钉考勤日历的示例代码,分享给大家,具体如下: 效果 原型 开发 1. 使用 // 考勤日历 DatePickerDialog( initialDate: DateTim ...
- Flutter 仿微信右上角弹窗pop menus
Flutter 仿微信右上角弹窗pop menus 效果图 代码实现 效果图 代码实现 代码比较简单直接上代码 import 'package:flutter/material.dart'; impo ...
- android测试 掘金,仿掘金框架之listview全解(一)
文章首发:Android程序员日记 作者:贤榆的鱼 测试阅读时间:8min 前言 有有很长一段时间没有更新了,这次给大家带来了一个框架Demo--仿掘金App,希望可以通过这个Demo和大家分享一些控 ...
- flutter 基于掘金App实现的UI页面
flutter 基于掘金App实现的UI页面 项目地址: https://github.com/JunIce/juejin_flutter_ui 项目启动 众所周知的原因, 国内能查到的有关flutt ...
最新文章
- 2017-1-11 css3布局
- SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)...
- 打造高效的工作环境 – SHELL 篇
- 电脑连接到网络显示未连接到服务器未响应,电脑dns服务器未响应怎么办?
- 免疫算法(二进制)算例(源码实现)
- 支付宝回调地址index.php,支付宝支付成功回调地址怎么不改变当前页面?
- java中堆和栈有什么区别?
- 【飞鸽传书3.0】飞鸽传书3.0关键字布局
- 在centos 下安装和使用MySQL
- 带孩子们做环球旅行的读后感_孩子少言寡语、不爱说话怎么办?家长们可以这样做...
- Home_W的握手问题(思维+打表)
- 使用ipop共享串口提高工作效率
- UWB DW1000 TWR测距定位功能实现
- 基于MATLAB APP Designer 和 Python 的音视频剪辑App_02
- 血族手游Lua脚本及资源文件解密
- 在线教育平台项目——整体架构
- Web09——新闻数据分页
- 【经典算法】:狐狸抓兔子问题
- 地表最强gVim编写Verilog插件 automatic-verilog
- 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen