跳至主要內容
目錄

常見問題

目錄

簡介

#

本頁收集了一些關於 Flutter 的常見問題。您也可以查看以下特定的常見問題集

什麼是 Flutter?

#

Flutter 是 Google 的可攜式 UI 工具包,用於從單一程式碼庫為行動裝置、網頁和桌面製作精美、原生編譯的應用程式。Flutter 可以與現有程式碼搭配使用,世界各地的開發人員和組織都在使用,而且是免費和開放原始碼的。

Flutter 適合哪些人?

#

對於使用者來說,Flutter 可以讓精美的應用程式栩栩如生。

對於開發人員來說,Flutter 降低了建立應用程式的門檻。它可以加快應用程式開發速度,並降低跨平台應用程式生產的成本和複雜性。

對於設計師來說,Flutter 提供了一個用於高端使用者體驗的畫布。《Fast Company》將 Flutter 描述為十年來最重要的設計理念之一,因為它能夠將概念轉化為生產程式碼,而不會因典型的框架而妥協。它也可以作為一個高效的原型設計工具,搭配拖放工具(例如 FlutterFlow)和基於網頁的 IDE(例如 Zapp!)。

對於工程經理和企業來說,Flutter 可以將應用程式開發人員整合到一個行動裝置、網頁和桌面應用程式團隊中,從單一程式碼庫為多個平台建構品牌應用程式。Flutter 可以加快功能開發速度,並同步整個客戶群的發布時程。

我需要多少開發經驗才能使用 Flutter?

#

Flutter 適合熟悉物件導向概念(類別、方法、變數等)和命令式程式設計概念(迴圈、條件式等)的程式設計師。

我們看到程式設計經驗很少的人學習和使用 Flutter 進行原型設計和應用程式開發。

我可以用 Flutter 建立哪些類型的應用程式?

#

Flutter 旨在支援在 Android 和 iOS 上執行的行動應用程式,以及您想要在網頁或桌面上執行的互動式應用程式。

需要提供高度品牌設計的應用程式特別適合 Flutter。不過,您也可以使用 Flutter 建立與 Android 和 iOS 設計語言相符的像素完美體驗。

Flutter 的套件生態系統支援各種硬體(例如相機、GPS、網路和儲存)和服務(例如付款、雲端儲存、驗證和廣告)。

誰開發 Flutter?

#

Flutter 是一個開放原始碼專案,由 Google 和其他公司及個人共同貢獻。

誰在使用 Flutter?

#

Google 內外的開發人員使用 Flutter 為 iOS 和 Android 建立精美的原生編譯應用程式。若要瞭解其中一些應用程式,請造訪展示

是什麼讓 Flutter 與眾不同?

#

Flutter 與大多數其他用於建構行動應用程式的選項不同,因為它不依賴網頁瀏覽器技術,也不依賴每個裝置隨附的 Widget 集。相反地,Flutter 使用自己的高效能呈現引擎來繪製 Widget。

此外,Flutter 與眾不同之處在於它只有很薄的一層 C/C++ 程式碼。Flutter 在 Dart(一種現代、簡潔、物件導向的語言)中實作其大部分系統(合成、手勢、動畫、框架、Widget 等),開發人員可以輕鬆地讀取、變更、取代或移除這些系統。這讓開發人員可以對系統進行極大的控制,並顯著降低了系統的易用性門檻。

我應該用 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 風格的豐富 Widget 集
  • 用於單元和整合測試的 API
  • 用於連線到系統和第三方 SDK 的互通和外掛程式 API
  • 用於在 Windows、Linux 和 Mac 上執行測試的無頭測試執行器
  • 用於測試、偵錯和分析您的應用程式的 Flutter DevTools(也稱為 Dart DevTools)
  • 用於建立、建置、測試和編譯應用程式的命令列工具

Flutter 是否與任何編輯器或 IDE 相容?

#

我們為 VS CodeAndroid StudioIntelliJ IDEA 提供外掛程式。如需設定詳細資料,請參閱編輯器設定,以及如需如何使用外掛程式的提示,請參閱 VS CodeAndroid Studio/IntelliJ

