Flutter创建TabBar

使用TabBar和TabBarView来创建一个包含"首页"、"分类"和"我的"的TabBar。每个Tab对应一个Tab控件,TabBarView中的每个页面对应一个Widget。

1.Tab使用自定义图标和颜色

一般UI设计的图会带渐变色之类的,应该保持图片的原状,不能随便就给改成纯色。

import 'package:flutter/material.dart'; // 导入Flutter Material组件库void main() {WidgetsFlutterBinding.ensureInitialized(); // 确保Flutter绑定到框架初始化runApp(const MyApp()); // 运行应用
}class MyApp extends StatelessWidget {// 创建一个无状态的组件MyAppconst MyApp({super.key}); // 构造函数,接收一个Key@overrideWidget build(BuildContext context) {// 重写build方法,构建UIreturn MaterialApp(debugShowCheckedModeBanner: false, // 禁用右上角的Debug标志theme: ThemeData(// 设置应用主题tabBarTheme: TabBarTheme(// 设置TabBar主题overlayColor: MaterialStateProperty.all<Color>(Colors.transparent), // 设置点击时的背景颜色为透明),),home: DefaultTabController(// 使用DefaultTabController来协调选项卡选择和内容显示initialIndex: 0, // 设置初始选中的Tab索引为0(首页)length: 3, // 设置Tab的数量child: Scaffold(// 创建一个Scaffold,提供基本的Material Design布局结构appBar: AppBar(// 创建一个AppBartitle: const Text('My Flutter App'), // 设置AppBar的标题), // 去掉顶部的导航栏,只需将appBar设置为nullbody: const TabBarView(// 创建TabBarView,用于显示Tab的内容physics:NeverScrollableScrollPhysics(), // 禁止在 TabBarView 中滑动切换选项卡,添加这行代码children: [Center(child: Text('首页:这里可以展示应用的主要内容')), // Tab 1 内容Center(child: Text('分类:这里可以展示商品或信息的分类')), // Tab 2 内容Center(child: Text('我的:这里可以展示用户的个人信息和设置')), // Tab 3 内容],),bottomNavigationBar: const TabBar(// 创建底部导航TabBartabs: [// Tab项定义Tab(icon: _TabIcon(// 自定义Tab图标activeIcon: // 选中状态的图标AssetImage("assets/images/tab_home_selected.png"),inactiveIcon: // 未选中状态的图标AssetImage("assets/images/tab_home_default.png"),index: 0), // Tab索引text: "首页"), // Tab文本Tab(icon: _TabIcon(activeIcon:AssetImage("assets/images/tab_category_selected.png"),inactiveIcon:AssetImage("assets/images/tab_category_default.png"),index: 1),text: "分类"),Tab(icon: _TabIcon(activeIcon:AssetImage("assets/images/tab_mine_selected.png"),inactiveIcon:AssetImage("assets/images/tab_mine_default.png"),index: 2),text: "我的"),],isScrollable: false, // 禁用滚动功能labelStyle: TextStyle(fontWeight: FontWeight.bold), // 设置文本样式为加粗labelColor: Colors.red, // 选项选中的颜色unselectedLabelColor: Colors.black, // 选项未选中的颜色indicatorColor: Colors.blue, // 下滑线颜色indicator: BoxDecoration(), // 设置为空的Container,隐藏下划线),),),);}
}class _TabIcon extends StatelessWidget {// 创建一个无状态的组件_TabIcon,用于显示Tab图标final AssetImage activeIcon; // 选中状态的图标final AssetImage inactiveIcon; // 未选中状态的图标final int index; // Tab索引const _TabIcon({// 构造函数Key? key,required this.activeIcon,required this.inactiveIcon,required this.index,}) : super(key: key);@overrideWidget build(BuildContext context) {// 重写build方法,构建UIfinal controller =DefaultTabController.of(context); // 获取当前上下文的DefaultTabControllerreturn ValueListenableBuilder(// 创建ValueListenableBuilder来监听变化valueListenable: controller.animation!, // 监听TabController的动画builder: (BuildContext context, value, Widget? child) {// 构建器回调final tabIndex = controller.index; // 获取当前选中的Tab索引return Image(// 创建Image组件来显示图标image:tabIndex == index ? activeIcon : inactiveIcon, // 根据Tab索引显示对应的图标width: 24, // 图标宽度height: 24, // 图标高度);},);}
}

