五、Tab 标签组件
Tab 组件是 TabBar 组件的子组件 , 每个 TabBar 组件需要设置若干个 Tab 组件 ( 至少一个 ) ;
Tab 构造函数 :
/// 创建一个材料设计风格的选项卡. /// /// 至少设置一个 text 文本和 icon 图标 child 必须为非空 . const Tab({ Key? key, this.text, this.icon, this.iconMargin = const EdgeInsets.only(bottom: 10.0), this.child, }) : assert(text != null || child != null || icon != null), assert(text == null || child == null), super(key: key);
代码示例 :
bottom: TabBar( /// 可左右滑动 isScrollable: true, /// 设置顶部导航栏的图标 tabs: datas.map((TabData data) { /// 导航栏的图标及文本 return Tab( text: data.title, icon: Icon(data.icon), ); }).toList(), ),
六、TabBarView 导航主体内容组件
显示 TabBar 中当前选中的 Tab 标签对应的组件 ;
TabBarView 初始化时 , 可以只为其设置 children 参数 , 类型是 List<Widget> ;
TabBarView 构造函数 :
const TabBarView({ Key? key, required this.children, this.controller, this.physics, this.dragStartBehavior = DragStartBehavior.start, }) : assert(children != null), assert(dragStartBehavior != null), super(key: key);
七、完整代码示例
import 'package:flutter/material.dart'; void main() { runApp( TabBarWidget() ); } /// 导航栏数据集合 const List<TabData> datas = const <TabData>[ const TabData(title: '3D', icon: Icons.threed_rotation), const TabData(title: '打印机', icon: Icons.print), const TabData(title: '动画', icon: Icons.animation), const TabData(title: '变换', icon: Icons.transform), const TabData(title: '高度', icon: Icons.height), const TabData(title: '描述', icon: Icons.description), const TabData(title: '向前', icon: Icons.forward), const TabData(title: '相机', icon: Icons.camera), const TabData(title: '设置', icon: Icons.settings), const TabData(title: '学位', icon: Icons.school), ]; /// 顶部导航栏核心页面 class TabBarWidget extends StatelessWidget { @override Widget build(BuildContext context) { /// 材料设计应用组件 , 一般作为页面的根组件 return MaterialApp( /// 用于将 TabBar 和 TabBarView 封装起来 home: DefaultTabController( length: datas.length, /// 主界面框架 child: Scaffold( /// 标题栏 appBar: AppBar( /// 标题栏标题 title: const Text('顶部导航栏'), /// 设置顶部导航栏 bottom: TabBar( /// 可左右滑动 isScrollable: true, /// 设置顶部导航栏的图标 tabs: datas.map((TabData data) { /// 导航栏的图标及文本 return Tab( text: data.title, icon: Icon(data.icon), ); }).toList(), ), ), /// 导航栏控制的左右轮播的组件 body: TabBarView( /// 界面显示的主体 , 通过 TabBar 切换不同的本组件显示 children: datas.map((TabData choice) { return Padding( padding: const EdgeInsets.all(10.0), child: TabContent(data: choice), ); }).toList(), ), ), ), ); } } /// 通过 TabBar 导航栏切换展示的主要内容 /// 用于在 TabBarView 中显示的组件 class TabContent extends StatelessWidget { const TabContent({Key key, this.data}) : super(key: key); /// 根据该数据条目生成组件 final TabData data; @override Widget build(BuildContext context) { TextStyle textStyle = TextStyle(color: Colors.yellow, fontSize: 50); return Card( /// 设置 20 像素边距 margin: EdgeInsets.all(20), /// 设置阴影 elevation: 10, /// 卡片颜色黑色 color: Colors.black, /// 卡片中的元素居中显示 child: Center( /// 垂直方向的线性布局 child: Column( /// 在主轴 ( 垂直方向 ) 占据的大小 mainAxisSize: MainAxisSize.min, /// 居中显示 crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ /// 设置图标 Icon(data.icon, size: 128.0, color: Colors.green), /// 设置文字 Text(data.title, style: TextStyle(color: Colors.yellow, fontSize: 50)), ], ), ), ); } } /// 封装导航栏的图标与文本数据 class TabData { /// 导航数据构造函数 const TabData({this.title, this.icon}); /// 导航标题 final String title; // 导航图标 final IconData icon; }
运行效果 :
八、相关资源
参考资料 :
Flutter 官网 : https://flutter.dev/
Flutter 插件下载地址 : https://pub.dev/packages
Flutter 开发文档 : https://flutter.cn/docs ( 强烈推荐 )
官方 GitHub 地址 : https://github.com/flutter
Flutter 中文社区 : https://flutter.cn/
Flutter 实用教程 : https://flutter.cn/docs/cookbook
Flutter CodeLab : https://codelabs.flutter-io.cn/
Dart 中文文档 : https://dart.cn/
Dart 开发者官网 : https://api.dart.dev/
Flutter 中文网 : https://flutterchina.club/ , http://flutter.axuer.com/docs/
Flutter 相关问题 : https://flutterchina.club/faq/ ( 入门阶段推荐看一遍 )
GitHub 上的 Flutter 开源示例 : https://download.csdn.net/download/han1202012/15989510
Flutter 实战电子书 : https://book.flutterchina.club/chapter1/
重要的专题 :
Flutter 动画参考文档 : https://flutterchina.club/animations/
博客源码下载 :
GitHub 地址 : https://github.com/han1202012/flutter_frame ( 随博客进度一直更新 , 有可能没有本博客的源码 )
博客源码快照 : https://download.csdn.net/download/han1202012/16245277 ( 本篇博客的源码快照 , 可以找到本博客的源码 )