Project IDX 目前為測試版,是一個 AI 輔助工作區,用於在雲端進行全堆疊、多平台應用程式開發。IDX 支援 Dart 和 Flutter。如需更多資訊,請查看Project IDX 入門指南。

或者,您也可以從終端使用 flutter 命令,以及支援編輯 Dart的許多編輯器之一。

Flutter 是否有內建框架?

#

是的!Flutter 隨附現代 React 風格的框架。Flutter 的框架設計為分層且可自訂(和選用)。開發人員可以選擇僅使用框架的一部分,甚至完全取代框架的上層。

Flutter 是否有內建 Widget?

#

是的!Flutter 隨附一組高品質的 Material Design 和 Cupertino (iOS 風格) Widget、版面配置和主題。當然,這些 Widget 只是起點。Flutter 的設計目的是讓您可以輕鬆地建立自己的 Widget,或自訂現有的 Widget。

Flutter 是否支援 Material Design?

#

是的!Flutter 和 Material 團隊密切合作,而且 Material 受到完全支援。如需更多資訊,請在Widget 目錄中查看 Material 2 和 Material 3 Widget。

Flutter 是否有內建測試框架?

#

是的,Flutter 提供用於撰寫單元和整合測試的 API。深入瞭解使用 Flutter 進行測試

我們使用自己的測試功能來測試我們的 SDK,並且我們測量每次提交的測試覆蓋率

Flutter 是否有內建偵錯工具?

#

是的,Flutter 隨附 Flutter DevTools(也稱為 Dart DevTools)。如需更多資訊,請參閱使用 Flutter 進行偵錯Flutter DevTools 文件。

Flutter 是否有內建依賴注入框架?

#

我們沒有隨附有主見的解決方案,但有各種套件提供依賴注入和服務位置,例如 injectableget_itkiwiriverpod

技術

#

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 是否使用作業系統內建的平台 Widget?

#

不會。相反地,Flutter 提供一組由 Flutter 框架和引擎管理和渲染的 Widget(包括 Material Design 和 Cupertino (iOS 風格) Widget)。您可以瀏覽 Flutter Widget 目錄

我們相信最終結果會是更高品質的應用程式。如果我們重複使用內建的平台 Widget,Flutter 應用程式的品質和效能將會受到這些 Widget 的彈性和品質的限制。

例如,在 Android 中,有一組硬式編碼的手勢和消除歧義的固定規則。在 Flutter 中,您可以編寫自己的手勢辨識器,該辨識器是 手勢系統中的第一級參與者。此外,由不同人員撰寫的兩個 Widget 可以協調以消除手勢的歧義。

現代應用程式設計趨勢指向設計師和使用者希望有更多動態的 UI 和以品牌優先的設計。為了達到那種客製化、美觀的設計水準,Flutter 的架構設計是以驅動像素為目標,而不是使用內建的 Widget。

透過使用相同的渲染器、框架和一組 Widget,更容易從相同的程式碼庫發佈到多個平台,而無需進行仔細且代價高昂的規劃來對齊不同的功能集和 API 特性。

透過為所有程式碼使用單一語言、單一框架和單一組函式庫(無論您的 UI 在每個平台上是否不同),我們也旨在幫助降低應用程式開發和維護成本。

當我的行動作業系統更新並引入新的 Widget 時會發生什麼?

#

Flutter 團隊會關注 iOS 和 Android 中新行動 Widget 的採用和需求,並致力於與社群合作來為新 Widget 建構支援。這項工作可能會以較低層次的框架功能、新的可組合 Widget 或新的 Widget 實作形式出現。

Flutter 的分層架構旨在支援眾多的 Widget 函式庫,我們鼓勵並支持社群建構和維護 Widget 函式庫。

當我的行動作業系統更新並引入新的平台功能時會發生什麼?

#

Flutter 的互通性和外掛程式系統旨在讓開發人員立即存取新的行動作業系統功能。開發人員不必等待 Flutter 團隊公開新的行動作業系統功能。

Flutter 是否支援程式碼推送?

#

