常見問題
介紹
#本頁收集了一些關於 Flutter 的常見問題。您也可以檢視以下專門的常見問題解答:
什麼是 Flutter?
#Flutter 是 Google 的行動式 UI 工具包,用於從單一程式碼庫構建精美的、原生編譯的移動、Web 和桌面應用程式。Flutter 可與現有程式碼協同工作,被全球的開發人員和組織使用,並且是免費開源的。
Flutter 是為誰準備的?
#對於使用者而言,Flutter 讓精美的應用栩栩如生。
對於開發者而言,Flutter 降低了構建應用的門檻。它加速了應用開發,並降低了跨平臺應用生產的成本和複雜性。
對於設計師而言,Flutter 為高階使用者體驗提供了畫布。Fast Company 將 Flutter 描述為“十年最重要的設計理念之一”,因為它能夠將概念轉化為生產程式碼,而無需受到典型框架的限制。它還作為一種高效的原型工具,支援拖放工具(如FlutterFlow)和基於 Web 的 IDE(如Zapp!)。
對於工程經理和企業而言,Flutter 允許將應用開發人員統一成一個移動、Web 和桌面應用團隊,僅用一個程式碼庫即可為多個平臺構建品牌應用。Flutter 加速了功能開發,並跨整個客戶群同步釋出計劃。
我需要多少開發經驗才能使用 Flutter?
#對於熟悉面向物件概念(類、方法、變數等)和指令式程式設計概念(迴圈、條件語句等)的程式設計師來說,Flutter 是易於上手的。
我們看到,程式設計經驗很少的人也能學會並使用 Flutter 進行原型設計和應用開發。
我能用 Flutter 構建什麼樣的應用?
#Flutter 旨在支援在 Android 和 iOS 上執行的移動應用,以及您希望在網頁或桌面上執行的互動式應用。
需要交付高度品牌化設計的應用特別適合 Flutter。但是,您也可以使用 Flutter 建立畫素完美的體驗,以匹配 Android 和 iOS 的設計語言。
Flutter 的包生態系統支援各種硬體(如相機、GPS、網路和儲存)以及服務(如支付、雲端儲存、身份驗證和廣告)。
誰在開發 Flutter?
#Flutter 是一個開源專案,有來自 Google 以及其他公司和個人的貢獻。
誰在使用 Flutter?
#Google 內部和外部的開發人員都使用 Flutter 來構建精美的原生編譯的 iOS 和 Android 應用。要了解其中一些應用,請訪問展示臺。
是什麼讓 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 渲染引擎,對文字支援極佳
- 現代響應式框架
- 豐富的控制元件集,實現 Material Design 和 iOS 風格
- 單元測試和整合測試的 API
- 互操作和外掛 API,用於連線系統和第三方 SDK
- 用於在 Windows、Linux 和 Mac 上執行測試的無頭測試執行器
- Flutter DevTools(也稱為 Dart DevTools),用於測試、除錯和分析您的應用
- 用於建立、構建、測試和編譯您應用的命令列工具
Flutter 能與任何編輯器或 IDE 配合使用嗎?
#我們為VS Code、Android Studio和IntelliJ IDEA提供了外掛。有關設定詳細資訊,請參閱編輯器配置;有關如何使用外掛的技巧,請參閱VS Code和Android Studio/IntelliJ。
Firebase Studio(目前為預覽版)是用於雲端全棧、多平臺應用開發的 AI 輔助工作區。Firebase Studio 支援 Dart 和 Flutter。有關更多資訊,請檢視Firebase Studio 入門指南。
或者,您也可以在終端中使用 flutter 命令,以及許多支援編輯 Dart的編輯器。
Flutter 自帶框架嗎?
#是的!Flutter 提供了一個現代響應式框架。Flutter 的框架設計為分層和可定製的(並且是可選的)。開發人員可以選擇只使用框架的一部分,甚至完全替換框架的上層。
Flutter 自帶控制元件(widgets)嗎?
#是的!Flutter 提供了一套高質量的 Material Design 和 Cupertino(iOS 風格)控制元件、佈局和主題。當然,這些控制元件只是一個起點。Flutter 的設計使得建立自己的控制元件或自定義現有控制元件變得容易。
Flutter 支援 Material Design 嗎?
#是的!Flutter 和 Material 團隊密切合作,完全支援 Material Design。有關更多資訊,請檢視控制元件目錄中的 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 控制元件的控制元件目錄。
我們相信最終結果是更高質量的應用。如果我們重用內建的原生控制元件,Flutter 應用的質量和效能將受到這些控制元件的靈活性和質量的限制。
例如,在 Android 中,有一組硬編碼的手勢和固定規則來區分它們。在 Flutter 中,您可以編寫自己的手勢識別器,它將成為手勢系統的一等參與者。此外,由不同人員編寫的兩個控制元件可以協同工作以區分手勢。
現代應用設計趨勢表明,設計師和使用者希望 UI 更加豐富,並且以品牌為中心的設計。為了實現這種定製化、精美的設計水平,Flutter 的架構旨在驅動畫素而不是內建控制元件。
透過使用相同的渲染器、框架和控制元件集,可以更容易地從同一個程式碼庫為多個平臺釋出,而無需進行仔細且成本高昂的規劃來對齊不同的功能集和 API 特性。
透過使用單一語言、單一框架和單一庫集來編寫所有程式碼(無論您的 UI 是否針對每個平臺不同),我們還旨在幫助降低應用開發和維護成本。
當我的移動作業系統更新並引入新控制元件時會發生什麼?
#Flutter 團隊會關注 iOS 和 Android 新移動控制元件的採用和需求,並致力於與社群合作以支援新控制元件。這項工作可能以更低級別的框架功能、新的可組合控制元件或新的控制元件實現的形式出現。
Flutter 的分層架構旨在支援眾多控制元件庫,我們鼓勵並支援社群構建和維護控制元件庫。
當我的移動作業系統更新並引入新的平臺功能時會發生什麼?
#Flutter 的互操作性和外掛系統旨在允許開發人員立即訪問新的移動作業系統功能。開發人員無需等待 Flutter 團隊公開新的移動作業系統功能。
Flutter 支援程式碼推送嗎?
#Flutter 不直接支援程式碼推送(code push),即直接將應用更新推送到使用者裝置的能��。但是,我們知道一個第三方解決方案,稱為Shorebird。請注意,這不是官方認可或推薦。
我可以使用哪些作業系統來構建 Flutter 應用?
#Flutter 支援使用 Linux、macOS、ChromeOS 和 Windows 進行開發。
Flutter 使用什麼語言編寫?
#Dart,一種快速發展的現代語言,針對客戶端應用進行了最佳化。底層的圖形框架和 Dart 虛擬機器是用 C/C++ 實現的。
為什麼 Flutter 選擇使用 Dart?
#在初始開發階段,Flutter 團隊考察了許多語言和執行時,最終為框架和控制元件選擇了 Dart。Flutter 使用四個主要維度進行評估,並考慮了框架作者、開發人員和終端使用者的需求。我們發現許多語言滿足部分要求,但 Dart 在所有評估維度上得分都很高,並滿足我們的所有要求和標準。
Dart 執行時和編譯器支援 Flutter 的兩個關鍵功能的組合:基於 JIT 的快速開發週期,允許在有型別的語言中進行形狀更改和有狀態的熱過載;以及一個 Ahead-of-Time 編譯器,可生成高效的 ARM 程式碼,以實現快速啟動和可預測的生產部署效能。
此外,我們有機會與 Dart 社群密切合作,該社群正在積極投入資源改進 Dart 以供 Flutter 使用。例如,當我們採用 Dart 時,該語言還沒有用於生成原生二進位制檔案的 AOT 工具鏈,這對實現可預測的高效能至關重要,但現在該語言已具備,因為 Dart 團隊為 Flutter 構建了它。同樣,Dart VM 以前針對吞吐量進行了最佳化,但現在團隊正在針對延遲進行最佳化,這對 Flutter 的工作負載更重要。
Dart 在以下主要標準上得分很高:
- 開發者生產力
- Flutter 的主要價值主張之一是它透過讓開發人員用相同的程式碼庫為 iOS 和 Android 建立應用來節省工程資源。使用一種高效的語言可以進一步加速開發人員的工作,並使 Flutter 更具吸引力。這對我們的框架團隊和我們的開發人員來說都非常重要。Flutter 的大部分是用我們提供給使用者的同一種語言構建的,因此我們需要保持 10 萬行程式碼的生產力,而不會犧牲框架和控制元件對開發人員的可訪問性或可讀性。
- 面向物件
- 對於 Flutter,我們希望一種適合 Flutter 問題域的語言:建立視覺使用者體驗。行業在用面嚮物件語言構建使用者介面框架方面擁有數十年的經驗。雖然我們可以使用非面向物件的語言,但這將意味著要重新發明輪子來解決幾個棘手的問題。此外,絕大多數開發人員都有面向物件開發的經驗,這使得學習如何使用 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 App Store 特定注意事項部分)。
當然,我們建議您自己測量您的應用。為此,請參閱測量應用大小。
Flutter 如何定義一個畫素?
#Flutter 使用邏輯畫素,並經常將其簡稱為“畫素”。Flutter 的devicePixelRatio表示物理畫素與邏輯 CSS 畫素之間的比率。
功能
#我能期待什麼樣的應用效能?
#總的來說,您可以期待卓越的效能。Flutter 的設計宗旨是幫助開發人員輕鬆實現恆定的 60fps。Flutter 應用使用原生編譯的程式碼執行,因此不涉及直譯器。這意味著 Flutter 應用啟動速度很快。
Flutter 使用原生程式碼時的效能取決於您的應用架構。為獲得最佳效能,請熟悉 Flutter 的平臺通道。這些通道提供了一個非同步訊息傳遞系統,用於與原生程式碼通訊。
要了解有關效能和 Flutter 的更多資訊,請參閱效能常見問題解答。
我能期待什麼樣的開發週期?從編輯到重新整理需要多長時間?
#Flutter 實現了熱過載開發週期。您可以期待在裝置或模擬器/模擬器上實現亞秒級的過載時間。
Flutter 的熱過載是有狀態的,因此在過載後會保留應用狀態。這意味著您可以在應用中深度巢狀的螢幕上快速迭代,而無需在每次過載後都從主螢幕開始。
熱過載與熱重啟有何不同?
#熱過載透過將更新後的原始檔注入正在執行的 Dart VM(虛擬機器)來工作。這不僅可以新增新類,還可以向現有類新增方法和欄位,並更改現有函式。熱重啟會將狀態重置到應用的初始狀態。
有關更多資訊,請參閱熱過載。
我可以在哪裡部署我的 Flutter 應用?
#您可以將 Flutter 應用編譯並部署到 iOS、Android、Web 和桌面。
Flutter 支援哪些裝置和作業系統版本?
#我們支援並測試在各種低端到高階平臺上執行 Flutter。有關我們測試的平臺的詳細列表,請參閱支援的平臺列表。
Flutter 支援為
x86-64、armeabi-v7a和arm64-v8a構建預編譯(AOT)庫。為 ARMv7 或 ARM64 構建的應用(使用 ARM 模擬)可以在許多 x86-64 Android 裝置上正常執行。
我們支援在各種平臺上開發 Flutter 應用。請參閱每個開發作業系統下的系統要求。
Flutter 能在 Web 上執行嗎?
#是的,Web 支援在穩定版頻道中可用。有關更多詳細資訊,請檢視Web 指南。
我能使用 Flutter 構建桌面應用嗎?
#是的,桌面支援已在 Windows、macOS 和 Linux 上穩定。
我能將 Flutter 整合到我現有的原生應用中嗎?
#是的,請在網站的新增到應用部分了解更多資訊。
我能訪問感測器和本地儲存等平臺服務和 API 嗎?
#是的。Flutter 為開發人員提供了開箱即用的對作業系統某些平臺特定服務和 API 的訪問。但是,我們希望避免大多數跨平臺 API 的“最低公分母”問題,因此我們不打算為所有原生服務和 API 構建跨平臺 API。
Pub.dev 上有許多平臺服務和 API 的現成包。使用現有包非常簡單。
最後,我們鼓勵開發人員使用 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 自帶反射/映象系統嗎?
#不。Dart 包含 dart:mirrors,它提供了型別反射。但由於 Flutter 應用是為生產環境預編譯的,並且二進位制檔案大小始終是移動應用關注的問題,因此該庫不適用於 Flutter 應用。
透過靜態分析,我們可以去除所有未使用的內容(“樹搖”)。如果您匯入了一個龐大的 Dart 庫但只使用了其中一個兩行的自包含方法,那麼即使該 Dart 庫本身匯入了數十個其他庫,您也只需要支付這兩行方法的成本。只有當 Dart 能夠在編譯時識別程式碼路徑時,這個保證才是可靠的。迄今為止,我們發現針對特定需求的替代方法能提供更好的權衡,例如程式碼生成。
是否支援國際化和本地化?
#是的,Flutter 支援國際化(i18n)和本地化(l10n),以便您的應用能夠適應不同的語言和文化。您可以在國際化文件中瞭解更多資訊。
支援哪些可訪問性功能?
#Flutter 支援嚴格的可訪問性要求(a11y)。例如,螢幕閱讀器、大文字、高對比度、硬體開關控制等都得到支援。要了解更多資訊,請參閱可訪問性文件。
我如何為 Flutter 編寫並行和/或併發應用?
#Flutter 支援 Isolates。Isolates 是 Flutter VM 中的獨立堆,它們可以並行執行(通常實現為獨立的執行緒)。Isolates 透過傳送和接收非同步訊息進行通訊。
我能在 Flutter 應用的後臺執行 Dart 程式碼嗎?
#是的,您可以在 iOS 和 Android 的後臺程序中執行 Dart 程式碼。有關更多資訊,請參閱免費的 Medium 文章“使用 Flutter 外掛和地理圍欄在後臺執行 Dart”。
我能使用 JSON/XML/Protobufs(等等)與 Flutter 配合使用嗎?
#絕對可以。在 pub.dev 上有適用於 JSON、XML、Protobufs 以及許多其他實用工具和格式的庫。
有關使用 JSON 與 Flutter 配合的詳細說明,請檢視JSON 教程。
我能用 Flutter 構建 3D(OpenGL)應用嗎?
#目前我們不支援使用 OpenGL ES 或類似技術進行 3D。我們有長期計劃來公開最佳化的 3D API,但目前我們專注於 2D。
為什麼我的 APK 或 IPA 檔案那麼大?
#通常,包括影像、聲音檔案、字型等在內的資源是 APK 或 IPA 的主要組成部分。Android 和 iOS 生態系統中的各種工具可以幫助您瞭解 APK 或 IPA 的內容。
另外,請務必使用 Flutter 工具建立您 APK 或 IPA 的釋出版本。釋出版本通常比除錯版本小得多。
瞭解有關建立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 允許更大的靈活性。例如,我們發現很難讓一個僵化的標記系統來表達和生成具有定製行為的定製控制元件。
我們還發現,我們的“程式碼優先”方法更能支援熱過載和動態環境適應等功能。
可以建立一個自定義語言,然後將其即時轉換為控制元件。因為 build 方法“就是程式碼”,所以它們可以做任何事情,包括解釋標記並將其轉換為控制元件。
我的應用右上方有一個 Debug 標誌/橫幅。我為什麼會看到它?
#預設情況下,flutter run 命令使用除錯構建配置。
除錯配置在 VM(虛擬機器)中執行您的 Dart 程式碼,從而實現快速的開發週期和熱過載(釋出版本使用標準的Android和iOS工具鏈進行編譯)。
除錯配置還會檢查所有斷言,這有助於您在開發過程中及早發現錯誤,但會產生執行時成本。“Debug”橫幅表示已啟用這些檢查。您可以使用 flutter run 的 --profile 或 --release 標誌在沒有這些檢查的情況下執行您的應用。
如果您的 IDE 使用 Flutter 外掛,您可以以配置檔案模式或釋出模式啟動應用。對於 VS Code,請使用Run > Start debugging或Run > Run without debugging選單項。對於 IntelliJ,請使用選單項Run > Flutter Run in Profile Mode或Release Mode。
Flutter 框架使用什麼程式設計正規化?
#Flutter 是一個多正規化程式設計環境。過去幾十年來開發的許多程式設計技術都用於 Flutter。我們在任何我們認為該技術的優點使其特別適合的領域都使用它們。順序不分先後:
- 組合
- Flutter 使用的主要正規化是使用具有狹窄行為範圍的小物件,將它們組合起來以獲得更復雜的效果,有時稱為激進組合。Flutter 控制元件庫中的大多數控制元件都是這樣構建的。例如,Material
TextButton類是使用IconTheme、InkWell、Padding、Center、Material、AnimatedDefaultTextStyle和ConstrainedBox構建的。InkWell是使用GestureDetector構建的。Material是使用AnimatedDefaultTextStyle、NotificationListener和AnimatedPhysicalModel構建的。等等。一直都是控制元件。 - 函數語言程式設計
- 整個應用程式都可以使用
StatelessWidget來構建,它們本質上是將引數對映到其他函式的函式。(此類應用程式很難擁有狀態,因此通常是非互動式的。)例如,Icon控制元件本質上是一個將引數(color、icon、size)對映到佈局基元(Primitives)的函式。此外,還大量使用了不可變資料結構,包括整個Widget類層次結構以及許多支援類,如Rect和TextStyle。在較小的規模上,Dart 的IterableAPI,它大量使用了函式式風格(map、reduce、where 等),經常用於在框架中處理值列表。 - 事件驅動程式設計
- 使用者互動由事件物件表示,這些物件被分派到已註冊事件處理程式的回撥。螢幕更新由類似的回撥機制觸發。
Listenable類,用作動畫系統的基礎,它將事件的訂閱模型形式化,具有多個監聽器。 - 類基礎面向物件程式設計
- 框架的大部分 API 都是使用帶有繼承的類構建的。我們採用一種方法,即在我們基類中定義非常高層的 API,然後在子類中迭代地對其進行專門化。例如,我們的渲染物件有一個基類(
RenderObject),該基類不關心座標系,然後我們有一個子類(RenderBox),該子類引入了幾何形狀應基於笛卡爾座標系的觀點(x/width 和 y/height)。 - 原型基礎面向物件程式設計
ScrollPhysics類在執行時動態地組合應用於滾動的物理特性,透過將例項連結在一起來實現。這允許系統在編譯時無需選擇平臺即可組合例如分頁物理特性和特定於平臺的物理特性。- 指令式程式設計
- 通常與封裝在物件中的狀態配對的直接指令式程式設計,在它提供了最直觀的解決方案時使用。例如,測試以命令式風格編寫,首先描述被測試的情況,然後列出測試必須匹配的不變數,然後根據需要推進時鐘或插入事件進行測試。
- 響應式程式設計
- 控制元件樹和元素樹有時被描述為響應式的,因為控制元件建構函式中提供的新輸入會立即透過控制元件的構建方法傳播為對底層控制元件的更改,並且底層控制元件中的更改(例如,響應使用者輸入)會透過事件處理程式傳播回樹。框架中同時存在函式式響應式和命令式響應式的方面,具體取決於控制元件的需求。構建方法僅由描述控制元件如何響應其配置更改的表示式組成的控制元件是函式式響應式控制元件(例如,Material
Divider類)。構建方法由多個語句構成控制元件子項列表的控制元件,描述控制元件如何響應其配置更改,是命令式響應式控制元件(例如,Chip類)。 - 宣告式程式設計
- 控制元件的構建方法通常是帶有多個巢狀建構函式級別的單個表示式,使用嚴格宣告性的 Dart 子集編寫。這種巢狀表示式可以機械地轉換成或從任何足夠富有表現力的標記語言轉換。
- 例如,
UserAccountsDrawerHeader控制元件有一個很長的構建方法(20+ 行),由一個單一的巢狀表示式組成。這也可以與命令式風格結合使用,以構建純宣告式方法難以描述的 UI。 - 泛型程式設計
- 併發程式設計
- Flutter 大量使用
Future和其他非同步 API。例如,動畫系統透過完成 future 來報告動畫何時完成。影像載入系統也類似地使用 future 來報告載入何時完成。 - 約束程式設計
- Flutter 中的佈局系統使用一種弱形式的約束程式設計來確定場景的幾何形狀。約束(例如,對於笛卡爾框,最小和最大寬度以及最小和最大高度)從父級傳遞到子級,子級選擇一個滿足這些約束的幾何形狀(例如,對於笛卡爾框,一個大小,具體來說是寬度和高度)。透過使用這種技術,Flutter 通常可以在一次傳遞中佈局整個場景。
專案
#我可以在哪裡獲得支援?
#如果您認為您遇到了一個 bug,請在我們的問題跟蹤器中報告。您也可以使用Stack Overflow來提問“如何做”型別的問題。有關討論,請加入我們的郵件列表:flutter-dev@googlegroups.com,或在Discord上找到我們。
有關更多資訊,請參閱我們的社群頁面。
我如何參與進來?
#Flutter 是開源的,我們鼓勵您貢獻。您可以從在我們的問題跟蹤器中報告功能請求和錯誤開始。
我們建議您加入我們的郵件列表: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 和 WebViews 由於自動行為(滾動、佈局)和對舊版本的支援,在保持高幀率和提供高保真體驗方面存在挑戰。
- 如今,重複構建同一個應用程式的成本太高:需要不同的團隊、不同的程式碼庫、不同的工作流程、不同的工具等。
- 開發人員希望有一種更簡單、更好的方法來使用單一程式碼庫為多個目標平臺構建移動應用,並且他們不希望犧牲質量、控制或效能。
我們專注於三件事:
- 控制
- 開發人員應該能夠訪問並控制系統的所有層。這導致:
- 效能
- 使用者應該獲得完美流暢、響應迅速、無卡頓的應用。這導致:
- 保真度:
- 每個人都應該獲得精確、精美、令人愉悅的應用體驗。
Apple 會拒絕我的 Flutter 應用嗎?
#我們無法代表 Apple 置評,但他們的 App Store 包含許多使用 Flutter 等框架技術構建的應用。事實上,Flutter 使用與 Unity 相同的基本架構模型,Unity 是為 Apple 商店中最流行的許多遊戲提供動力的引擎。
Apple 經常推薦使用 Flutter 構建的優秀應用,包括Hamilton和Reflectly。
與提交到 Apple Store 的任何應用一樣,使用 Flutter 構建的應用應遵循 Apple 的 App Store 提交指南。