freezed 用於進行 Model 類的擴充與強化,是一個聰明的程式碼產生器,讓開發者不用再煩惱每個Model所需的基本函式與功能,因為完成這些重複的內容可能需要上百行程式碼、很多時間與耐心,而現在可以更專注於資料的定義與邏輯。
實現
- 產生
toString()
,包含所有屬性的資訊 - 產生
hashCode
getter - 產生
==
operator function,進行物件比對(替代equatable套件) - 產生
copyWith()
,複製物件內容
特點
- 可支援
Union
class,適合多狀態的定義,非常適用於狀態管理,例如:Bloc、Riverpod - 使用
map()
、when()
等函式針對不同狀態進行處理,避免 if、switch 判斷的疏漏
安裝
json_serializable
為 Dart 提供一些處理JSON的函式json_annotation
支援 json_serializable 使用的標記語法freezed_annotation
支援 freezed 使用的標記語法build_runner
透過指令自動產生 Dart 檔案
建立 Model
- 工廠建構函式,提供Model所需要的參數、資料(不需要自行撰寫屬性,等待自動產生)
- fromJson() 工廠建構函式,負責Json字串解析(fromJson函式會自動產生)
補充:如果有遺漏的部分或拼寫錯誤,build_runner 將在執行時產生一些錯誤
產生程式碼
- 在
terminal
裡輸入指令,產生缺少的程式碼
flutter pub run build_runner build --delete-conflicting-outputs
補充:每次更新完Model後都需要透過指令重新產生對應的檔案
搭配 freezed_annotation
- 提供許多標記方式,可以自定義 Model 內容
針對 Class
@freezed
→ 不可變的類別,所以屬性預設都不可更新@Freezed(makeCollectionsUnmodifiable: false)
→ 雖然屬性不能更新,但可以讓 Lists、Maps、Sets 集合可變@unfreezed
→ 可變的類別,屬性可以重新賦值與更新,因為可變所以不支援==
和hashCode
的產生和實作,也不能為 const class
針對建構函式
@Assert()
→ 指定參數的檢查條件@deprecated
→ 即將棄用的Class
針對建構參數、屬性
required
→ 不可為空值的參數需要@JsonKey()
→ 對應指定的 json_key@Default()
→ 預設值,如果有給就不需要required
@JsonValue()
→ 給Enum使用,對應指定的 json_key@deprecated
→ 即將棄用的屬性
針對 Union class constructor
- 可以使用
@Implements()
、@With()
,實作介面
Model 自定義屬性和函式
- 需要定義一個空的內部建構函式
在 Widget 上使用 Union Class
VSCode Freezed(Extension)
Freezed 套件,可以透過指令快速新增一個 freezed model 檔案,不需要再寫重複的程式碼。
範例
參考
其他文章
- 提高Flutter性能的小技巧!(一)
- 提高Flutter性能的小技巧!(二)
- What are Async and Isolates in Flutter?
- Flutter 3 有什麼新東西?
- Riverpod 輕鬆學,原來這麼好用!
- Riverpod 輕鬆學(二),一些進階用法!
關於我
- Github:chyiiiiiiiiiiii
- Linkedin:yiichenhi
- Youtube:Yii
- Youtube:一起饅頭(美食頻道)
- Instagram:yiichenhi
- Email:ab20803@gmail.com
贊助
謝謝你!這是一個很長的文章而且你花費時間看完,真的非常感謝。
還有一件事, 如果覺得文章不錯可以贊助我,讓我有更多的動力和熱情分享 學習筆記和生活!請我喝一杯咖啡吧~
最後
希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章,也請別忘記給我拍手哦 (最多可以達到50次)!