程式碼推送或直接將應用程式更新推送到使用者裝置的功能,Flutter 並不直接支援。但是,我們知道有一個第三方解決方案,稱為 Shorebird。請注意,這不是官方認可或建議。

我可以使用哪些作業系統來建構 Flutter 應用程式?

#

Flutter 支援使用 Linux、macOS、ChromeOS 和 Windows 進行開發。

Flutter 是用什麼語言編寫的?

#

Dart,一種針對用戶端應用程式進行最佳化的快速成長的現代語言。底層圖形框架和 Dart 虛擬機器是以 C/C++ 實作的。

為什麼 Flutter 選擇使用 Dart?

#

在初始開發階段,Flutter 團隊研究了許多語言和執行階段,最終採用 Dart 作為框架和 Widget。Flutter 使用四個主要維度進行評估,並考慮了框架作者、開發人員和終端使用者的需求。我們發現許多語言符合某些要求,但 Dart 在我們所有的評估維度中都獲得了高分,並滿足了我們所有的要求和標準。

Dart 執行階段和編譯器支援 Flutter 的兩個關鍵功能組合:基於 JIT 的快速開發週期,允許在具有類型的語言中進行形狀變更和有狀態的熱重載,以及預先編譯器,可發出高效的 ARM 程式碼,以實現快速啟動和生產部署的可預測效能。

此外,我們有機會與 Dart 社群密切合作,該社群正積極投入資源來改進 Dart 在 Flutter 中的使用。例如,當我們採用 Dart 時,該語言沒有用於產生原生二進位檔的預先編譯工具鏈,這對於實現可預測的高效能至關重要,但現在該語言有了,因為 Dart 團隊為 Flutter 建構了它。同樣地,Dart VM 之前已針對吞吐量進行最佳化,但該團隊現在正在針對延遲最佳化 VM,這對於 Flutter 的工作負載更為重要。

Dart 在以下主要標準中對我們來說得分很高

開發人員生產力
Flutter 的主要價值主張之一是,它讓開發人員使用相同的程式碼庫為 iOS 和 Android 建立應用程式,從而節省了工程資源。使用高效的語言可進一步加速開發人員的工作,並使 Flutter 更具吸引力。這對我們的框架團隊和開發人員都非常重要。Flutter 的大部分內容都是以我們提供給使用者的相同語言建構的,因此我們需要在 10 萬行程式碼中保持生產力,而不會犧牲我們開發人員的框架和 Widget 的易用性或可讀性。
物件導向
對於 Flutter,我們想要一種適合 Flutter 問題領域的語言:建立視覺使用者體驗。業界在物件導向語言中建立使用者介面框架已有數十年的經驗。雖然我們可以使用非物件導向的語言,但這意味著要重新發明輪子來解決幾個難題。此外,絕大多數開發人員都具有物件導向開發的經驗,這使得學習如何使用 Flutter 開發更加容易。
可預測的高效能
透過 Flutter,我們希望讓開發人員能夠建立快速、流暢的使用者體驗。為了實現這一點,我們需要在每個動畫影格期間執行大量的終端開發人員程式碼。這表示我們需要一種既能提供高效能又能提供可預測效能的語言,而不會出現導致影格丟失的定期暫停。
快速配置
Flutter 框架使用功能樣式的流程,該流程嚴重依賴於底層記憶體配置器,以有效處理小型、短期的配置。這種樣式是在具有此屬性的語言中開發的,並且在缺乏此功能的語言中無法有效地運作。

Flutter 可以執行任何 Dart 程式碼嗎?

#

Flutter 可以執行不直接或間接匯入 dart:mirrorsdart:html 的 Dart 程式碼。

Flutter 引擎有多大?

#

在 2021 年 3 月,我們測量了一個 最小 Flutter 應用程式(沒有 Material Components,只有一個 Center Widget,使用 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 QA1795iOS App Store 特定考量 部分)。

當然,我們建議您測量自己的應用程式。若要執行此操作,請參閱測量您的應用程式大小

Flutter 如何定義像素?

#

Flutter 使用邏輯像素,並且通常僅將其稱為「像素」。Flutter 的 devicePixelRatio 表示實體像素和邏輯 CSS 像素之間的比例。

