使用 TDD + Clean Architecture 開發 Flutter 專案課程筆記 10 ~ 12

前言

這幾集就是在講 Flutter 特有的 BLoC,我們已經跨入 presentation layer 了,這邊會開始碰到 UI 背後的邏輯。

筆記

Flutter TDD Clean Architecture Course [10] – Bloc Scaffolding & Input Conversion

影片一開始就要安裝自動產生程式碼的 plugin:

https://plugins.jetbrains.com/plugin/12129-bloc

這是我第一次接觸 Bloc,看他概念就是吃 event 轉換 state,直覺就是想到 Redux 的 reducer,名詞不同,但做的事情還滿像的。本集就先定義 state 跟 event 而已,Bloc 還沒有正式開始講。

Flutter TDD Clean Architecture Course [11] – Bloc Implementation 1/2

這集開頭在處理 Bloc 的建構子,因為放了各種 use case 進來,所以他代表 MVVM 的 ViewModel 或是 MVP 的 Presenter,都是代表著 Presentation layer 與 Domain layer 的分界線,而 Bloc 又兼任 event 轉 state 的角色。

此外,作者也加入了 assert 來處理必定不會 null 的情境,其實在 Dart 2.12 就已經支援 null safety 了,這個需求用 null safety 來處理會更恰當;但 assert 可以處理更多條件式的限制,例如:1<= x <=10 。

在 class 後面接了冒號,這個使用方法稱為 initializer:

https://dart.dev/guides/language/language-tour#initializer-list

影片後期在教學 Stream 的測試方法,因為會發射多種資料,所以測試用的 function 也有所差異。

Flutter TDD Clean Architecture Course [12] – Bloc Implementation 2/2

延續上一集寫到一半的實作,這集會將它補完。中間有一段要用 switch 來處理 failure 的 type,作者有提到 dart 並沒有 sealed class 可以列舉所有情況,因此還是要有一個 default error 來符合 swich 語法,儘管他可能完全用不到。

補充

async / await

對我而言,async 就像 RxJava 裡面的 Single,代表會回傳一個結果回來,其中 await 是 blockingGet 的行為。

async* / yield

async* 像是代表 RxJava 裡面的 Flowable,會回傳多個結果回來,yield 是 emit 結果的動作。

yield*

我要 emit 一個 Iterable<T> 會用到,影片是對 .fold() 使用,因為我預期回傳是多個 state,這邊必須使用 Stream 來實作,因此用 yield* 才是最適合的。

看到這邊幾乎可以肯定星號 * 是針對「多個」回傳值來做使用,一開始看到還有點誤會是不是指標之類的東西。

專案連結

想看我實作的完整專案程式內容請瀏覽我的 github:

Summary
Article Name
使用 TDD + Clean Architecture 開發 Flutter 專案課程筆記 10 ~ 12
Description
這是我第一次接觸 Bloc,看他概念就是吃 event 轉換 state,直覺就是想到 Redux 的 reducer,名詞不同,但做的事情還滿像的。本集就先定義 state 跟 event 而已,Bloc 還沒有正式開始講。
Author
Publisher Name
jarvislin.com

有什麼想法嗎?快來跟大家分享你的看法。