这段代码创建了一个简单的Flutter应用,其中包含一个具有三个Tab的底部导航栏。每个Tab都有自己的图标和文本。这些Tab可以在用户点击它们时切换显示内容。代码中还包含了对Tab图标颜色的自定义处理,确保图标显示其原始颜色。

示意图:

2.Tab使用自定义图标,但不使用图标所带的颜色。

import 'package:flutter/material.dart';void main() {// 确保Flutter绑定到框架初始化WidgetsFlutterBinding.ensureInitialized();runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false, // 禁用右上角的Debug标志theme: ThemeData(tabBarTheme: TabBarTheme(overlayColor: MaterialStateProperty.all<Color>(Colors.transparent), // 设置点击时的背景颜色为透明),),home: DefaultTabController(length: 3,child: Scaffold(appBar: AppBar(title: const Text('My Flutter App'),), // 去掉顶部的导航栏,只需将appBar设置为nullbody: const TabBarView(children: [Center(child: Text('首页:这里可以展示应用的主要内容')),Center(child: Text('分类:这里可以展示商品或信息的分类')),Center(child: Text('我的:这里可以展示用户的个人信息和设置')),],),bottomNavigationBar: const TabBar(tabs: [Tab(icon: _TabIcon(activeIcon:AssetImage("assets/images/tab_home_selected.png"),inactiveIcon:AssetImage("assets/images/tab_home_default.png"),index: 0),text: "首页"),Tab(icon: _TabIcon(activeIcon:AssetImage("assets/images/tab_category_selected.png"),inactiveIcon:AssetImage("assets/images/tab_category_default.png"),index: 1),text: "分类"),Tab(icon: _TabIcon(activeIcon:AssetImage("assets/images/tab_mine_selected.png"),inactiveIcon:AssetImage("assets/images/tab_mine_default.png"),index: 2),text: "我的"),],labelColor: Colors.red, // 选项选中的颜色unselectedLabelColor: Colors.grey, // 选项未选中的颜色indicatorColor: Colors.blue, // 下滑线颜色indicator: BoxDecoration(), // 设置为空的Container,隐藏下划线),),),);}
}class _TabIcon extends StatelessWidget {final AssetImage activeIcon;final AssetImage inactiveIcon;final int index;const _TabIcon({Key? key,required this.activeIcon,required this.inactiveIcon,required this.index,}) : super(key: key);@overrideWidget build(BuildContext context) {final tabIndex = DefaultTabController.of(context).index;return ImageIcon(tabIndex == index ? activeIcon : inactiveIcon,);}
}

3.Tab使用系统图标

