前言
這幾集就是在講 Flutter 特有的 BLoC,我們已經跨入 presentation layer 了,這邊會開始碰到 UI 背後的邏輯。
筆記
Flutter TDD Clean Architecture Course [10] – Bloc Scaffolding & Input Conversion
影片一開始就要安裝自動產生程式碼的 plugin:
這是我第一次接觸 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:
影片後期在教學 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:
留言列表