当前位置: 首页 > news >正文

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,隐藏下划线),),),);}
}

相关文章:

Flutter创建TabBar

使用TabBar和TabBarView来创建一个包含"首页"、"分类"和"我的"的TabBar。每个Tab对应一个Tab控件&#xff0c;TabBarView中的每个页面对应一个Widget。 1.Tab使用自定义图标和颜色 一般UI设计的图会带渐变色之类的&#xff0c;应该保持图片的原…...

双流网络论文精读笔记

精读视频&#xff1a;双流网络论文逐段精读【论文精读】_哔哩哔哩_bilibili Two-Stream Convolutional Networks for Action Recognition in Videos 传统的神经网络难以学习到物体的运动信息&#xff0c;双流网络则通过光流将物体运动信息抽取出来再传递给神经网络 给模型提供…...

机器人与3D视觉 Robotics Toolbox Python 一 安装 Robotics Toolbox Python

一 安装python 库 前置条件需要 Python > 3.6&#xff0c;使用pip 安装 pip install roboticstoolbox-python测试安装是否成功 import roboticstoolbox as rtb print(rtb.__version__)输出结果 二 Robotics Toolbox Python样例程序 加载机器人模型 加载由URDF文件定义…...

JS之Object.defineProperty方法

给对象添加属性的方法有许多&#xff0c;这次让我为大家介绍一种给对象添加属性的静态方法吧&#xff01; 语法&#xff1a;Objcet.defineProperty(对象的名称&#xff0c;“添加的键名”&#xff0c;{value&#xff1a;键值}) const obj {name:"张三",age:18}// 我…...

卷积神经网络(CNN)注意力检测

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1.加载数据2. 可视化数据4. 配置数据集 三、调用官方网络模型四、设置动态学习率五、编译六、训练模型七、模型评估1. Accuracy与Loss图2. …...

4. 权限,特权

对数据段特权检查对直接转移的代码段特权检查栈段的检查调用门的检查 权限问题: 由于CPL,DPL 无法完整表达权限的问题. 例如用户程序(CPL3)通过调用门(将调用到内核过程,从低权限到高权限)执行,此时CPL0,此时可以为所欲为.因此加入RPL.此参数由操作系统来保证,CPU仅使用 RPL:…...

云原生系列Go语言篇-泛型Part 2

类型推导和泛型 就像在使用​​:​​时支持类型推导一样&#xff0c;在调用泛型函数时Go同样支持类型推导。可在上面对​​Map​​、​​Filter​​和​​Reduce​​调用中看出。有些场景无法进行类型推导&#xff08;如类型参数仅用作返回值&#xff09;。这时&#xff0c;必…...

借助ETL快速查询金蝶云星空表单信息

随着数字化转型的加速&#xff0c;企业信息化程度越来越高&#xff0c;大量的数据产生并存储在云端&#xff0c;需要进行有效的数据管理和查询。金蝶云星空是金蝶云旗下的一款云ERP产品&#xff0c;为企业提供了完整的业务流程和数据管理功能&#xff0c;因此需要进行有效的数据…...

基于深度学习的驾驶员状态监测预警系统(正文)

摘 要 近年来驾驶员因疲劳驾驶而造成的交通事故逐年增多&#xff0c;驾驶员的驾驶状态对道路和人身安全产生重大影响&#xff0c;因此做好驾驶员驾驶状态的管理及预警是非常有必要的。 随着深度学习在目标检测算法应用的不断深入&#xff0c;YOLOv5等目标检测算法也相继具有了广…...

读书笔记之《价值》张磊

读书笔记之《价值》张磊 自序 这是一条长期主义之路 长期主义——把时间和信念投入能够长期产生价值的事情中&#xff0c;尽力学习最有效率的思维方式和行为标准&#xff0c;遵循第一性原理&#xff0c;永远探求真理。 真正的投资&#xff0c;有且只有一条标准&#xff0c;那…...

【shell】文本三剑客之sed详解

目录 一、sed简介&#xff08;行编辑器&#xff09; 二、基本用法 三、sed脚本格式&#xff08;匹配地址 脚本命令&#xff09; 1、不给地址&#xff0c;那么就是针对全文处理 2、单地址&#xff0c;表示#&#xff0c;指定的行&#xff0c;$表示最后一行&#xff0c;/pattt…...

Centos7 制作Openssh9.5 RPM包

Centos7 制作Openssh9.5 RPM包 最近都在升级Openssh版本到9.3.在博客里也放了openssh 9.5的rpm包. 详见:https://blog.csdn.net/qq_29974229/article/details/133878576 但还是有小伙伴不停追问这个rpm包是怎么做的,怕下载别人的rpm包里被加了盐. 于是做了个关于怎么用官方的o…...

C语言--每日选择题--Day30

第一题 1. i 5&#xff0c;j 7&#xff0c;i | j 等于多少&#xff1f; A&#xff1a;1 B&#xff1a;3 C&#xff1a;5 D&#xff1a;7 答案及解析 D &#xff5c;这个是按位或运算符&#xff0c;两个数的二进制位&#xff0c;有1为1&#xff0c;同0为0&#xff1b; i的二进…...

LeetCode 274. H指数——排序

274. H 指数 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&…...

【洛谷 B2038】奇偶 ASCII 值判断 题解(顺序结构+取余)

奇偶 ASCII 值判断 题目描述 任意输入一个字符&#xff0c;判断其 ASCII 是否是奇数&#xff0c;若是&#xff0c;输出 YES&#xff0c;否则&#xff0c;输出 NO 。 例如&#xff0c;字符 A 的 ASCII 值是 65&#xff0c;则输出 YES&#xff0c;若输入字符 B(ASCII 值是 66…...

Ubuntu 20.4 源代码方式安装 cdo(笔记)

目录 动机安装过程python 调用cdo 动机 我找到的处理 era5-land 代码在需要用到 cdo&#xff0c;但是 sudo apt-get install cdo 总是出现 abort (core dump) 等问题&#xff0c;所以放弃这种安装方式&#xff0c;不走捷径&#xff0c;安装源代码&#xff0c;也就是 cdo-x.x.x…...

电子学会C/C++编程等级考试2022年12月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:鸡兔同笼 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。 时间限制:1000 内存限制:65536输入 一行,一个正整数a (a < 327…...

二叉树的最近公共祖先(C++实现)

二叉树的最近公共祖先 题目思路代码&#xff08;详细注释&#xff09; 题目 二叉树的最近公共祖先 思路 我们可以通过两个栈来实现 实现一个FindPath函数&#xff0c;用来查找从根节点到目标节点的路径&#xff08;路径可以用栈来保存&#xff09; 路径保存好后&#xff0c;…...

【conda】容易遗忘的命令使用总结

1. 在空conda虚拟环境中安装python 退出到base环境 conda activate base 执行命令 conda install -n 空环境名 python版本名 例如&#xff1a; conda install -n test python3.10 2. 无需确认直接创建环境 在末尾加上-y&#xff0c;例如&#xff1a; conda create -n tes…...

蓝桥杯第一天-----时间显示

文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接&#xff1a;https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒&#xff0c;毫…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...