功能

#

我可以期待哪種應用程式效能?

#

您可以期望獲得卓越的效能。Flutter 的設計目的是協助開發人員輕鬆實現恆定的 60fps。Flutter 應用程式使用原生編譯程式碼執行,不涉及任何直譯器。這表示 Flutter 應用程式會快速啟動。

我可以期待哪種開發週期?從編輯到重新整理需要多長時間?

#

Flutter 實作了熱重載開發人員週期。您可以預期在裝置或模擬器/模擬器上的重新載入時間不到一秒。

Flutter 的熱重載是有狀態的,因此應用程式狀態會在重新載入後保留。這表示您可以在應用程式中深度巢狀的畫面中快速反覆運算,而無需在每次重新載入後從主畫面開始。

熱重載熱重新啟動有何不同?

#

熱重載的工作方式是將更新的原始碼檔案注入到正在執行的 Dart VM (虛擬機器) 中。這不僅會新增類別,還會將方法和欄位新增到現有類別,並變更現有的函數。熱重新啟動會將狀態重設為應用程式的初始狀態。

如需更多資訊,請參閱熱重載

我可以在哪裡部署我的 Flutter 應用程式?

#

您可以將您的 Flutter 應用程式編譯並部署到 iOS、Android、網頁桌面

Flutter 在哪些裝置和作業系統版本上執行?

#
  • 我們支援並測試在各種低階到高階平台上執行 Flutter。如需我們測試的平台的詳細清單,請參閱支援的平台清單。

  • Flutter 支援為 x86-64armeabi-v7aarm64-v8a 建置預先編譯 (AOT) 的函式庫。

  • 針對 ARMv7 或 ARM64 建置的應用程式可以在許多 x86-64 Android 裝置上正常執行(使用 ARM 模擬)。

  • 我們支援在各種平台上開發 Flutter 應用程式。請參閱每個開發作業系統下列出的系統需求。

Flutter 是否在網頁上執行?

#

是的,網頁支援可在穩定管道中使用。如需更多詳細資訊,請查看網頁說明

我可以使用 Flutter 來建構桌面應用程式嗎?

#

是的,桌面支援在 Windows、macOS 和 Linux 的穩定版本中提供。

我可以在現有的原生應用程式內使用 Flutter 嗎?

#

是的,請在我們網站的新增至應用程式部分了解更多資訊。

我可以存取平台服務和 API,例如感測器和本機儲存空間嗎?

#

是的。Flutter 讓開發人員可以直接存取作業系統中的某些平台特定服務和 API。然而,我們希望避免大多數跨平台 API 的「最低公分母」問題,因此我們不打算為所有原生服務和 API 建構跨平台 API。

許多平台服務和 API 在 pub.dev 上都有可用的現成套件。使用現有的套件很容易

最後,我們鼓勵開發人員使用 Flutter 的非同步訊息傳遞系統,來建立您自己與平台和第三方 API的整合。開發人員可以根據需要公開盡可能多或盡可能少的平台 API,並建構最適合其專案的抽象層。

我可以擴展和自訂綁定的 Widget 嗎?

#

當然。Flutter 的 Widget 系統設計為易於自訂。

Flutter 沒有讓每個 Widget 提供大量參數,而是採用組合方式。Widget 是由較小的 Widget 建構而成,您可以重複使用這些 Widget,並以新穎的方式組合它們來建立自訂 Widget。例如,ElevatedButton 沒有子類化一般按鈕 Widget,而是將 Material Widget 與 GestureDetector Widget 結合在一起。Material Widget 提供視覺設計,而 GestureDetector Widget 提供互動設計。

若要建立具有自訂視覺設計的按鈕,您可以將實作視覺設計的小工具與提供互動設計的 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) 和協助工具 (a11y)?

#

若要了解更多關於 i18n 和 l10n 的資訊,請參閱國際化教學課程

若要了解更多關於 a11y 的資訊,請參閱協助工具文件

我如何為 Flutter 編寫並行和/或並發應用程式?

#

