二、Flutter基礎

目錄

  • 1. 什么是Widget?Flutter中的Widget分為哪幾類?
  • 2. StatelessWidget和StatefulWidget的區別
  • 3. StatefulWidget生命周期
  • 4. 什么是BuildContext?
  • 5. 如何優化Widget重建?
  • 6. Flutter布局機制
  • 7. Row/Column的主軸和交叉軸
  • 8. Expanded vs Flexible
  • 9. Key的作用與使用場景
  • 10. 國際化(i18n)實現

1. 什么是Widget?Flutter中的Widget分為哪幾類?

Widget:Flutter應用的基礎構建單元,描述UI元素的配置(如布局、樣式等)。

  • 不可變性:Widget不可變,重建時生成新實例
  • 聲明式UI:通過嵌套Widget樹描述界面

主要分類

類別特點示例
StatelessWidget無狀態,屬性不可變Text
, Icon
, Container
StatefulWidget有狀態,可動態更新Checkbox
, TextField
, Slider
InheritedWidget數據共享,跨層級傳遞Theme
, MediaQuery
ProxyWidget父Widget代理ParentDataWidget
RenderObjectWidget底層渲染控制Opacity
, Transform
// Widget樹示例
Container( // 布局Widgetpadding: EdgeInsets.all(10),child: Column( // 布局Widgetchildren: [Text('Hello', style: TextStyle(fontSize: 20)), // 無狀態WidgetStatefulCounter() // 有狀態Widget],),
)

2. StatelessWidget和StatefulWidget的區別

特性StatelessWidgetStatefulWidget
狀態管理? 無內部狀態? 可維護可變狀態
重建機制完全重建通過State
對象保留狀態
生命周期簡單(僅build)復雜(initState/didUpdateWidget等)
性能更高較低(需維護State)
使用場景靜態內容交互式組件(表單/動畫)

典型場景

  • Stateless:顯示靜態文本/圖標
  • Stateful:計數器、開關按鈕

3. StatefulWidget生命周期

createState
initState
didChangeDependencies
build
didUpdateWidget?
deactivate
dispose

關鍵方法

  1. initState:初始化狀態(調用一次)
  2. didChangeDependencies:依賴變化時調用(如InheritedWidget更新)
  3. build:構建UI(必實現)
  4. didUpdateWidget:父Widget重建時觸發
  5. setState:通知框架狀態變化(觸發rebuild)
  6. deactivate:從樹中移除(可能重新插入)
  7. dispose:永久銷毀,釋放資源

?? 注意:避免在build()中做耗時操作!


4. 什么是BuildContext?

BuildContext是Widget在樹中位置的引用,核心作用:

查找祖先Widget

ThemeData theme = Theme.of(context); // 獲取最近的Theme

導航操作

Navigator.push(context, MaterialPageRoute(...));

Widget狀態管理

ScaffoldState scaffold = Scaffold.of(context);
scaffold.openDrawer(); // 打開抽屜

重要原則

  • 每個Widget有獨立BuildContext
  • Context在Element創建時生成
  • 不可緩存Context(可能失效)

5. 如何優化Widget重建?

優化方案實現方式效果
const構造函數const Text('Hello')避免重復創建相同實例
拆分Widget樹將易變部分拆為子Widget減少重建范圍
使用StatelessWidget優先用于靜態內容降低狀態管理開銷
Keys的正確使用為列表項/狀態Widget設置Key精確控制更新
shouldRebuild@override bool updateShouldNotify控制InheritedWidget更新范圍

代碼示例

// 優化前:整個Card重建
Widget build() {return Card(child: HeavyContent(), // 重組件);
}// 優化后:僅變化部分重建
Widget build() {return const Card(  // const避免重建child: _HeavyContent(), // 拆分為獨立Widget);
}

6. Flutter布局機制

布局流程(自頂向下):

  1. 父Widget傳遞約束(constraints: min/max寬高)
  2. 子Widget確定自身尺寸
  3. 父Widget定位子Widget(根據alignment/offset)

核心原則

  • 約束驅動:父給子約束,子不能超出約束
  • 遞歸布局:深度優先遍歷Widget樹
  • 單次布局:每幀最多布局一次
// 布局示例
ConstrainedBox(constraints: BoxConstraints(minWidth: 100, maxHeight: 200), // 父約束child: Container(width: 150,  // 子確定尺寸(在約束范圍內)height: 180,),
)

7. Row/Column的主軸和交叉軸

布局組件主軸方向交叉軸方向
Row水平(X軸)垂直(Y軸)
Column垂直(Y軸)水平(X軸)

主軸對齊mainAxisAlignment):

  • start/end/center/spaceBetween

交叉軸對齊crossAxisAlignment):

  • stretch/baseline/start
