在Flutter中使用BottomNavigationBar和IndexedStack可以实现一个功能完整的底部导航栏

在Flutter中,使用BottomNavigationBarIndexedStack可以实现一个功能完整的底部导航栏。BottomNavigationBar用于显示底部的导航按钮,而IndexedStack则用于管理页面的切换,确保每个页面的状态得以保留(即页面不会因为切换而重新构建)。

以下是实现的完整代码示例及详细解释:


代码实现

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);Widget build(BuildContext context) {return MaterialApp(title: 'BottomNavigationBar + IndexedStack',theme: ThemeData(primarySwatch: Colors.blue,),home: const BottomNavigationExample(),);}
}class BottomNavigationExample extends StatefulWidget {const BottomNavigationExample({Key? key}) : super(key: key);_BottomNavigationExampleState createState() =>_BottomNavigationExampleState();
}class _BottomNavigationExampleState extends State<BottomNavigationExample> {// 当前选中的索引int _currentIndex = 0;// 页面列表final List<Widget> _pages = [const HomePage(),const SearchPage(),const ProfilePage(),];Widget build(BuildContext context) {return Scaffold(body: IndexedStack(index: _currentIndex, // 根据当前索引显示对应的页面children: _pages,     // 所有页面),bottomNavigationBar: BottomNavigationBar(currentIndex: _currentIndex, // 当前选中的索引onTap: (int index) {setState(() {_currentIndex = index; // 更新索引});},items: const [BottomNavigationBarItem(icon: Icon(Icons.home),label: 'Home',),BottomNavigationBarItem(icon: Icon(Icons.search),label: 'Search',),BottomNavigationBarItem(icon: Icon(Icons.person),label: 'Profile',),],),);}
}// 首页
class HomePage extends StatelessWidget {const HomePage({Key? key}) : super(key: key);Widget build(BuildContext context) {return Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: const [Icon(Icons.home, size: 50, color: Colors.blue),Text('Home Page', style: TextStyle(fontSize: 24)),],),);}
}// 搜索页
class SearchPage extends StatelessWidget {const SearchPage({Key? key}) : super(key: key);Widget build(BuildContext context) {return Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: const [Icon(Icons.search, size: 50, color: Colors.green),Text('Search Page', style: TextStyle(fontSize: 24)),],),);}
}// 个人中心页
class ProfilePage extends StatelessWidget {const ProfilePage({Key? key}) : super(key: key);Widget build(BuildContext context) {return Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: const [Icon(Icons.person, size: 50, color: Colors.purple),Text('Profile Page', style: TextStyle(fontSize: 24)),],),);}
}

代码解析

  1. IndexedStack 的作用

    • IndexedStack 是一个特殊的堆栈组件,它会根据 index 属性显示其子组件列表中的某一个子组件。
    • 与普通的 Stack 不同,IndexedStack 只渲染当前索引对应的子组件,但所有子组件的状态都会被保留。因此,当用户切换回某个页面时,该页面的状态不会丢失。
  2. BottomNavigationBar 的配置

    • currentIndex: 表示当前选中的导航项索引。
    • onTap: 当用户点击导航项时触发的回调函数,用于更新 _currentIndex
    • items: 定义了导航栏的每一项,包括图标和标签。
  3. 页面状态保留

    • 使用 IndexedStack 管理页面,而不是直接使用 PageViewNavigator,可以确保每个页面的状态在切换时不会被销毁。这对于需要保存滚动位置、输入框内容等场景非常有用。
  4. 页面切换逻辑

    • 用户点击底部导航栏时,onTap 回调会触发 setState,更新 _currentIndex,从而让 IndexedStack 显示对应索引的页面。

运行效果

  • 应用启动后,默认显示首页(HomePage)。
  • 点击底部导航栏的不同选项,页面会切换到对应的页面(SearchPageProfilePage)。
  • 切换回之前的页面时,页面状态保持不变。