Flutter 支援隔離區。隔離區是 Flutter VM 中的獨立堆疊,它們能夠平行執行(通常實作為獨立執行緒)。隔離區透過傳送和接收非同步訊息進行通訊。

請查看在 Flutter 中使用隔離區的範例

我可以在 Flutter 應用程式的背景中執行 Dart 程式碼嗎?

#

是的,您可以在 iOS 和 Android 上的背景處理程序中執行 Dart 程式碼。如需更多資訊,請參閱 Medium 的免費文章使用 Flutter 外掛程式和地理圍欄在背景中執行 Dart

我可以在 Flutter 中使用 JSON/XML/ protobuffers(等等)嗎?

#

絕對可以。在 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 的發行版本。發行版本通常比偵錯版本得多

若要了解更多關於建立 Android 應用程式的發行版本和建立 iOS 應用程式的發行版本的資訊,請參閱。另請查看測量應用程式的大小

Flutter 應用程式是否可以在 Chromebook 上執行?

#

我們已經看到 Flutter 應用程式在某些 Chromebook 上執行。我們正在追蹤與在 Chromebook 上執行 Flutter 相關的問題

Flutter 是否與 ABI 相容?

#

Flutter 和 Dart 不提供應用程式二進位介面 (ABI) 相容性。提供 ABI 相容性不是 Flutter 或 Dart 目前的目標。

框架

#

為什麼 build() 方法是在 State 上,而不是 StatefulWidget 上?

#

State 上放置 Widget build(BuildContext context) 方法,而不是在 StatefulWidget 上放置 Widget build(BuildContext context, State state) 方法,可以讓開發人員在子類別化 StatefulWidget 時更具彈性。您可以在 State.build 的 API 文件中閱讀更詳細的討論。

Flutter 的標記語言在哪裡?為什麼 Flutter 沒有標記語法?

#

Flutter UI 是使用命令式、物件導向的語言(Dart,與建構 Flutter 框架所用的語言相同)建構的。Flutter 沒有附帶宣告式標記。

我們發現使用程式碼動態建構的 UI 可以提供更大的彈性。例如,我們發現剛性的標記系統很難表達和產生具有自訂行為的自訂小工具。

我們還發現我們的「程式碼優先」方法可以更好地實現熱重載和動態環境調整等功能。

可以建立一種自訂語言,然後將其即時轉換為小工具。由於 build 方法「只是程式碼」,因此它們可以執行任何操作,包括解譯標記並將其轉換為小工具。

我的應用程式右上角有一個偵錯橫幅/緞帶。為什麼我會看到這個?

#

預設情況下,flutter run 命令使用偵錯組態。

偵錯組態會在 VM(虛擬機器)中執行您的 Dart 程式碼,透過熱重載啟用快速開發週期(發行版本是使用標準 AndroidiOS 工具鏈編譯的)。

偵錯組態還會檢查所有 assert,這有助於您在開發期間盡早捕捉錯誤,但會產生執行時間成本。「偵錯」橫幅表示已啟用這些檢查。您可以使用 --profile--release 旗標來執行 flutter run,以在沒有這些檢查的情況下執行您的應用程式。

如果您的 IDE 使用 Flutter 外掛程式,則您可以在分析或發行模式下啟動應用程式。對於 VS Code,請使用執行 > 開始偵錯執行 > 在沒有偵錯的情況下執行功能表項目。對於 IntelliJ,請使用功能表項目執行 > 在分析模式下執行 Flutter發行模式

Flutter 的框架使用什麼程式設計範例?

#

Flutter 是一種多重範例程式設計環境。在過去數十年中開發的許多程式設計技術都在 Flutter 中使用。我們在我們認為該技術的優勢使其特別適合的地方使用每一種技術。不按特定順序:

組合
Flutter 使用的主要範例是使用具有狹窄行為範圍的小物件,組合在一起以獲得更複雜的效果,有時稱為積極組合。Flutter 小工具庫中的大多數小工具都是以這種方式建構的。例如,Material TextButton 類別是使用 IconThemeInkWellPaddingCenterMaterialAnimatedDefaultTextStyleConstrainedBox 建構的。InkWell 是使用 GestureDetector 建構的。Material 是使用 AnimatedDefaultTextStyleNotificationListenerAnimatedPhysicalModel 建構的。諸如此類。它一路都是小工具。
函式程式設計
整個應用程式只能使用 StatelessWidget 建構,它本質上是一些函式,描述引數如何對應到其他函式,最終歸結為計算版面配置或繪製圖形的原始值。(這類應用程式不容易有狀態,因此通常是非互動的。)例如,Icon 小工具本質上是一個將其引數(coloriconsize)對應到版面配置原始值的函式。此外,大量使用不可變的資料結構,包括整個 Widget 類別階層以及許多支援類別,例如 RectTextStyle。在較小的規模上,Dart 的 Iterable API 大量使用函式樣式(map、reduce、where 等),經常被用來處理框架中的值清單。
事件驅動程式設計
使用者互動由事件物件表示,這些事件物件會分派到向事件處理常式註冊的回呼。螢幕更新由類似的回呼機制觸發。Listenable 類別用作動畫系統的基礎,將具有多個接聽程式的事件訂閱模型正式化。
基於類別的物件導向程式設計
框架的大部分 API 都是使用具有繼承的類別建構的。我們使用一種方法,在基底類別中定義非常高層級的 API,然後在子類別中以迭代方式專門化這些 API。例如,我們的渲染物件有一個基底類別 (RenderObject),它與座標系統無關,然後我們有一個子類別 (RenderBox),它引入幾何應該基於笛卡爾座標系統(x/寬度和 y/高度)的觀點。
基於原型的物件導向程式設計
ScrollPhysics 類別會連結執行個體,以在執行階段動態組合套用至滾動的物理特性。這讓系統可以組合(例如)分頁物理特性和平台特定物理特性,而無需在編譯時選取平台。
命令式程式設計
簡單的命令式程式設計(通常與物件內封裝的狀態配對)在提供最直觀的解決方案時使用。例如,測試是以命令式樣式編寫的,首先描述測試中的情況,然後列出測試必須符合的不變量,然後根據測試的需要推進時鐘或插入事件。
反應式程式設計
元件和元素樹有時被描述為具有反應性,因為在元件的建構函式中提供的新輸入會立即透過元件的 build 方法傳播為對較低層級元件的變更,而較低層級元件中所做的變更(例如,響應使用者輸入)會使用事件處理程式向上傳播回樹狀結構。根據元件的需求,框架中同時存在函式式反應和命令式反應的面向。建構方法僅包含描述元件如何對其配置中的變更做出反應的表達式的元件,屬於函式式反應元件(例如,Material 的 Divider 類別)。建構方法透過多個語句建構子元素列表,描述元件如何對其配置中的變更做出反應的元件,屬於命令式反應元件(例如,Chip 類別)。
宣告式程式設計
元件的 build 方法通常是一個單一的表達式,具有多層嵌套的建構函式,使用 Dart 的嚴格宣告式子集編寫。這種嵌套表達式可以機械式地轉換為或轉換自任何適當表達能力的標記語言。例如,UserAccountsDrawerHeader 元件有一個很長的 build 方法(20 多行),由一個單一的嵌套表達式組成。這也可以與命令式風格結合,來建構用純宣告式方法較難描述的 UI。
泛型程式設計
可以使用類型來幫助開發人員及早發現程式設計錯誤。Flutter 框架在這方面使用了泛型程式設計。例如,State 類別會根據其關聯元件的類型進行參數化,以便 Dart 分析器可以捕獲狀態和元件的不匹配。同樣地,GlobalKey 類別採用類型參數,以便它可以以類型安全的方式(使用執行階段檢查)存取遠端元件的狀態,Route 介面會使用當 彈出 時預期使用的類型進行參數化,而諸如 ListMapSet 等集合都會進行參數化,以便可以在分析期間或在除錯期間的執行階段及早捕獲不匹配的元素。
並行程式設計
Flutter 大量使用 Future 和其他非同步 API。例如,動畫系統會透過完成一個 future 來報告動畫何時完成。影像載入系統也類似地使用 future 來報告載入何時完成。
約束程式設計
Flutter 中的佈局系統使用一種弱形式的約束程式設計來確定場景的幾何結構。約束條件(例如,對於笛卡爾方塊,最小和最大寬度以及最小和最大高度)會從父元件傳遞到子元件,而子元件會選擇滿足這些約束條件的最終幾何結構(例如,對於笛卡爾方塊,一個大小,具體來說是一個寬度和一個高度)。透過使用此技術,Flutter 通常可以單次完成整個場景的佈局。