import 'package:flutter/material.dart';void main() {// 确保Flutter绑定到框架初始化WidgetsFlutterBinding.ensureInitialized();runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false, // 禁用右上角的Debug标志theme: ThemeData(tabBarTheme: TabBarTheme(overlayColor: MaterialStateProperty.all<Color>(Colors.transparent), // 设置点击时的背景颜色为透明),),home: DefaultTabController(length: 3,child: Scaffold(appBar: AppBar(title: const Text('My Flutter App'),), // 去掉顶部的导航栏,只需将appBar设置为nullbody: const TabBarView(children: [Center(child: Text('首页:这里可以展示应用的主要内容')),Center(child: Text('分类:这里可以展示商品或信息的分类')),Center(child: Text('我的:这里可以展示用户的个人信息和设置')),],),bottomNavigationBar: const TabBar(tabs: [Tab(icon: Icon(Icons.home), text: "首页"),Tab(icon: Icon(Icons.category), text: "分类"),Tab(icon: Icon(Icons.person), text: "我的"),],labelColor: Colors.red, // 选项选中的颜色unselectedLabelColor: Colors.grey, // 选项未选中的颜色indicatorColor: Colors.blue, // 下滑线颜色indicator: BoxDecoration(), // 设置为空的Container,隐藏下划线),),),);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/230784.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单相直流电表和单相智能电表有哪些区别?

在众多的智能电表中&#xff0c;单相智能电表已成为家庭用电、工业用电等领域的重要组成部分。与此同时&#xff0c;单相直流电表也因其特性在某些特定场合受到关注。下面就来讲讲两者都有哪些区别&#xff0c;一起来看下吧&#xff01; 一、工作原理及性能差异 1.单相直流电表…

数据标注需要注意的问题

在进行数据标注时&#xff0c;有一些重要的问题需要注意&#xff0c;以确保标注的数据质量和可用性。以下是一些建议和注意事项&#xff1a; 明确定义标签&#xff1a; 确保标签的含义和定义是清晰明确的。标签是对数据的关键描述&#xff0c;因此其含义应该在整个团队中共享和…

并查集带权并查集

定义 : 并查集 : 一种数据结构&#xff0c;用于处理一些不相交集合的合并与查询问题&#xff1b; 例题 : 如 : 有n种元素&#xff0c;分属于不同的n个集合&#xff1b; 有两种操作 : 1.给出两个元素的亲属关系&#xff0c;合并两个集合(x与y是亲戚&#xff0c;亲戚的亲戚…

调研活动怎么做_及时掌握市场趋势

标题&#xff1a;掌握市场趋势&#xff0c;开启调研之旅 一、调研活动的重要性 在当今竞争激烈的市场环境中&#xff0c;了解市场趋势和客户需求至关重要。通过开展有效的调研活动&#xff0c;企业可以获取准确的市场信息和用户反馈&#xff0c;为产品研发、市场营销和战略规…

AKConv:具有任意采样形状和任意数目参数的卷积核

文章目录 摘要1、引言2、相关工作3、方法3.1、定义初始采样位置3.2、可变卷积操作3.3、扩展AKConv3.3、扩展AKConv 4、实验4.1、在COCO2017上的目标检测实验4.2、在VOC 712上的目标检测实验4.3、在VisDrone-DET2021上的目标检测实验4.4、比较实验4.5、探索初始采样形状 5、分析…

L1-003:个位数统计

题目描述 给定一个 k 位整数 Ndk−1​10k−1⋯d1​101d0​ (0≤di​≤9, i0,⋯,k−1, dk−1​>0)&#xff0c;请编写程序统计每种不同的个位数字出现的次数。例如&#xff1a;给定 N100311&#xff0c;则有 2 个 0&#xff0c;3 个 1&#xff0c;和 1 个 3。 输入格式&#…

序列号管理

序列号管理&#xff0c;将从以下方面进行学习和阐述 WHY 为什么需要序列号&#xff0c;有什么作用 HOW sap如何进行管理序列号 WHEN 什么情况下适合进行序列号管理 1、 什么是序列号 首先简单介绍一个序列号是什么东西&#xff0c;我们使用的手机、电脑或者大家…

Element的安装与基本使用

文章目录 一.什么是Element?二.Element的安装(Vscode)三.在Vue项目中引入ElementUI组件库四.编写Element的Vue组件文件五.演示如何使用Element官网中的组件根组件中引入Element组件内容进行网页展示 一.什么是Element? Element是饿了么团队研发的一套为开发者与设计师等准备…

centos7-docker安装与使用

文章目录 一、docker简介1.1docker应用场景1.2docker的优点1.2.1快速&#xff0c;一致地交付应用程序1.2.2响应式部署和扩展1.2.3在同一硬件上运行更多工作负载 1.2docker的架构 二、docker的安装2.1新系统的环境搭建2.1.1更换yum源 2.2安装docker与卸载2.2.1yum安装docker2.2.…

set与map

set与map 一、序列式容器与关联式容器二、pair1、键值对2、作用3、构造函数4、make_pair&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;作用 5、代码6、运行结果 三、set1、概念2、代码3、运行结果4、说明 四、multiset1、与set的关系2、代码3、运行结果 五、map…

【Shell】Shell基础学习

一、shell脚本 (1)第一个shell脚本 #!/bin/bash #this is a comment echo "hello world"一个shell脚本永远以“#!”开头,这是一个脚本开始的标记,它是告诉系统执行这个文件需要用某个解释器,后面的/bin/bash就是指明解释器的具体位置。 “#”开头是注释 …

班主任每日工作流程

以下是班主任的每日工作流程&#xff0c;虽然每天的工作都很繁琐&#xff0c;但是为了学生的成长和发展&#xff0c;班主任们必须认真履行职责&#xff0c;用自己的爱心和责任心去呵护每一个学生。 早晨7&#xff1a;30到校&#xff0c;组织学生打扫卫生&#xff0c;检查学生作…