注意事项

  1. 性能优化
    如果页面较多或页面内容较复杂,可以考虑懒加载页面(例如通过 AutomaticKeepAliveClientMixin 实现),以减少内存占用。

  2. 动态数据更新
    如果页面需要动态更新数据,可以在每个页面中使用 StatefulWidget,并通过 setState 或其他状态管理工具(如 ProviderRiverpod)来更新页面内容。

  3. 更多自定义
    BottomNavigationBar 支持更多自定义样式,例如背景颜色、字体大小、图标大小等,可以根据需求调整。


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

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

相关文章

【10】数据结构的矩阵与广义表篇章

目录标题 二维以上矩阵矩阵存储方式行序优先存储列序优先存储 特殊矩阵对称矩阵稀疏矩阵三元组方式存储稀疏矩阵的实现三元组初始化稀疏矩阵的初始化稀疏矩阵的创建展示当前稀疏矩阵稀疏矩阵的转置 三元组稀疏矩阵的调试与总代码十字链表方式存储稀疏矩阵的实现十字链表数据标签…

微服务篇——SpringCloud

服务注册 Spring Cloud5大组件有哪些&#xff1f; 服务注册和发现是什么意思&#xff1f;Spring Cloud如何实现服务注册发现&#xff1f; nacos与eureka的区别 负载均衡 如何实现负载均衡&#xff1f; Ribbon负载均衡的策略有哪些&#xff1f; 如何自定义负载均衡的策略&…

【小沐杂货铺】基于Three.JS绘制三维数字地球Earth(GIS 、WebGL、vue、react,提供全部源代码)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

Cursor 在前端需求开发工作流中的应用|得物技术

一、引言 很高兴与大家分享现阶段 Cursor 在我的工作中的使用体验。首先是预期管理&#xff0c;本篇文章不会分享 x 个你可能不知道的小技巧&#xff0c;也不会让你拥有无需自行编码的能力&#xff0c;同时不涉及 Cursor 工程化方面内容。仅仅是围绕个人开发流程中的已有问题&…

PyQt学习记录

PyQt学习记录 要在界面上 创建一个控件&#xff0c;就需要在程序代码中 创建 这个 控件对应类 地一个 实例对象。 在Qt系统中&#xff0c;控件&#xff08;widget&#xff09;是 层层嵌套 的&#xff0c;除了最顶层的控件&#xff0c;其他的控件都有父控件。 几个函数 函数mo…

react: styled-components实现原理 标签模版

styled-components是针对react中一个前端广泛使用的css-in-js样式库B站 利用标签模版 利用ES6中的 标签模版文档标签模板其实不是模板&#xff0c;而是函数调用的一种特殊形式。“标签”指的就是函数&#xff0c;紧跟在后面的模板字符串就是它的参数。 let a 5; let b 10;…

网络安全应急响应之文件痕迹排查:从犯罪现场到数字狩猎的进化论

凌晨3点&#xff0c;某金融企业的服务器突然告警&#xff0c;核心数据库出现未知进程访问。安全团队紧急介入时&#xff0c;攻击者已抹去日志痕迹。在这场与黑客的时间赛跑中&#xff0c;文件痕迹排查成为破局关键。本文将带您深入数字取证的"案发现场"&#xff0c;揭…

多模态大语言模型arxiv论文略读(七)

MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文标题&#xff1a;MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文作者&#xff1a;Zhiyuan Zhao, Linke Ouyang, Bin Wang, Siyuan Huang, Pan Zhang, Xiaoyi Dong, Jiaqi Wang,…

idea插件:AICommit,智能生成Git提交信息

AICommit&#xff1a;智能生成Git提交信息的IDEA插件指南 一、AICommit插件介绍 AICommit是一款专为开发者设计的IntelliJ IDEA插件&#xff0c;它利用人工智能技术自动生成清晰、规范的Git提交信息(Commit Message)。该插件能够分析你的代码变更&#xff0c;理解修改的上下文…

js 拷贝-包含处理循环引用问题

在 JavaScript 中&#xff0c;拷贝对象和数组时需要特别注意&#xff0c;因为对象和数组是引用类型&#xff0c;直接赋值只会复制引用&#xff0c;而不是实际的数据。以下是几种常见的拷贝方法及其应用场景&#xff1a; 1. 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝…

