内容简介:不多逼逼先看Tabbar的参数好了,这两个必须关联起来用. 不然会报错
不多逼逼
Tabbar
先看Tabbar的参数
const TabBar({ Key key, @required this.tabs, // item this.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, // 每页的view this.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; @override void 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; @override void initState() { super.initState(); _tabController = new TabController(length: _spList.length, vsync: this); } @override Widget 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, ) ], ), 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 掘金小册写作参考
- 使用xposed更改掘金的侧滑退出的触发范围(左撇子,掘金的这个侧滑退出的体验一言难尽)
- 掘金小册优惠折扣一览
- React Demo Four - 掘金
- 为掘金小册添加目录
- 掘金翻译计划月报 — 2018 年 11 月
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Namo Webeditor5.5一看就懂.
吳聲毅 / 金禾資訊 / 20040214 / NT$ 169
一看就懂系列書全以初學者的角度切入,全書以STEP BY STEP方式撰寫,並以豐富的圖片搭配教學,在最後更加上日常生活實例運用講解,一路學來一氣呵成。為了增進學習的效率更採用高級紙品全彩印刷,這麼好的書,您還在等什麼,一看就懂系列書保證是您最佳入門學習好伙伴。 本書特色: 1、一看就懂:Step by Step操作詳盡說明、讓您一看就懂 2、精選範例:精彩實務範例生動活......一起来看看 《Namo Webeditor5.5一看就懂.》 这本书的介绍吧!