Row(mainAxisAlignment: MainAxisAlignment.spaceAround, // 主軸均勻分布crossAxisAlignment: CrossAxisAlignment.center, // 交叉軸居中children: [ ... ],
)

8. Expanded vs Flexible

特性ExpandedFlexible
繼承關系Flexible的子類基礎類
flex默認值flex=1flex=1(可自定義)
空間占用強制填滿剩余空間按需占用空間
fit行為固定FlexFit.tight可配置FlexFit.loose

使用場景

Row(children: [Container(width: 50), // 固定寬度Expanded( // 占滿剩余寬度child: Text('Expanded Content'),),Flexible( // 按內容寬度占用fit: FlexFit.loose,child: Text('Flexible'),)],
)

9. Key的作用與使用場景

Key的作用
唯一標識Widget,幫助框架在重建時區分相同類型的Widget

使用場景

Key類型適用場景
ValueKey列表項(值唯一時)
ObjectKey復雜對象的列表
UniqueKey強制重建(如動畫重置)
GlobalKey跨組件訪問狀態

示例

ListView.builder(itemBuilder: (ctx, index) {return ListTile(key: ValueKey(items[index].id), // 基于id標識title: Text(items[index].name),);}
)

何時需要Key

  • 動態列表(增刪改操作)
  • 保留狀態(如表單輸入框)
  • 需要跨組件訪問狀態

10. 國際化(i18n)實現

實現步驟

  1. 添加依賴
dependencies:flutter_localizations:sdk: flutterintl: ^0.17.0
  1. 創建ARB文件**lib/l10n/app_en.arb**
{"hello": "Hello!","@hello": {"description": "歡迎語"}
}
  1. 生成本地化類
flutter gen-l10n
  1. 配置MaterialApp
MaterialApp(localizationsDelegates: AppLocalizations.localizationsDelegates,supportedLocales: AppLocalizations.supportedLocales,
)
  1. 使用翻譯
Text(AppLocalizations.of(context)!.hello)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88023.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88023.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88023.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式筆記_創建型_建造者模式

1. 建造者模式介紹 建造者模式是一種創建型設計模式,旨在通過將復雜對象的構建過程與其表示分離,使得同樣的構建過程可以創建不同的表示。它通常用于構造步驟固定但具體實現可能變化的對象。 1.1 功能: 封裝復雜對象的創建過程:適…

【ROS2 自動駕駛學習】03-ROS2常用命令

目錄 1. ros2 pkg list 2. ros2 node list 3. ros2 node info 節點名稱 4. ros2 topic list 5. ros2 topic info 話題名 6. ros2 topic type 話題名 7. ros2 topic find 消息類型 8. ros2 service list 9. ros2 service type 服務名稱 10. ros2 service find 服…

MyBatis-Plus:提升數據庫操作效率的利器

在Java開發中,MyBatis是一個非常流行的持久層框架,它簡化了數據庫操作,提供了靈活的SQL映射功能。然而,隨著項目規模的擴大和業務復雜度的增加,開發者需要更高效、更便捷的方式來處理數據庫操作。MyBatis-Plus應運而生…

App爬蟲實戰篇-以華為真機手機爬取集換社的app為例

前言 在開始學習這篇文章之前,建議你先按照之前2篇文章(App爬蟲工具篇-Appium安裝和App爬蟲工具篇-appium配置),配置必要的環境,才可以繼續完成本章節內容。 電腦連接手機 可以通過usb連接電腦。如果通過adb devices命令,發現沒有連接上,就需要手動配置一些信息 華為…

Vue3組合式API應用:狀態共享與邏輯復用最佳實踐

Vue3組合式API應用:狀態共享與邏輯復用最佳實踐 在Vue3中,組合式API的引入為我們提供了一種全新的方式來編寫Vue組件,并有效地解決了混入和繁瑣邏輯復用的問題。本文將為您介紹如何在Vue3中使用組合式API來實現狀態共享與邏輯復用的最佳實踐&…

在linux 上使用tcpdump監聽http 端口的報文并分析

這里寫目錄標題 1. 使用 tcpdump(原始報文捕獲)觀察:報文翻譯與分析(按行解釋)第一段:客戶端請求報文HTTP 請求頭JSON 請求體第二段:服務器響應報文HTTP 響應頭響應體關鍵問題分析在 Linux 上監聽 HTTP 端口的報文,有多種工具可以實現。以下是幾種常用方法的詳細說明:…

XSStrike 進行 XSS 漏洞測試

XSStrike 是一個功能強大的 XSS 漏洞測試工具,專為檢測、驗證和利用反射型、存儲型、DOM型 XSS 漏洞而設計,適合配合手工測試,也可用于自動化發現。 🛠? 1. 安裝 XSStrike 確保系統中有 Python3 和 git: git clone ht…

any實現(基于LLVM中libcxx實現分析)

本文根據LLVM中libcxx的實現,分析了std::any和std::variant的具體實現。 1 簡介 在 C17 標準中,std::any提供了一種類型安全的方式來存儲任意類型的值。它使用類型擦除(type erasure)技術實現,使得一個對象可以包含任…

網安系列【13】之滲透測試:前期信息收集

文章目錄 前期信息收集信息收集的分類信息收集的內容域名信息收集Whois備案信息whois反查SSL證書查詢域名收集工具IP收集CDN信息收集CDN判斷CDN繞過 端口信息收集常見端口介紹FTP-21SSH-22WWW-80NetBlOSSessionService-139/445MySQL-3306RDP-3389Redis-6379Tomcat-8080 端口掃描…

自動駕駛傳感器的標定與數據融合

目錄 IMU的標定 相機的標定 激光雷達和組合慣導標定 相機和激光雷達標定 傳感器數據融合 多傳感器融合數據處理 傳感器數據融合算法 環境感知與預測 應用實例——車道線識別 應用實例——車輛行人識別 應用實例——交通標志識別 定位系統 基于慣性導航儀的定位技術…

27.移除元素(快慢指針)

給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等于 val 的元素。元素的順序可能發生改變。然后返回 nums 中與 val 不同的元素的數量。 假設 nums 中不等于 val 的元素數量為 k,要通過此題,您需要執行以下操作: 更改…

Spring AI:ETL Pipeline

提取、轉換和加載(ETL)框架是檢索增強生成(RAG)用例中數據處理的支柱。ETL管道協調從原始數據源到結構化向量存儲的流程,確保數據以最佳格式供AI模型檢索。RAG用例是文本,通過從數據體中檢索相關信息來增強…

26.安卓逆向2-frida hook技術-解密響應

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動! 內容參考于:圖靈Python學院 工具下載: 鏈接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

人工智能與人工智障———仙盟創夢IDE

<!-- 桌面導航 -->&#x3C;nav class&#x22;hidden md:flex items-center space-x-8&#x22;&#x3E;&#x3C;a href&#x22;#home&#x22; class&#x22;nav-link text-gray-700 hover:text-primary font-medium&#x22;&#x3E;&#x9996;&…

車載通信架構 --- 以太網相關網絡安全

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

行業實踐案例:金融行業數據治理體系全景解析

“金融行業是數據治理的試金石。” ——高密度數據、高合規要求、高業務依賴,決定了金融治理的復雜度和先進性。 ?? 本文目錄 為什么金融行業對數據治理要求高? 金融行業數據治理的獨特挑戰 金融行業治理框架搭建實踐 典型治理能力案例詳解 工具與平臺選型經驗 總結與啟示 …

C#讀取modbus值,C#讀寫modbus,支持讀寫uint32值,Modbus TCP工具類

C#讀取modbus值&#xff0c;C#讀寫modbus&#xff0c;支持讀寫uint32值&#xff1b;Modbus TCP工具類 需要首先安裝nuget包Modbus using Modbus.Device; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; us…

Oracle注釋詳解

在Oracle SQL中&#xff0c;注釋是用于解釋代碼邏輯、提高可讀性的文本&#xff0c;不會被數據庫執行。Oracle支持兩種類型的注釋語法&#xff1a; 1. 單行注釋&#xff08;--&#xff09; 使用雙連字符--在一行中添加注釋&#xff0c;從--開始到行末的所有內容都會被視為注釋。…

關于 scrapy框架 詳解

scrapy 是一個純 Python 編寫的異步爬蟲框架&#xff0c;具備以下特點&#xff1a;優勢說明異步高效基于 Twisted&#xff0c;非阻塞 IO模塊化各部分可靈活配置/替換中間件機制支持代理、UA、cookie 控制等強大的解析內置 XPath、CSS 提取器自動去重Scheduler 內部維護請求 fin…

DHCP中繼實驗及其核心原理

DHCP 中繼&#xff08;DHCP Relay&#xff09;是一種允許跨網段分配 IP 地址的技術&#xff0c;無需在每個子網部署 DHCP 服務器。以下是其原理和配置方法的詳細說明&#xff1a;一、核心原理1. 為什么需要 DHCP 中繼&#xff1f;問題&#xff1a;DHCP 客戶端通過廣播&#xff…