oracle将varchar2 转为clob类型存储。 oracle不支持直接使用sql,将 varchar2 到clob的类型转换,需要下面操作

将一个现有表中的 VARCHAR2 列数据迁移到一个 CLOB 列的过程。以下是对每一步操作的说明&#xff1a; 1. 添加一个新的 CLOB 类型列 首先&#xff0c;向表中添加一个新的 CLOB 类型的列。这个列将用来存储原本的 VARCHAR2 数据。 ALTER TABLE your_table ADD (new_column CL…

Dynamics 365 Business Central Recurring Sales Lines 经常购买销售行 来作 订阅

#D365 BC ERP# #Navision# 前面有节文章专门介绍了BC 2024 Wave 2 支持的更好的Substription & Recurring Billing。 其实在D365 BC ERP中一直有一个比较简单的订阅模块Recrring Sales Lines。本文将介绍一下如何用Recurring Sales Lines来 实施简易的订阅Substription。具…

算法比赛中常用的数学知识

一、求某个整数的正约数个数与正约数之和 1.1求某个正整数N的正约数个数 public class Main {public static void main(String[] args) {System.out.println(count(360));//结果为24}public static long count(long number){long count1;for(long i2;i<Math.sqrt(number);…

虚拟Ubuntu系统 开机提示:SMBus Host controller not enabled 后正常启动,去除这个提示提升开机速度。

如题&#xff0c;虚拟机中的Ubuntu系统开机提示&#xff1a;SMBus Host controller not enabled&#xff0c;虽然能正常启动&#xff0c;但不仅影响开机速度&#xff0c;而且还膈应人。 使用命令查看模块 lsmod | grep piix4 发现i2c_piix4有问题&#xff0c; 禁止 i2c_piix4…

NLP基础知识 与 词向量的转化方法 发展

目录 1.NLP 基础知识点 为什么需要自然语言处理? 自然语言处理有哪些分类? 自然语言处理有哪些实际应用? 为什么需要自然语言处理? 自然语言处理有哪些分类? 自然语言处理有哪些实际应用? 自然语言处理的技术/工作原理是什么? 2.NLP文本转化为词向量的方法 2…

【FPGA基础学习】状态机思想实现流水灯

目录 一、用状态机实现LED流水灯1.状态机思想简介1. 1基本概念1.2.核心要素1.3分类与模型 2.LED流水灯 二、CPLD与FPGA1.技术区别2.应用场景3.设计选择建议 三、HDLbits组合逻辑题目 一、用状态机实现LED流水灯 1.状态机思想简介 1. 1基本概念 ​ 状态机&#xff08;Finite …

CSS语言的游戏AI

CSS语言的游戏AI探讨 随着技术的飞速发展&#xff0c;游戏行业也在不断地革命和演变。游戏中的人工智能&#xff08;AI&#xff09;作为一种重要的设计元素&#xff0c;其复杂性和智能程度对游戏的体验、玩法和整体表现都有着深远的影响。近年来&#xff0c;CSS&#xff08;Ca…

docker配置redis容器时配置文件docker-compose.yml示例

1.配置数据节点&#xff08;主从节点&#xff09; version: 3.7 services:master:image: redis:5.0.9container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: redis:5.0.9container_name: redis-slave1restart: a…

【WPF】IOC控制反转的应用:弹窗但不互相调用ViewModel

全称&#xff1a;Inversion of Control&#xff0c;控制反转 场景&#xff1a;A页面需要调用B/C页面等&#xff0c;防止直接在VM中新建别的页面实例&#xff0c;使用IOC设计架构&#xff1b; 创建Service&#xff0c;在Service中实现页面的实例创建和定义页面输入输出参数。 在…

MySQL学习笔记十五

第十七章组合查询 17.1组合查询 MySQL允许执行多个查询&#xff08;多条SELECT语句&#xff09;&#xff0c;并将结果作为单个查询结果集返回。这些组合查询通常称为并&#xff08;union&#xff09;或复合查询&#xff08;compound query&#xff09;。 以下几种情况需要使…