Flutter AppBar 自定义顶部按钮图标、颜色
// leading:在标题前面显示的一个控件。在首页,通常显示应用的 logo;在其他界面,通常显示为返回按钮。
// title:标题。通常显示为当前界面的标题文字,但也可以是其他的组件。
// actions:通常使用 IconButton 来表示,也可以包含其他的按钮组。
// bottom:一般用于放置 tabBar,即在标题下面显示一个 Tab 导航栏。
// backgroundColor:导航背景颜色。
// iconTheme:用于定义图标样式。
// textTheme:用于定义文字样式。
// centerTitle:定义标题是否居中显示。
Flutter AppBar 中自定义 TabBar 实现顶部 Tab 切换
// tabs:显示的标签内容,一般使用 Tab 对象,但也可以是其他的 Widget。
// controller:用于控制 Tab 的 TabController 对象。
// isScrollable:定义是否可滚动。
// indicatorColor:定义指示器颜色。
// indicatorWeight:定义指示器高度。
// indicatorPadding:定义底部指示器的 Padding。
// indicator:指示器的 decoration,例如边框等。
// indicatorSize:指示器大小的计算方式。TabBarIndicatorSize.label 使其跟文字等宽,而 TabBarIndicatorSize.tab 使其跟每个 tab 等宽。
// labelColor:定义选中的 label 颜色。
// labelStyle:定义选中 label 的 Style。
// labelPadding:定义每个 label 的 padding 值。
// unselectedLabelColor:定义未选中的 label 颜色。
// unselectedLabelStyle:定义未选中 label 的 Style。
案例代码:
import 'package:flutter/material.dart';
class ClassIf extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
title: Row(
children: <Widget>[
Expanded(
flex: 1,
child: TabBar(
tabs: <Widget>[
Tab(text: '分类一'),
Tab(text: '分类二')
],
),
)
],
),
),
body: TabBarView(
children: <Widget>[
ListView(
children: <Widget>[
Text('132'),
Text('132'),
Text('132'),
],
),
ListView(
children: <Widget>[
Text('132'),
Text('132'),
Text('132'),
],
)
],
),
),
);
}
}
Flutter AppBar 中自定义 TabBar 实现 Tabs 的另一种方法
// 使用 TabController 定义 TabBar 的方式。
// 1. 页面必须继承 StatefulWidget。
// 2. 页面必须实现 SingleTickerProviderStateMixin。
// 3. 在页面初始化时,需要实例化 TabController。
// 4. 在 TabBar 和 TabBarView 组件中,都要指定 controller 为实例化的 TabController。
// 这种方式主要是为了监听 TabBar 与 TabBarView 的交互。例如,可以在 tab 切换时加载不同的数据或自定义切换动画。
参数详解:
// animation:一个动画值,表示 TabBar 所选选项卡指示器的当前位置以及 TabBar 和 TabBarView 的 scrollOffsets。
// index:当前的 tab 索引。
// indexIsChanging:当有动画时为 true。
// length:tab 的总数。
// offset:动画的值与当前索引之间的差异。偏移量的值必须在 -1.0 和 1.0 之间。
// previousIndex:之前的 tab 索引。
方法详解:
// animateTo:从当前 tab 跳转到目标 tab 并执行动画。
// dispose:销毁方法。
// addListener:添加监听方法。
// noSuchMethod:当试图调用一个不存在的方法时会被触发。
// notifyListeners:调用所有的监听器。
// removeListener:清除监听器。
import 'package:flutter/material.dart';
// 定义AppBardemoPage StatefulWidget类
class AppBardemoPage extends StatefulWidget {
AppBardemoPage({Key key}) : super(key: key);
@override
_AppBardemoPageState createState() => _AppBardemoPageState();
}
// 对应的State类
class _AppBardemoPageState extends State<AppBardemoPage> with SingleTickerProviderStateMixin {
TabController _tabController;
// State销毁时,释放TabController资源
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
// 初始化State
void initState() {
super.initState();
// 初始化TabController
_tabController = TabController(length: 3, vsync: this, initialIndex: 0);
_tabController.addListener(() {
print(_tabController.index);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('顶部 tab 切换'),
bottom: TabBar(
tabs: [
Tab(icon: Icon(Icons.directions_bike)),
Tab(icon: Icon(Icons.directions_boat)),
Tab(icon: Icon(Icons.directions_bus)),
],
controller: _tabController,
),
),
body: TabBarView(
controller: _tabController,
children: [
Center(child: Text('自行车')),
Center(child: Text('船')),
Center(child: Text('巴士')),
],
),
);
}
}
自定义tabBar 不放在appBar里面示例
// 定义TransactionRecord StatefulWidget类
class TransactionRecord extends StatefulWidget {
@override
_TransactionRecord createState() => _TransactionRecord();
}
// 对应的State类
class _TransactionRecord extends State<TransactionRecord> with SingleTickerProviderStateMixin {
var _tabController;
// 初始化State
@override
void initState() {
super.initState();
// 初始化TabController
_tabController = TabController(length: 3, vsync: this, initialIndex: 0);
_tabController.addListener(() {
print(_tabController.index);
});
}
// State销毁时,释放TabController资源
@override
void dispose() {
super.dispose();
_tabController.dispose();
}
@override
Widget build(BuildContext context) {
Screen.init(context); // 初始化屏幕参数
return DefaultTabController(
length: 3,
child: Scaffold(
body: Container(
alignment: Alignment.centerLeft,
color: ColorGather.colorBg(),
child: Column(
children: [
Container(
height: 50,
color: Colors.white,
child: TabBar(
labelPadding: EdgeInsets.all(0),
controller: _tabController,
tabs: [
Tab(child: Text('时间筛选', style: TextStyle(fontSize: Screen.width(28)))),
Tab(child: Text('时间筛选', style: TextStyle(fontSize: Screen.width(28)))),
Tab(child: Text('时间筛选', style: TextStyle(fontSize: Screen.width(28)))),
],
onTap: (val) {},
),
),
Expanded(
child: TabBarView(
controller: _tabController,
children: [
Text('123'),
Text('123'),
Text('123'),
],
),
)
],
)
),
),
);
}
}
不确定数量的Tab控制示例
// 如果标题列表的数量不固定,可以这样创建DefaultTabController
DefaultTabController(
length: titleList.length,
child: // 这里应继续根据你的代码需求进行布局
)