架構推薦和資源
構建可擴充套件 Flutter 應用的建議。
本頁介紹架構的最佳實踐,以及它們的重要性,以及我們是否建議將其用於您的 Flutter 應用。您應將這些建議視為建議,而不是一成不變的規則,並應根據您的應用的獨特需求進行調整。
本頁上的最佳實踐具有優先順序,反映了 Flutter 團隊的推薦程度。
- 強烈推薦: 如果您開始構建新的應用程式,則應始終實施此建議。除非這樣做會與您當前的方法產生根本衝突,否則您應強烈考慮重構現有應用以實施此實踐。
- 推薦: 此實踐可能會改善您的應用。
- 可選: 此實踐在某些情況下可以改善您的應用。
關注點分離
#您應該將您的應用分成 UI 層和資料層。在這些層中,您應該進一步將邏輯分成按職責劃分的類。
| 建議 | 描述 |
|---|---|
| 使用明確定義的資料和 UI 層。 強烈推薦 |
關注點分離是最重要的架構原則。資料層將應用程式資料暴露給應用程式的其餘部分,幷包含應用程式的大部分業務邏輯。UI 層顯示應用程式資料並監聽使用者的事件。UI 層包含用於 UI 邏輯和小部件的單獨類。 |
| 在資料層中使用倉庫模式。 強烈推薦 |
倉庫模式是一種軟體設計模式,它將資料訪問邏輯與應用程式的其餘部分隔離。它在應用程式的業務邏輯和底層資料儲存機制(資料庫、API、檔案系統等)之間建立了一個抽象層。在實踐中,這意味著建立倉庫類和服務類。 |
| 在 UI 層中使用 ViewModel 和 View。(MVVM) 強烈推薦
|
關注點分離是最重要的架構原則。這種特定的分離使您的程式碼更不易出錯,因為您的小部件保持“啞”狀態。 |
使用 ChangeNotifiers 和 Listenables 來處理小部件更新。可選
|
有很多選項來處理狀態管理,最終的決定取決於個人偏好。請閱讀關於 我們的 ChangeNotifier 推薦 或 其他流行的選項。 |
| 不要在小部件中放置邏輯。 強烈推薦 |
邏輯應封裝在 ViewModel 上的方法中。檢視應包含的唯一邏輯是
|
| 使用領域層。 可選 |
只有當您的應用程式具有超出 ViewModel 範圍的複雜邏輯,或者您發現自己在 ViewModel 中重複邏輯時,才需要領域層。在非常大的應用程式中,用例很有用,但在大多數應用程式中,它們會增加不必要的開銷。 在具有複雜邏輯要求的應用程式中使用。 |
資料處理
#謹慎處理資料可以使您的程式碼更易於理解、更不易出錯,並防止建立格式錯誤或意外的資料。
| 建議 | 描述 |
|---|---|
| 使用單向資料流。 強烈推薦 |
資料更新應僅從資料層流向 UI 層。UI 層中的交互發送到資料層進行處理。 |
使用 Commands 來處理使用者互動事件。推薦
|
Commands 可以防止應用程式中的渲染錯誤,並標準化 UI 層將事件傳送到資料層的方式。請閱讀架構案例研究中的 Commands。 |
| 使用不可變資料模型。 強烈推薦 |
不可變資料對於確保必要的更改僅發生在適當的位置(通常是資料或領域層)至關重要。由於不可變物件在建立後無法修改,因此必須建立一個新例項來反映更改。此過程可防止 UI 層中的意外更新,並支援清晰的單向資料流。 |
| 使用 freezed 或 built_value 來生成不可變資料模型。 推薦
|
您可以使用軟體包來幫助在資料模型中生成有用的功能,freezed 或 built_value。這些可以生成常見的模型方法,如 JSON ser/des、深度相等性檢查和複製方法。如果您的模型很多,這些程式碼生成包可能會為您的應用程式增加大量的構建時間。 |
| 建立單獨的 API 模型和領域模型。 可選 |
使用單獨的模型會增加冗長性,但可以防止 ViewModel 和用例中的複雜性。 在大規模應用中使用。 |
應用結構
#組織良好的程式碼有利於應用程式本身和處理程式碼的團隊。
| 建議 | 描述 |
|---|---|
| 使用依賴注入。 強烈推薦 |
依賴注入可以防止您的應用程式擁有全域性可訪問的物件,這使得您的程式碼更不易出錯。我們建議您使用 provider 包來處理依賴注入。 |
| 使用 go_router 進行導航。 推薦
|
Go_router 是編寫 90% Flutter 應用程式的首選方法。有一些特定的用例 go_router 無法解決,在這種情況下,您可以使用 Flutter Navigator API 直接使用或嘗試在 pub.dev 上找到其他軟體包。 |
| 使用類、檔案和目錄的標準命名約定。 推薦
|
我們建議根據它們所代表的架構元件來命名類。例如,您可能有以下類
為了清晰起見,我們不建議使用可能與 Flutter SDK 中的物件混淆的名稱。例如,您應該將共享小部件放在名為 |
| 使用抽象倉庫類 強烈推薦 |
倉庫類是應用程式中所有資料的真相來源,並促進與外部 API 的通訊。建立抽象倉庫類允許您建立不同的實現,這些實現可用於不同的應用程式環境,例如“開發”和“暫存”。 |
測試
#良好的測試實踐使您的應用程式具有靈活性。它也使新增新邏輯和新 UI 變得簡單且風險低。
| 建議 | 描述 |
|---|---|
| 分別測試架構元件,並一起測試。 強烈推薦
|
|
| 為測試建立模擬物件(並編寫利用模擬物件的程式碼)。 強烈推薦
|
模擬物件不像它們那樣關注任何給定方法的內部工作原理,而是關注輸入和輸出。如果您在編寫應用程式程式碼時牢記這一點,您將被迫編寫模組化、輕量級的函式和類,這些函式和類具有明確定義的輸入和輸出。 |
推薦資源
#- 程式碼和模板
- Compass app source code - 實施這些建議的完整功能、強大的 Flutter 應用程式的原始碼。
- very_good_cli - 由 Flutter 專家 Very Good Ventures 製作的 Flutter 應用程式模板。此模板生成類似的應用程式結構。
- 文件
- Very Good Engineering architecture documentation - Very Good Engineering 是 VGV 的文件站點,其中包含技術文章、演示和開源專案。它包括有關架構 Flutter 應用程式的文件。
- State Management with ChangeNotifier walkthrough - 使用 Flutter SDK 中的原語進行狀態管理的簡單介紹。
- 工具
- Flutter developer tools - DevTools 是用於 Dart 和 Flutter 的效能和除錯工具套件。
- flutter_lints - 一個包含 Flutter 團隊推薦的 Flutter 應用程式 lint 的包。使用此包來鼓勵團隊中的良好編碼實踐。
反饋
#由於本網站的這一部分正在不斷發展,我們 歡迎您的反饋!