在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.pswp.cn/bicheng/76311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76311.shtml
英文地址,請注明出處:http://en.pswp.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;。 以下幾種情況需要使…