跳到主內容

架構推薦和資源

構建可擴充套件 Flutter 應用的建議。

本頁介紹架構的最佳實踐,以及它們的重要性,以及我們是否建議將其用於您的 Flutter 應用。您應將這些建議視為建議,而不是一成不變的規則,並應根據您的應用的獨特需求進行調整。

本頁上的最佳實踐具有優先順序,反映了 Flutter 團隊的推薦程度。

  • 強烈推薦: 如果您開始構建新的應用程式,則應始終實施此建議。除非這樣做會與您當前的方法產生根本衝突,否則您應強烈考慮重構現有應用以實施此實踐。
  • 推薦: 此實踐可能會改善您的應用。
  • 可選: 此實踐在某些情況下可以改善您的應用。

關注點分離

#

您應該將您的應用分成 UI 層和資料層。在這些層中,您應該進一步將邏輯分成按職責劃分的類。

建議描述
使用明確定義的資料和 UI 層。
強烈推薦

關注點分離是最重要的架構原則。資料層將應用程式資料暴露給應用程式的其餘部分,幷包含應用程式的大部分業務邏輯。UI 層顯示應用程式資料並監聽使用者的事件。UI 層包含用於 UI 邏輯和小部件的單獨類。

在資料層中使用倉庫模式。
強烈推薦

倉庫模式是一種軟體設計模式,它將資料訪問邏輯與應用程式的其餘部分隔離。它在應用程式的業務邏輯和底層資料儲存機制(資料庫、API、檔案系統等)之間建立了一個抽象層。在實踐中,這意味著建立倉庫類和服務類。

在 UI 層中使用 ViewModel 和 View。(MVVM)
強烈推薦

關注點分離是最重要的架構原則。這種特定的分離使您的程式碼更不易出錯,因為您的小部件保持“啞”狀態。

使用 ChangeNotifiersListenables 來處理小部件更新。
可選

ChangeNotifier API 是 Flutter SDK 的一部分,是一種方便的方法,可以讓您的 Widget 觀察 ViewModel 中的更改。

有很多選項來處理狀態管理,最終的決定取決於個人偏好。請閱讀關於 我們的 ChangeNotifier 推薦其他流行的選項

不要在小部件中放置邏輯。
強烈推薦

邏輯應封裝在 ViewModel 上的方法中。檢視應包含的唯一邏輯是

  • 簡單的 if 語句,根據 ViewModel 中的標誌或可為空欄位來顯示和隱藏小部件
  • 依賴於小部件來計算的動畫邏輯
  • 基於裝置資訊(如螢幕尺寸或方向)的佈局邏輯。
  • 簡單的路由邏輯
使用領域層。
可選

只有當您的應用程式具有超出 ViewModel 範圍的複雜邏輯,或者您發現自己在 ViewModel 中重複邏輯時,才需要領域層。在非常大的應用程式中,用例很有用,但在大多數應用程式中,它們會增加不必要的開銷。

在具有複雜邏輯要求的應用程式中使用。

資料處理

#

謹慎處理資料可以使您的程式碼更易於理解、更不易出錯,並防止建立格式錯誤或意外的資料。

建議描述
使用單向資料流。
強烈推薦

資料更新應僅從資料層流向 UI 層。UI 層中的交互發送到資料層進行處理。

使用 Commands 來處理使用者互動事件。
推薦

Commands 可以防止應用程式中的渲染錯誤,並標準化 UI 層將事件傳送到資料層的方式。請閱讀架構案例研究中的 Commands

使用不可變資料模型。
強烈推薦

不可變資料對於確保必要的更改僅發生在適當的位置(通常是資料或領域層)至關重要。由於不可變物件在建立後無法修改,因此必須建立一個新例項來反映更改。此過程可防止 UI 層中的意外更新,並支援清晰的單向資料流。

使用 freezed 或 built_value 來生成不可變資料模型。
推薦

您可以使用軟體包來幫助在資料模型中生成有用的功能,freezedbuilt_value。這些可以生成常見的模型方法,如 JSON ser/des、深度相等性檢查和複製方法。如果您的模型很多,這些程式碼生成包可能會為您的應用程式增加大量的構建時間。

建立單獨的 API 模型和領域模型。
可選

使用單獨的模型會增加冗長性,但可以防止 ViewModel 和用例中的複雜性。

在大規模應用中使用。

應用結構

#

組織良好的程式碼有利於應用程式本身和處理程式碼的團隊。

建議描述
使用依賴注入。
強烈推薦

依賴注入可以防止您的應用程式擁有全域性可訪問的物件,這使得您的程式碼更不易出錯。我們建議您使用 provider 包來處理依賴注入。

使用 go_router 進行導航。
推薦

Go_router 是編寫 90% Flutter 應用程式的首選方法。有一些特定的用例 go_router 無法解決,在這種情況下,您可以使用 Flutter Navigator API 直接使用或嘗試在 pub.dev 上找到其他軟體包。

使用類、檔案和目錄的標準命名約定。
推薦

我們建議根據它們所代表的架構元件來命名類。例如,您可能有以下類

  • HomeViewModel
  • HomeScreen
  • UserRepository
  • ClientApiService

為了清晰起見,我們不建議使用可能與 Flutter SDK 中的物件混淆的名稱。例如,您應該將共享小部件放在名為 ui/core/ 的目錄中,而不是名為 /widgets 的目錄中。

使用抽象倉庫類
強烈推薦

倉庫類是應用程式中所有資料的真相來源,並促進與外部 API 的通訊。建立抽象倉庫類允許您建立不同的實現,這些實現可用於不同的應用程式環境,例如“開發”和“暫存”。

測試

#

良好的測試實踐使您的應用程式具有靈活性。它也使新增新邏輯和新 UI 變得簡單且風險低。

建議描述
分別測試架構元件,並一起測試。
強烈推薦
  • 為每個服務、倉庫和 ViewModel 類編寫單元測試。這些測試應單獨測試每個方法的邏輯。
  • 為檢視編寫小部件測試。測試路由和依賴注入尤為重要。
為測試建立模擬物件(並編寫利用模擬物件的程式碼)。
強烈推薦

模擬物件不像它們那樣關注任何給定方法的內部工作原理,而是關注輸入和輸出。如果您在編寫應用程式程式碼時牢記這一點,您將被迫編寫模組化、輕量級的函式和類,這些函式和類具有明確定義的輸入和輸出。

推薦資源

#

反饋

#

由於本網站的這一部分正在不斷發展,我們 歡迎您的反饋