常見問題
關於 Flutter 的常見問題解答。
介紹
#此頁面收集了關於 Flutter 的一些常見問題。您也可以檢視以下專業領域的常見問題解答
什麼是 Flutter?
#Flutter 是 Google 的行動式 UI 工具包,用於透過單一程式碼庫構建美觀、原生編譯的移動、Web 和桌面應用程式。Flutter 可與現有程式碼配合使用,被世界各地的開發者和組織使用,並且是免費開源的。
Flutter 是為誰準備的?
#對於使用者來說,Flutter 讓精美的應用煥發活力。
對於開發者來說,Flutter 降低了構建應用的門檻。它加快了應用開發速度,並降低了跨平臺應用生產的成本和複雜性。
對於設計師來說,Flutter 提供了一個高階使用者體驗的畫布。Fast Company 曾將 Flutter 描述為十年中最頂尖的設計理念之一,因為它能夠將概念轉化為生產程式碼,且無需受制於典型框架帶來的折衷方案。它還充當了一個高效的原型設計工具,配有如 FlutterFlow 等拖拽式工具,以及像 Zapp! 這樣的基於 Web 的 IDE。
對於工程經理和企業來說,Flutter 允許將應用開發者統一為一個單一的移動、Web 和桌面應用團隊,透過單一程式碼庫為多個平臺構建品牌應用。Flutter 加速了功能開發,並同步了整個客戶群的釋出時間表。
使用 Flutter 需要多少開發經驗?
#熟悉面向物件概念(類、方法、變數等)和指令式程式設計概念(迴圈、條件等)的程式設計師都能輕鬆上手 Flutter。
我們看到許多程式設計經驗極少的人也學會並使用 Flutter 進行原型設計和應用開發。
我可以用 Flutter 構建什麼樣的應用?
#Flutter 旨在支援在 Android 和 iOS 上執行的移動應用,以及您希望在網頁或桌面上執行的互動式應用。
需要提供高度品牌化設計的應用特別適合使用 Flutter。當然,您也可以使用 Flutter 建立與 Android 和 iOS 設計語言相匹配的畫素級完美體驗。
Flutter 的 包生態系統 支援各種硬體(如攝像頭、GPS、網路和儲存)和服務(如支付、雲端儲存、身份驗證和廣告)。
誰開發了 Flutter?
#Flutter 是一個開源專案,由 Google 以及其他公司和個人共同貢獻。
誰在使用 Flutter?
#Google 內外的開發者都使用 Flutter 構建美觀的原生編譯應用,涵蓋 iOS 和 Android。要了解其中一些應用,請訪問 展示頁面 (showcase)。
Flutter 的獨特之處是什麼?
#Flutter 與大多數其他構建移動應用的方案不同,因為它不依賴於 Web 瀏覽器技術,也不依賴於每臺裝置自帶的小部件集。相反,Flutter 使用自己的高效能渲染引擎來繪製小部件。
此外,Flutter 的不同之處在於它只有一個輕量級的 C/C++ 程式碼層。Flutter 的大部分系統(合成、手勢、動畫、框架、小部件等)都是用 Dart(一種現代、簡潔、面向物件的語言)實現的,開發者可以輕鬆地閱讀、更改、替換或刪除這些程式碼。這賦予了開發者對系統極大的控制權,同時也顯著降低了大多數系統元件的理解門檻。
我應該用 Flutter 構建我的下一個生產級應用嗎?
#Flutter 1 於 2018 年 12 月 4 日釋出,Flutter 2 於 2021 年 3 月 3 日釋出,Flutter 3 於 2023 年 5 月 10 日釋出。截至 2023 年 5 月,已有超過一百萬個應用使用 Flutter 釋出到數億臺裝置上。在展示頁面檢視一些示例應用。
Flutter 大約每季度釋出一次更新,以提高穩定性和效能,並解決使用者廣泛關注的需求。
Flutter 提供了什麼?
#Flutter SDK 包含什麼?
#Flutter 包括:
- 高度最佳化、移動優先的 2D 渲染引擎,對文字有出色的支援
- 現代 React 風格框架
- 豐富的實現了 Material Design 和 iOS 風格的小部件集
- 用於單元測試和整合測試的 API
- 用於連線系統和第三方 SDK 的互操作與外掛 API
- 用於在 Windows、Linux 和 Mac 上執行測試的無頭(Headless)測試執行器
- Flutter DevTools(也稱為 Dart DevTools),用於測試、除錯和分析您的應用
- 用於建立、構建、測試和編譯應用的命令列工具
Flutter 是否支援任何編輯器或 IDE?
#我們為 VS Code、Antigravity (AI 輔助 IDE)、Android Studio 和 IntelliJ IDEA 提供外掛。有關設定詳情,請參閱 編輯器配置,關於如何使用外掛的技巧,請參閱 VS Code 和 Android Studio/IntelliJ 文件。
或者,您也可以在終端中使用 flutter 命令,配合支援 Dart 編輯 的眾多編輯器之一。
Flutter 是否自帶框架?
#是的!Flutter 自帶現代 React 風格框架。Flutter 的框架設計為分層且可自定義(且可選)。開發者可以選擇僅使用框架的一部分,甚至完全替換框架的上層。
Flutter 是否自帶小部件(Widgets)?
#是的!Flutter 自帶一套高質量的 Material Design 和 Cupertino (iOS 風格) 小部件、佈局和主題。當然,這些小部件只是一個起點。Flutter 的設計旨在讓建立自己的小部件或自定義現有小部件變得簡單。
Flutter 是否支援 Material Design?
#是的!Flutter 和 Material 團隊緊密協作,全面支援 Material 設計。有關更多資訊,請檢視小部件目錄中的 Material 2 和 Material 3 小部件。
Flutter 是否自帶測試框架?
#是的,Flutter 提供了用於編寫單元測試和整合測試的 API。瞭解更多關於 使用 Flutter 進行測試 的內容。
我們使用自己的測試能力來測試 SDK,並且在每次提交時都會測量我們的 測試覆蓋率。
Flutter 是否自帶除錯工具?
#是的,Flutter 自帶 Flutter DevTools(也稱為 Dart DevTools)。有關更多資訊,請參閱 使用 Flutter 除錯 和 Flutter DevTools 文件。
Flutter 是否自帶依賴注入框架?
#我們沒有提供官方的預設方案,但社群有許多提供依賴注入和服務定位的包,例如 injectable、get_it、kiwi 和 riverpod。
技術
#Flutter 是用什麼技術構建的?
#Flutter 是使用 C、C++、Dart、Skia(2D 渲染引擎)和 Impeller(iOS 上的預設渲染引擎)構建的。檢視此 架構圖 以更清楚地瞭解主要元件。有關 Flutter 分層架構的詳細描述,請閱讀 架構概覽。
Flutter 如何在 Android 上執行我的程式碼?
#引擎的 C 和 C++ 程式碼使用 Android 的 NDK 編譯。Dart 程式碼(SDK 的程式碼以及您的程式碼)被提前(AOT)編譯為原生的 ARM 和 x86-64 庫。這些庫被包含在一個“執行器”Android 專案中,整個專案被構建成一個 .apk。應用啟動時,會載入 Flutter 庫。任何渲染、輸入、事件處理等都委託給編譯後的 Flutter 和應用程式碼。這與許多遊戲引擎的工作方式類似。
在除錯模式下,Flutter 使用虛擬機器 (VM) 來執行其程式碼,以實現有狀態的熱過載功能。該功能允許您在不重新編譯的情況下對正在執行的程式碼進行更改。在此模式下執行時,應用右上角會出現一個“debug”橫幅,提醒您效能並非成品釋出應用的最終特性。
Flutter 如何在 iOS 上執行我的程式碼?
#引擎的 C 和 C++ 程式碼使用 LLVM 編譯。Dart 程式碼(SDK 的程式碼以及您的程式碼)被提前(AOT)編譯為原生的 ARM 庫。該庫被包含在一個“執行器”iOS 專案中,整個專案被構建成一個 .ipa。應用啟動時,會載入 Flutter 庫。任何渲染、輸入、事件處理等都委託給編譯後的 Flutter 和應用程式碼。這與許多遊戲引擎的工作方式類似。
在除錯模式下,Flutter 使用虛擬機器 (VM) 來執行其程式碼,以實現有狀態的熱過載功能。該功能允許您在不重新編譯的情況下對正在執行的程式碼進行更改。在此模式下執行時,應用右上角會出現一個“debug”橫幅,提醒您效能並非成品釋出應用的最終特性。
Flutter 是否使用我作業系統內建的平臺小部件?
#不是。相反,Flutter 提供了一套由其框架和引擎管理並渲染的小部件(包括 Material Design 和 Cupertino (iOS 風格) 小部件)。您可以瀏覽 Flutter 小部件目錄。
我們相信最終結果是更高質量的應用。如果我們重用內建的平臺小部件,Flutter 應用的質量和效能將受限於這些小部件的靈活性和質量。
例如,在 Android 中,有一套硬編碼的手勢規則用於消除衝突。在 Flutter 中,您可以編寫自己的手勢識別器,它是手勢系統中的一等公民。此外,由不同人編寫的兩個小部件可以協同工作來消除手勢歧義。
現代應用設計趨勢指向設計師和使用者需要更具動感、以品牌為主導的 UI。為了實現這種定製化、美觀的設計水平,Flutter 的架構設計為直接驅動畫素,而不是使用內建小部件。
透過使用相同的渲染器、框架和一組小部件,從同一程式碼庫釋出到多個平臺變得更容易,無需為了對齊不同的功能集和 API 特性而進行謹慎且昂貴的規劃。
透過為您的所有程式碼使用單一語言、單一框架和單一庫(無論您的 UI 是否針對每個平臺有所不同),我們也旨在幫助降低應用開發和維護成本。
當我的移動作業系統更新並引入新小部件時會發生什麼?
#Flutter 團隊密切關注 iOS 和 Android 對新移動小部件的採用和需求,並致力於與社群合作,為新小部件構建支援。這項工作可能以底層框架功能、新的可組合小部件或新的小部件實現的形式出現。
Flutter 的分層架構旨在支援眾多的元件庫,我們鼓勵並支援社群構建和維護元件庫。
當我的移動作業系統更新並引入新的平臺功能時會發生什麼?
#Flutter 的互操作和外掛系統旨在允許開發者立即訪問新的移動作業系統特性和能力。開發者無需等待 Flutter 團隊來公開這些新的移動作業系統功能。
Flutter 支援熱更新(Code Push)嗎?
#熱更新(Code Push),即直接向用戶裝置推送應用更新的能力,並不直接由 Flutter 支援。不過,我們瞭解到有一個第三方解決方案,名為 Shorebird。請注意,這並非官方認可或推薦。
我可以使用哪些作業系統來構建 Flutter 應用?
#Flutter 支援在 Linux、macOS、ChromeOS 和 Windows 上進行開發。
Flutter 是用什麼語言編寫的?
#Dart,一種快速增長的現代語言,針對客戶端應用進行了最佳化。底層的圖形框架和 Dart 虛擬機器是用 C/C++ 實現的。
為什麼 Flutter 選擇使用 Dart?
#在初始開發階段,Flutter 團隊考察了許多語言和執行時,最終為框架和小部件採用了 Dart。Flutter 使用四個主要維度進行評估,並考慮了框架作者、開發者和終端使用者的需求。我們發現許多語言滿足部分要求,但 Dart 在我們所有的評估維度上都得分很高,並滿足了我們所有的需求和標準。
Dart 執行時和編譯器支援 Flutter 所需的兩個關鍵特性組合:基於 JIT 的快速開發週期(允許在具備型別的語言中進行形狀更改和有狀態熱過載),以及能夠生成高效 ARM 程式碼的 Ahead-of-Time (AOT) 編譯器,確保生產部署的快速啟動和可預測的效能。
此外,我們有機會與 Dart 社群緊密合作,該社群正積極投入資源以改善 Dart 在 Flutter 中的使用體驗。例如,當我們採用 Dart 時,該語言還沒有用於生產原生二進位制檔案的 AOT 工具鏈,這對於實現可預測的高效能至關重要;但現在該語言具備了這一功能,因為 Dart 團隊專門為 Flutter 構建了它。同樣,Dart VM 以前針對吞吐量進行了最佳化,但該團隊現在正在針對延遲最佳化 VM,這對 Flutter 的負載更為重要。
Dart 在以下主要標準上為我們贏得了高分:
- 開發者生產力
-
Flutter 的主要價值主張之一是,它透過允許開發者使用同一程式碼庫為 iOS 和 Android 建立應用,從而節省了工程資源。使用一種高生產力的語言可以進一步加速開發者的進度,使 Flutter 更有吸引力。這對我們的框架團隊和開發者都非常重要。Flutter 的大部分內容是用我們提供給使用者的同一種語言構建的,因此我們需要在數萬行程式碼規模下保持高效,同時不犧牲框架和小部件對開發者的易用性和可讀性。
- 面向物件
-
對於 Flutter,我們想要一種適合 Flutter 問題領域的語言:建立視覺化使用者體驗。該行業在用面嚮物件語言構建 UI 框架方面擁有數十年的經驗。雖然我們可以使用非面嚮物件語言,但這將意味著為了解決幾個困難問題而重新發明輪子。此外,絕大多數開發者都擁有面向物件開發的經驗,這使得學習如何使用 Flutter 進行開發變得更容易。
- 可預測的高效能
-
使用 Flutter,我們希望賦能開發者建立快速、流暢的使用者體驗。為了實現這一目標,我們需要能夠在每個動畫幀期間執行大量的端開發者程式碼。這意味著我們需要一種既能提供高效能又能提供可預測效能的語言,且不會出現導致掉幀的週期性停頓。
- 快速記憶體分配
-
Flutter 框架使用一種函式式風格的流程,非常依賴於底層記憶體分配器高效處理小型、短命的分配。這種風格是在具有此屬性的語言中開發的,在缺乏此功能的語言中無法高效工作。
Flutter 可以執行任何 Dart 程式碼嗎?
#Flutter 可以執行不直接或間接匯入 dart:mirrors 或 dart:html 的 Dart 程式碼。
Flutter 可以將 Dart 編譯為 JavaScript 嗎?
#Flutter 使用 js.dart 包將 Dart 編譯為 JavaScript。
Flutter 引擎有多大?
#2021 年 3 月,我們測量了一個 最小 Flutter 應用(無 Material Components,僅一個 Center 小部件,使用 flutter build apk --split-per-abi 構建)的下載大小,作為釋出 APK 捆綁並壓縮後,ARM32 約為 4.3 MB,ARM64 約為 4.8 MB。
在 ARM32 上,核心引擎約為 3.4 MB(壓縮後),框架 + 應用程式碼約為 765 KB(壓縮後),LICENSE 檔案為 58 KB(壓縮後),必要的 Java 程式碼 (classes.dex) 為 120 KB(壓縮後)。
在 ARM64 上,核心引擎約為 4.0 MB(壓縮後),框架 + 應用程式碼約為 659 KB(壓縮後),LICENSE 檔案為 58 KB(壓縮後),必要的 Java 程式碼 (classes.dex) 為 120 KB(壓縮後)。
這些數字是使用 apkanalyzer 測量的,該工具也內置於 Android Studio 中。
在 iOS 上,同一個應用的釋出 IPA 在 iPhone X 上的下載大小為 10.9 MB(根據 Apple 的 App Store Connect 報告)。IPA 比 APK 大主要是因為 Apple 會對 IPA 內的二進位制檔案進行加密,導致壓縮效率降低(請參閱 Apple QA1795 文件中 iOS 應用商店具體注意事項 部分)。
當然,我們建議您測量自己的應用。為此,請參閱 測量您的應用大小。
Flutter 如何定義畫素?
#Flutter 使用邏輯畫素,通常僅簡稱為“畫素”。Flutter 的 devicePixelRatio 表示物理畫素與邏輯 CSS 畫素之間的比例。
功能
#我可以期待什麼樣的應用效能?
#通常情況下,您可以期待出色的效能。Flutter 旨在幫助開發者輕鬆實現恆定的 60fps。Flutter 應用使用原生編譯程式碼執行,因此不涉及直譯器。這意味著 Flutter 應用啟動很快。
Flutter 在使用原生程式碼時的效能取決於您的 應用架構。為了獲得最佳效能,請熟悉 Flutter 的 平臺通道 (platform channels)。這些通道提供了一種用於與原生程式碼通訊的非同步訊息傳遞系統。
要了解更多關於效能和 Flutter 的資訊,請參閱 效能常見問題解答。
我可以期待什麼樣的開發週期?從編輯到重新整理需要多長時間?
#Flutter 實現了熱過載 (hot reload) 開發週期。您可以在裝置或模擬器上獲得亞秒級的過載時間。
Flutter 的熱過載是有狀態的 (stateful),因此應用狀態在過載後會保留。這意味著您可以在巢狀深處的螢幕上快速迭代,而無需在每次過載後從主螢幕重新開始。
熱過載 (hot reload) 與 熱重啟 (hot restart) 有什麼區別?
#熱過載透過將更新的原始碼檔案注入到正在執行的 Dart 虛擬機器(VM)中來工作。這不僅會新增新類,還會向現有類新增方法和欄位,並更改現有函式。熱重啟會將狀態重置為應用的初始狀態。
有關更多資訊,請參閱 熱過載。
我可以將 Flutter 應用部署到哪裡?
#您可以將 Flutter 應用編譯並部署到 iOS、Android、Web 和 桌面。
Flutter 在哪些裝置和作業系統版本上執行?
#-
我們支援並測試在各種低端到高階平臺上執行 Flutter。有關我們測試的平臺詳細列表,請參閱 受支援平臺列表。
-
Flutter 支援為
x86-64、armeabi-v7a和arm64-v8a構建提前(AOT)編譯的庫。 -
為 ARMv7 或 ARM64 構建的應用可以在許多 x86-64 Android 裝置上正常執行(使用 ARM 模擬)。
-
我們支援在多種平臺上開發 Flutter 應用。請參閱每個 開發作業系統 下列出的系統要求。
Flutter 可以在 Web 上執行嗎?
#是的,Web 支援在穩定版通道中可用。有關更多詳情,請檢視 Web 構建說明。
我可以使用 Flutter 構建桌面應用嗎?
#是的,桌面支援在 Windows、macOS 和 Linux 上處於穩定狀態。
我可以在現有的原生應用中使用 Flutter 嗎?
#是的,在網站的 add-to-app 部分了解更多資訊。
我可以訪問感測器和本地儲存等平臺服務和 API 嗎?
#是的。Flutter 為開發者提供了開箱即用的對某些特定於平臺的作業系統服務和 API 的訪問許可權。但是,我們希望避免大多數跨平臺 API 中存在的“最小公分母”問題,因此我們不打算為所有原生服務和 API 構建跨平臺 API。
許多平臺服務和 API 在 pub.dev 上都有 現成的包。使用現有的包 非常簡單。
最後,我們鼓勵開發者使用 Flutter 的非同步訊息傳遞系統來建立您自己與 平臺和第三方 API 的整合。開發者可以根據需要公開儘可能多或儘可能少的平臺 API,並構建最適合其專案的抽象層。
我可以擴充套件和自定義捆綁的小部件嗎?
#絕對可以。Flutter 的小部件系統設計為易於自定義。
與其讓每個小部件提供大量引數,Flutter 擁抱組合。小部件由更小的小部件組成,您可以重複使用並將它們以新穎的方式組合起來製作自定義小部件。例如,與其繼承通用按鈕小部件,ElevatedButton 將一個 Material 小部件與一個 GestureDetector 小部件組合在一起。Material 小部件提供視覺設計,而 GestureDetector 小部件提供互動設計。
要建立具有自定義視覺設計的按鈕,您可以將實現您視覺設計的小部件與 GestureDetector 組合,後者提供互動設計。例如,CupertinoButton 遵循此方法,將 GestureDetector 與實現其視覺設計的其他幾個小部件組合在一起。
組合讓您對小部件的視覺和互動設計擁有最大控制權,同時也允許大量程式碼複用。在框架中,我們將複雜的小部件分解為分別實現視覺、互動和運動設計的部分。您可以隨心所欲地重新混合這些小部件,製作出擁有完整表達能力的自定義小部件。
為什麼要跨 iOS 和 Android 共享佈局程式碼?
#您可以選擇為 iOS 和 Android 實現不同的應用佈局。開發者可以自由地在執行時檢查移動作業系統並渲染不同的佈局,儘管我們發現這種做法很少見。
越來越多地,我們看到移動應用佈局和設計演變為以品牌驅動,並在各平臺之間統一。這意味著跨 iOS 和 Android 共享佈局和 UI 程式碼的動力非常強勁。
品牌標識和應用美學設計的自定義現在變得比嚴格遵守傳統平臺美學更為重要。例如,應用設計通常需要自定義字型、顏色、形狀、動態效果等,以清晰地傳達其品牌標識。
我們也看到常見的佈局模式在 iOS 和 Android 之間部署。例如,“底部導航欄”模式現在可以自然地在 iOS 和 Android 上找到。移動平臺之間的設計理念似乎正在融合。
我可以與移動平臺的預設程式語言進行互動嗎?
#是的,Flutter 支援呼叫平臺程式碼,包括在 Android 上整合 Java 或 Kotlin 程式碼,以及在 iOS 上整合 Swift 或 Objective-C 程式碼。這是透過靈活的訊息傳遞風格啟用的,其中 Flutter 應用可以使用 BasicMessageChannel 向移動平臺傳送和接收訊息。
透過 平臺通道 瞭解更多關於在 Flutter 中訪問平臺和第三方服務的資訊。
這是一個 示例專案,展示瞭如何使用平臺通道訪問 iOS 和 Android 上的電池狀態資訊。
Flutter 是否自帶反射/映象(reflection / mirrors)系統?
#不是。Dart 包含 dart:mirrors,它提供型別反射。但由於 Flutter 應用是為生產環境預編譯的,且二進位制大小在移動應用中始終是一個考量,因此該庫在 Flutter 應用中不可用。
使用靜態分析,我們可以剔除任何未使用的內容(“樹搖/tree shaking”)。如果您匯入了一個巨大的 Dart 庫,但只使用了其中一個自包含的兩行方法,那麼您只需為那兩行方法付出代價,即使該 Dart 庫本身匯入了數十個其他庫。只有在 Dart 可以在編譯時識別程式碼路徑的情況下,這種保證才是安全的。迄今為止,我們已經為特定需求找到了提供更好權衡的方法,例如程式碼生成。
是否支援國際化和本地化?
#是的,Flutter 支援國際化 (i18n) 和本地化 (l10n),以便您的應用可以適應不同的語言和文化。您可以在 國際化文件 中瞭解更多資訊。
支援哪些輔助功能?
#Flutter 支援嚴格的輔助功能要求 (a11y)。例如,支援螢幕閱讀器、大文字、色彩對比度和硬體開關控制。要了解更多資訊,請參閱 輔助功能文件。
我該如何為 Flutter 編寫並行或併發應用?
#Flutter 支援 Isolate。Isolate 是 Flutter 虛擬機器中的獨立堆,它們能夠並行執行(通常實現為獨立的執行緒)。Isolate 透過傳送和接收非同步訊息進行通訊。
檢視一個 在 Flutter 中使用 Isolate 的示例。
我可以在 Flutter 應用的後臺執行 Dart 程式碼嗎?
#是的,您可以在 iOS 和 Android 上在後臺程序中執行 Dart 程式碼。有關更多資訊,請參閱免費的中篇部落格文章 使用 Flutter 外掛和地理圍欄在後臺執行 Dart 程式碼。
我可以在 Flutter 中使用 JSON/XML/Protobufs 等嗎?
#絕對可以。在 pub.dev 上有用於 JSON、XML、Protobufs 以及許多其他實用程式和格式的庫。
有關在 Flutter 中使用 JSON 的詳細說明,請檢視 JSON 教程。
我可以使用 Flutter 構建 3D (OpenGL) 應用嗎?
#今天我們不支援使用 OpenGL ES 或類似技術進行 3D 渲染。我們有長期計劃來公開最佳化的 3D API,但目前我們專注於 2D。
為什麼我的 APK 或 IPA 這麼大?
#通常,包括影像、聲音檔案、字型等在內的資產是 APK 或 IPA 的大部分。Android 和 iOS 生態系統中的各種工具可以幫助您瞭解 APK 或 IPA 內部的內容。
此外,請確保使用 Flutter 工具為您的 APK 或 IPA 建立釋出構建 (release build)。釋出構建通常比除錯構建 (debug build) 小得多。
瞭解更多關於建立 Android 應用的釋出構建 以及建立 iOS 應用的釋出構建 的資訊。此外,請檢視 測量您的應用大小。
Flutter 應用可以在 Chromebook 上執行嗎?
#我們已經看到 Flutter 應用在某些 Chromebook 上執行。我們正在追蹤 與在 Chromebook 上執行 Flutter 相關的問題。
Flutter 是否具備 ABI 相容性?
#Flutter 和 Dart 不提供應用二進位制介面 (ABI) 相容性。提供 ABI 相容性不是 Flutter 或 Dart 當前的目標。
Flutter 如何處理滾動?
#每個應用平臺都使用自定義的滾動實現,以便滾動效果與該平臺的原生滾動外觀和感覺相匹配。要了解更多關於使用 Flutter 滾動的資訊,請參閱 滾動 文件。
框架
#為什麼 build() 方法是在 State 類中,而不是在 StatefulWidget 中?
#將 Widget build(BuildContext context) 方法放在 State 中,而不是將 Widget build(BuildContext context, State state) 方法放在 StatefulWidget 中,為開發者在繼承 StatefulWidget 時提供了更大的靈活性。您可以閱讀更 關於 State.build API 文件的詳細討論。
Flutter 的標記語言在哪裡?為什麼 Flutter 沒有標記語法?
#Flutter UI 是用命令式、面向物件的語言(Dart,與構建 Flutter 框架的語言相同)構建的。Flutter 不自帶宣告式標記語言。
我們發現動態構建的 UI 程式碼提供了更大的靈活性。例如,我們發現僵化的標記系統很難表達和生成具有定製行為的小部件。
我們還發現,我們的“程式碼優先”方法能更好地支援熱過載和動態環境適配等特性。
可以建立一個自定義語言,然後在執行時將其轉換為小部件。因為構建方法“只是程式碼”,它們可以做任何事情,包括解釋標記並將其轉化為小部件。
我的應用右上角有一個除錯橫幅。為什麼會看到這個?
#預設情況下,flutter run 命令使用除錯構建配置。
除錯配置在虛擬機器(VM)中執行您的 Dart 程式碼,實現具有 熱過載 的快速開發週期(釋出構建使用標準的 Android 和 iOS 工具鏈進行編譯)。
除錯配置還會檢查所有斷言,這有助於您在開發初期及早發現錯誤,但這會帶來執行時的開銷。“Debug”橫幅表示啟用了這些檢查。您可以使用 flutter run 的 --profile 或 --release 標誌來執行不帶這些檢查的應用。
如果您的 IDE 使用了 Flutter 外掛,您可以在 Profile 或 Release 模式下啟動應用。對於 VS Code,使用 執行 > 開始除錯 或 執行 > 以非除錯模式執行 選單條目。對於 IntelliJ,使用 執行 > 以 Profile 模式執行 Flutter 或 釋出模式 選單條目。
Flutter 框架使用什麼程式設計正規化?
#Flutter 是一個多正規化程式設計環境。過去幾十年來開發的許多程式設計技術在 Flutter 中都有使用。我們根據每種技術的優勢,將其運用在最適合的場景中。以下順序不分先後:
- 組合 (Composition)
-
Flutter 使用的主要正規化是使用行為範圍狹窄的小物件,組合在一起以獲得更復雜的效果,有時稱為積極組合 (aggressive composition)。Flutter 小部件庫中的大多數小部件都是以這種方式構建的。例如,Material
TextButton類是使用一個IconTheme、一個InkWell、一個Padding、一個Center、一個Material、一個AnimatedDefaultTextStyle和一個ConstrainedBox構建的。InkWell是使用GestureDetector構建的。Material是使用AnimatedDefaultTextStyle、一個NotificationListener和一個AnimatedPhysicalModel構建的。依此類推,底層全是小部件。 - 函數語言程式設計
-
整個應用可以僅使用
StatelessWidget構建,它們本質上是描述引數如何對映到其他函式的函式,最終歸結為計算佈局或繪製圖形的原語。(此類應用無法輕鬆擁有狀態,因此通常是非互動式的。)例如,Icon小部件本質上是一個函式,它將其引數(color、icon、size)對映為佈局原語。此外,大量使用了不可變資料結構,包括整個Widget類層次結構以及眾多輔助類,如Rect和TextStyle。在更小的範圍內,Dart 的IterableAPI(大量使用了函式式風格,如 map、reduce、where 等)經常被用於處理框架中的值列表。 - 事件驅動程式設計
-
使用者互動由分發給已註冊事件處理程式回撥的事件物件表示。螢幕更新透過類似的回撥機制觸發。用作動畫系統基礎的
Listenable類,將具有多個監聽器的事件訂閱模型形式化了。 - 基於類的面向物件程式設計
-
框架的大多數 API 都是使用具有繼承關係的類構建的。我們採用一種在基類中定義非常高階的 API,然後在其子類中迭代地進行專門化的方法。例如,我們的渲染物件有一個基類(
RenderObject),它對座標系無感知,然後我們有一個子類(RenderBox),它引入了幾何圖形應基於笛卡爾座標系(x/寬度 和 y/高度)的觀點。 - 基於原型的面向物件程式設計
-
ScrollPhysics類連結例項以在執行時動態組合適用於滾動的物理效果。這讓系統能夠例如將分頁物理與特定於平臺的物理效果組合,而無需在編譯時選擇平臺。 - 指令式程式設計
-
直接的指令式程式設計(通常與封裝在物件中的狀態結合使用)用於提供最直觀的解決方案的地方。例如,測試是以命令式風格編寫的,首先描述被測場景,然後列出測試必須滿足的不變數,然後根據測試需要推進時鐘或插入事件。
- 響應式程式設計
-
小部件樹和元素樹有時被稱為響應式,因為小部件建構函式中提供的新輸入會立即透過小部件的 build 方法傳播為對底層小部件的更改,而底層小部件中的更改(例如,響應使用者輸入)會透過事件處理程式傳播回樹中。框架中存在函式響應式和命令響應式兩方面的特性,具體取決於小部件的需求。build 方法僅包含描述小部件如何響應其配置更改的表示式的小部件是函式式響應式小部件(例如,Material
Divider類)。build 方法在多個語句上構造子項列表,描述小部件如何響應其配置更改的小部件是命令式響應式小部件(例如,Chip類)。 - 宣告式程式設計
-
小部件的 build 方法通常是一個具有多層巢狀建構函式的單一表達式,使用 Dart 的嚴格宣告式子集編寫。此類巢狀表示式可以機械地轉換為任何具有足夠表達能力的標記語言,或從其中轉換。例如,
UserAccountsDrawerHeader小部件有一個很長的 build 方法(20 多行),由一個單一的巢狀表示式組成。這也可以與命令式風格相結合,以構建在純宣告式方法中難以描述的 UI。 - 泛型程式設計
-
型別可以用來幫助開發者及早發現程式設計錯誤。Flutter 框架利用泛型程式設計在這方面提供幫助。例如,
State類根據其關聯小部件的型別進行了引數化,以便 Dart 分析器可以捕獲狀態和小部件的不匹配。同樣,GlobalKey類帶有一個型別引數,以便它可以以型別安全的方式(使用執行時檢查)訪問遠端小部件的狀態;Route介面使用預期在 彈出 (pop) 時使用的型別進行引數化;諸如List、Map和Set等集合都進行了引數化,以便在分析期間或除錯時的執行時可以及早發現不匹配的元素。 - 併發程式設計
-
Flutter 大量使用
Future和其他非同步 API。例如,動畫系統透過完成一個 future 來報告動畫何時完成。影像載入系統類似地使用 future 來報告載入何時完成。 - 約束程式設計
-
Flutter 中的佈局系統使用一種弱形式的約束程式設計來確定場景的幾何形狀。約束(例如,對於笛卡爾框,最小和最大寬度以及最小和最大高度)從父級傳遞給子級,子級選擇一個滿足這些約束的結果幾何形狀(例如,對於笛卡爾框,一個大小,具體為寬度和高度)。透過使用這種技術,Flutter 通常可以用一次透過來佈置整個場景。
專案
#我可以在哪裡獲得支援?
#如果您認為遇到了錯誤,請在我們的 問題追蹤器 (issue tracker) 中提交。對於“如何操作”型別的問題,您也可以使用 Stack Overflow。對於討論,請加入我們的郵件列表 flutter-dev@googlegroups.com 或在 Discord 上尋找我們。
有關更多資訊,請參閱我們的 社群 頁面。
我該如何參與?
#Flutter 是開源的,我們鼓勵您做出貢獻。您可以從在我們的 問題追蹤器 中提交功能請求和 Bug 開始。
我們建議您加入我們的郵件列表 flutter-dev@googlegroups.com,讓我們知道您是如何使用 Flutter 的以及您想用它做什麼。
如果您有興趣貢獻程式碼,可以先閱讀我們的 貢獻指南,並檢視我們的 簡單入門問題列表。
最後,您可以與樂於助人的 Flutter 社群建立聯絡。有關更多資訊,請參閱 社群 頁面。
您還可以與其他開發者在 Flutter Discord 上交流。
Flutter 是開源的嗎?
#是的,Flutter 是一項開源技術。您可以在 GitHub 上找到該專案。
哪些軟體許可證適用於 Flutter 及其依賴項?
#Flutter 包括兩個元件:一個作為動態連結二進位制檔案釋出的引擎,以及一個引擎載入的獨立二進位制檔案 Dart 框架。該引擎使用具有許多依賴項的多個軟體元件;請在其 許可檔案 中檢視完整列表。
框架是完全自包含的,並且 僅需要一個許可證。
此外,您使用的任何 Dart 包可能都有自己的許可要求。
我該如何確定我的 Flutter 應用需要展示哪些許可證?
#有一個 API 可以查詢您需要展示的許可證列表:
-
如果您的應用有一個
Drawer,請新增一個AboutListTile。 -
如果您的應用沒有 Drawer,但確實使用了 Material Components 庫,請呼叫
showAboutDialog或showLicensePage。 -
對於更自定義的方法,您可以從
LicenseRegistry獲取原始許可證。
誰在開發 Flutter?
#我們都在做!Flutter 是一個開源專案。目前,大部分開發工作由 Google 的工程師完成。如果您對 Flutter 感到興奮,我們鼓勵您加入社群並 為 Flutter 做出貢獻!
Flutter 的指導原則是什麼?
#我們相信以下幾點:
- 為了觸達每一位潛在使用者,開發者需要針對多個移動平臺。
- 現有的 HTML 和 WebView 由於自動行為(滾動、佈局)和舊版支援,使得始終保持高幀率並提供高保真體驗變得具有挑戰性。
- 今天,多次構建同一個應用的成本太高:它需要不同的團隊、不同的程式碼庫、不同的工作流程、不同的工具等。
- 開發者想要一種更簡單、更好的方法來使用單一程式碼庫構建多個目標平臺的移動應用,且不希望犧牲質量、控制權或效能。
我們專注於三件事:
- 控制權 (Control)
-
開發者應獲得對系統所有層的訪問許可權和控制權。這導致:
- 效能
-
使用者應獲得完美流暢、響應迅速、無卡頓的應用。這導致:
- 保真度 (Fidelity):
-
每個人都應獲得精確、美觀、愉悅的應用體驗。
蘋果會拒絕我的 Flutter 應用嗎?
#我們不能代表 Apple,但他們的 App Store 包含許多使用 Flutter 等框架技術構建的應用。事實上,Flutter 使用與 Unity 相同的基本架構模型,Unity 是為 Apple Store 上許多最流行遊戲提供驅動的引擎。
Apple 經常推薦使用 Flutter 構建的精心設計的應用,包括 Hamilton 和 Reflectly。
與提交到 Apple Store 的任何應用一樣,使用 Flutter 構建的應用應遵循 Apple 的 應用商店提交指南。