專案

#

我可以在哪裡獲得支援?

#

如果您認為您遇到了錯誤,請在我們的 問題追蹤器 中提交。您也可以使用 Stack Overflow 來詢問「HOWTO」類型的問題。如需討論,請加入我們的郵件列表 [email protected] 或在 Discord 上尋找我們。

如需更多資訊,請參閱我們的 社群 頁面。

我如何參與?

#

Flutter 是開放原始碼,我們鼓勵您做出貢獻。您可以從在我們的 問題追蹤器 中簡單地提交功能請求和錯誤的問題開始。

我們建議您加入我們的郵件列表 [email protected] 並讓我們知道您如何使用 Flutter 以及您想用它來做什麼。

如果您有興趣貢獻程式碼,您可以從閱讀我們的 貢獻指南 開始,並查看我們的 簡易入門問題 列表。

最後,您可以與有用的 Flutter 社群聯繫。如需更多資訊,請參閱社群頁面。

您也可以在 Flutter Discord 上與其他開發人員互動。

Flutter 是開放原始碼嗎?

#

是的,Flutter 是開放原始碼技術。您可以在 GitHub 上找到該專案。

哪些軟體授權適用於 Flutter 及其依賴項?

#

Flutter 包含兩個組件:一個以動態連結二進位檔形式發佈的引擎,以及一個引擎載入的獨立二進位檔 Dart 框架。該引擎使用多個具有許多依賴性的軟體組件;請在其 許可證檔案 中檢視完整列表。

該框架完全是獨立的,並且僅需要 一份許可證

此外,您使用的任何 Dart 套件都可能有其自己的許可證要求。

我如何確定我的 Flutter 應用程式需要顯示的授權?

#

有一個 API 可用來尋找您需要顯示的許可證清單

誰在開發 Flutter?

#

我們都會!Flutter 是一個開放原始碼專案。目前,大部分的開發工作是由 Google 的工程師完成的。如果您對 Flutter 感到興奮,我們鼓勵您加入社群並為 Flutter 做出貢獻

Flutter 的指導原則是什麼?

#

我們相信以下幾點

  • 為了接觸到每一位潛在使用者,開發人員需要針對多個行動平台。
  • 由於自動行為(捲動、佈局)和舊版支援,現今的 HTML 和 WebViews 難以始終如一地達到高幀率並提供高保真度的體驗。
  • 現今,多次建構同一個應用程式的成本太高:它需要不同的團隊、不同的程式碼庫、不同的工作流程、不同的工具等。
  • 開發人員希望有一種更輕鬆、更好的方式,使用單一程式碼庫為多個目標平台建構行動應用程式,並且他們不想犧牲品質、控制或效能。

我們專注於三件事

控制
開發人員應該可以存取並控制系統的所有層級。這導致了
效能
使用者值得擁有完美流暢、反應靈敏、無卡頓的應用程式。這導致了
保真度:
每個人都應該獲得精確、精美、令人愉悅的應用程式體驗。

Apple 會拒絕我的 Flutter 應用程式嗎?

#

我們不能代表 Apple 發言,但他們的 App Store 中包含許多使用 Flutter 等框架技術建構的應用程式。事實上,Flutter 使用與 Unity 相同的基本架構模型,Unity 是為 Apple 商店中許多最受歡迎的遊戲提供動力的引擎。

Apple 經常推出使用 Flutter 建構的精美設計應用程式,包括 HamiltonReflectly

與提交至 Apple 商店的任何應用程式一樣,使用 Flutter 建構的應用程式應遵循 Apple 的 App Store 提交指南