在上一篇里总结AppBar的一些简单用法,可是AppBar除了有前面那些样式属性外,还能实现相似底部的Tab切换。app
首先下载并运行前面的项目:less
而后在此基础上实现Tab切换。ide
TabBar有一下常见的属性:ui
为了实现顶部的Tabs切换,首先须要在Scaffold的外层定义一个DefaultTabController组件,而后组件里面定义tab的个数,最后将TabBar定义在AppBar里面的bottom属性中。根据这些,咱们来修改前面的spa
import 'package:flutter/material.dart'; class AppBarDemoPage extends StatelessWidget { const AppBarDemoPage({Key key}) : super(key: key); @override Widget build(BuildContext context) { return DefaultTabController( length:2 , child: Scaffold( appBar: AppBar( title:Text("AppBarDemoPage"), // backgroundColor: Colors.red, centerTitle:true, leading: IconButton( icon: Icon(Icons.menu), onPressed: (){ print('menu'); }, ), actions: <Widget>[ IconButton( icon: Icon(Icons.search), onPressed: (){ print('search'); }, ), IconButton( icon: Icon(Icons.settings), onPressed: (){ print('settings'); }, ) ], bottom: TabBar( tabs: <Widget>[ Tab(text: "热门"), Tab(text: "推荐") ], ), ), body: Text('1111'), ), ); } }
为了简化代码,删掉前面关于AppBar的属性设置:3d
AppBarDemo.dartcode
import 'package:flutter/material.dart'; class AppBarDemoPage extends StatelessWidget { const AppBarDemoPage({Key key}) : super(key: key); @override Widget build(BuildContext context) { return DefaultTabController( length:2 , child: Scaffold( appBar: AppBar( title:Text("AppBarDemoPage"), centerTitle:true, bottom: TabBar( tabs: <Widget>[ Tab(text: "热门"), Tab(text: "推荐") ], ), ), body: Text('1111'), ), ); } }
如今,只有跳转的按钮,却没有对应的页面组件,因此,还须要在body里面添加tabs切换的页面。对象
目前,是在一个新的页面添加了顶部Tabs切换,那么,若是须要在底部TabBar页面基础上添加Tabs切换,又该如何操做呢?blog
按照前面说的,在Scaffold的外层定义一个DefaultTabController组件,先这样修改Category.dart页面:get
import 'package:flutter/material.dart'; class CategoryPage extends StatefulWidget { CategoryPage({Key key}) : super(key: key); _CategoryPageState createState() => _CategoryPageState(); } class _CategoryPageState extends State<CategoryPage> { @override Widget build(BuildContext context) { return DefaultTabController( length: 4, child: Scaffold( appBar: AppBar( bottom:TabBar( tabs: <Widget>[ Tab(text: "热销"), Tab(text: "推荐"), Tab(text: "推荐"), Tab(text: "推荐") ], ) , ), body:TabBarView( children: <Widget>[ ListView( children: <Widget>[ ListTile(title:Text("第一个tab")), ], ), ListView( children: <Widget>[ ListTile(title:Text("第二个tab")), ], ), ListView( children: <Widget>[ ListTile(title:Text("第三个tab")), ], ), ListView( children: <Widget>[ ListTile(title:Text("第四个tab")), ], ) ], ) ), ); } }
由于Category.dart是挂载到Tabs.dart中的,而在Tabs.dart中,已经有一个Scaffold组件和AppBar组件了,因此,继续添加顶部Tabs之后,就会有两个Scaffold组件和AppBar组件。
为了解决上面的问题,只须要将Tabs切换换个位置,移动到title所在的位置就能够了:
import 'package:flutter/material.dart'; class CategoryPage extends StatefulWidget { CategoryPage({Key key}) : super(key: key); _CategoryPageState createState() => _CategoryPageState(); } class _CategoryPageState extends State<CategoryPage> { @override Widget build(BuildContext context) { return DefaultTabController( length: 4, child: Scaffold( appBar: AppBar( backgroundColor: Colors.black26, title: Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded( child:TabBar(
indicatorColor:Colors.blue, labelColor:Colors.blue, unselectedLabelColor: Colors.white, indicatorSize:TabBarIndicatorSize.label , tabs: <Widget>[ Tab(text: "热销"), Tab(text: "推荐"), Tab(text: "推荐"), Tab(text: "推荐") ], ) , ) ], ), ), body:TabBarView( children: <Widget>[ ListView( children: <Widget>[ ListTile(title:Text("第一个tab")), ], ), ListView( children: <Widget>[ ListTile(title:Text("第二个tab")), ], ), ListView( children: <Widget>[ ListTile(title:Text("第三个tab")), ], ), ListView( children: <Widget>[ ListTile(title:Text("第四个tab")), ], ) ], ) ), ); } }