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控件,TabBarView中的每个页面对应一个Widget。 1.Tab使用自定义图标和颜色 一般UI设计的图会带渐变色之类的,应该保持图片的原…...
双流网络论文精读笔记
精读视频:双流网络论文逐段精读【论文精读】_哔哩哔哩_bilibili Two-Stream Convolutional Networks for Action Recognition in Videos 传统的神经网络难以学习到物体的运动信息,双流网络则通过光流将物体运动信息抽取出来再传递给神经网络 给模型提供…...
机器人与3D视觉 Robotics Toolbox Python 一 安装 Robotics Toolbox Python
一 安装python 库 前置条件需要 Python > 3.6,使用pip 安装 pip install roboticstoolbox-python测试安装是否成功 import roboticstoolbox as rtb print(rtb.__version__)输出结果 二 Robotics Toolbox Python样例程序 加载机器人模型 加载由URDF文件定义…...
JS之Object.defineProperty方法
给对象添加属性的方法有许多,这次让我为大家介绍一种给对象添加属性的静态方法吧! 语法:Objcet.defineProperty(对象的名称,“添加的键名”,{value:键值}) const obj {name:"张三",age:18}// 我…...
卷积神经网络(CNN)注意力检测
文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、数据预处理1.加载数据2. 可视化数据4. 配置数据集 三、调用官方网络模型四、设置动态学习率五、编译六、训练模型七、模型评估1. Accuracy与Loss图2. …...
4. 权限,特权
对数据段特权检查对直接转移的代码段特权检查栈段的检查调用门的检查 权限问题: 由于CPL,DPL 无法完整表达权限的问题. 例如用户程序(CPL3)通过调用门(将调用到内核过程,从低权限到高权限)执行,此时CPL0,此时可以为所欲为.因此加入RPL.此参数由操作系统来保证,CPU仅使用 RPL:…...
云原生系列Go语言篇-泛型Part 2
类型推导和泛型 就像在使用:时支持类型推导一样,在调用泛型函数时Go同样支持类型推导。可在上面对Map、Filter和Reduce调用中看出。有些场景无法进行类型推导(如类型参数仅用作返回值)。这时,必…...
借助ETL快速查询金蝶云星空表单信息
随着数字化转型的加速,企业信息化程度越来越高,大量的数据产生并存储在云端,需要进行有效的数据管理和查询。金蝶云星空是金蝶云旗下的一款云ERP产品,为企业提供了完整的业务流程和数据管理功能,因此需要进行有效的数据…...
基于深度学习的驾驶员状态监测预警系统(正文)
摘 要 近年来驾驶员因疲劳驾驶而造成的交通事故逐年增多,驾驶员的驾驶状态对道路和人身安全产生重大影响,因此做好驾驶员驾驶状态的管理及预警是非常有必要的。 随着深度学习在目标检测算法应用的不断深入,YOLOv5等目标检测算法也相继具有了广…...
读书笔记之《价值》张磊
读书笔记之《价值》张磊 自序 这是一条长期主义之路 长期主义——把时间和信念投入能够长期产生价值的事情中,尽力学习最有效率的思维方式和行为标准,遵循第一性原理,永远探求真理。 真正的投资,有且只有一条标准,那…...
【shell】文本三剑客之sed详解
目录 一、sed简介(行编辑器) 二、基本用法 三、sed脚本格式(匹配地址 脚本命令) 1、不给地址,那么就是针对全文处理 2、单地址,表示#,指定的行,$表示最后一行,/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,j 7,i | j 等于多少? A:1 B:3 C:5 D:7 答案及解析 D |这个是按位或运算符,两个数的二进制位,有1为1,同0为0; i的二进…...
LeetCode 274. H指数——排序
274. H 指数 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她&…...
【洛谷 B2038】奇偶 ASCII 值判断 题解(顺序结构+取余)
奇偶 ASCII 值判断 题目描述 任意输入一个字符,判断其 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO 。 例如,字符 A 的 ASCII 值是 65,则输出 YES,若输入字符 B(ASCII 值是 66…...
Ubuntu 20.4 源代码方式安装 cdo(笔记)
目录 动机安装过程python 调用cdo 动机 我找到的处理 era5-land 代码在需要用到 cdo,但是 sudo apt-get install cdo 总是出现 abort (core dump) 等问题,所以放弃这种安装方式,不走捷径,安装源代码,也就是 cdo-x.x.x…...
电子学会C/C++编程等级考试2022年12月(三级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:鸡兔同笼 一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。 时间限制:1000 内存限制:65536输入 一行,一个正整数a (a < 327…...
二叉树的最近公共祖先(C++实现)
二叉树的最近公共祖先 题目思路代码(详细注释) 题目 二叉树的最近公共祖先 思路 我们可以通过两个栈来实现 实现一个FindPath函数,用来查找从根节点到目标节点的路径(路径可以用栈来保存) 路径保存好后,…...
【conda】容易遗忘的命令使用总结
1. 在空conda虚拟环境中安装python 退出到base环境 conda activate base 执行命令 conda install -n 空环境名 python版本名 例如: conda install -n test python3.10 2. 无需确认直接创建环境 在末尾加上-y,例如: conda create -n tes…...
蓝桥杯第一天-----时间显示
文章目录 前言一、题目描述二、测试用例三、题目分析四、具体代码实现总结 前言 本章中将相信介绍蓝桥杯中关于时间显示的题目。 链接:https://www.lanqiao.cn/problems/1452/learning/ 一、题目描述 二、测试用例 三、题目分析 1.输入的时间为毫秒,毫…...
SuperCom串口调试工具终极指南:快速解决嵌入式开发中的通信难题
SuperCom串口调试工具终极指南:快速解决嵌入式开发中的通信难题 【免费下载链接】SuperCom SuperCom 是一款串口调试工具 项目地址: https://gitcode.com/gh_mirrors/su/SuperCom 想象一下这样的场景:你正在调试一个嵌入式设备,需要同…...
HsMod终极指南:60+功能全面优化炉石传说游戏体验
HsMod终极指南:60功能全面优化炉石传说游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架开发的炉石传说修改插件,提供超过60项实用功…...
旧安卓手机别扔!用Termux+LXC把它变成一台Ubuntu Docker服务器(保姆级避坑指南)
旧安卓设备重生指南:打造低功耗Ubuntu容器服务器的完整方案 你是否曾为抽屉里那台退役的安卓手机感到惋惜?当旗舰机型沦为电子垃圾时,其实它们潜藏的算力足以支撑个人开发环境、轻量级服务甚至家庭自动化中枢。本文将揭示如何通过Termux与LXC…...
2026 收藏版|LangGraph 智能体三大核心工作流,程序员零基础上手大模型开发
本篇全面剖析 2026 主流 LangGraph 智能体三类经典工作流架构,依托任务拆分校验、智能任务分发、多任务并行处理三种思路,全方位提升大模型智能体运行精度与处理效率。每类模式均搭配可直接运行的实战代码案例,贴合新手学习场景,帮…...
OpenSSH regreSSHion漏洞深度解析与零停机修复指南
1. 这个漏洞不是“修一下配置就完事”的普通补丁OpenSSH高危漏洞(CVE-2024-6387)——业内已习惯称它为“regreSSHion”——不是那种改个PermitRootLogin no就能糊弄过去的配置疏漏。我是在凌晨三点被监控告警叫醒的:三台生产跳板机在无任何登…...
告别单调Sprite!在UE5 Niagara中玩转条带渲染器:从参数解析到动态颜色宽度控制
告别单调Sprite!在UE5 Niagara中玩转条带渲染器:从参数解析到动态颜色宽度控制在虚幻引擎5的Niagara粒子系统中,条带渲染器(Ribbon Renderer)一直是被低估的利器。与常见的Sprite渲染器不同,它能够基于粒子…...
ARM SVE2 STNT1H指令:非临时存储优化技术详解
1. ARM SVE指令集与STNT1H指令概述在现代处理器架构中,向量处理技术已经成为提升计算性能的关键手段。作为ARMv9架构的重要组成部分,可扩展向量扩展(Scalable Vector Extension, SVE)指令集通过引入可变长度的向量寄存器,为高性能计算应用提供…...
广义傅里叶特征物理信息极限学习机:高效求解高频偏微分方程
1. 项目概述:当物理信息机器学习遇上高频挑战在科学计算和工程仿真领域,求解偏微分方程(PDE)就像是为复杂的物理世界构建数字孪生。无论是模拟飞机机翼周围的气流,还是预测新材料的热传导性能,最终都归结为…...
mysql视图和用户管理
视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。视图很简单,就是把我们后面的select之前我们使用的时候是形成一…...
跨VM RowHammer攻击防御技术与DRAM安全研究
1. 跨VM RowHammer攻击与防御技术概述在云计算环境中,虚拟机(VM)之间的安全隔离是保障多租户数据安全的核心机制。然而,RowHammer攻击的出现对这一基础安全假设提出了严峻挑战。RowHammer是一种利用DRAM物理特性的硬件漏洞攻击方式,攻击者通过…...
