這里先放上Bloc與Mobx的官方文檔地址。其中Bloc的版本為V0.21.0,Mobx的版本為V0.3.1+1,F(xiàn)lutter的版本為V1.7.8+hotfix.4
一:相同之處
- 1:二者都是基于rx的訂閱模式來實(shí)現(xiàn)的框架。
- 2:二者都實(shí)現(xiàn)了presentation layer 與 business layer之間的分離。
二:不同之處
- 1:bloc是對(duì)RxDart的抽象。這里引用文檔的原話:
Bloc is built on top of RxDart; however, it abstracts all of the RxDart specific implementation details.
- 2:Mobx對(duì)Rx概念的實(shí)現(xiàn),就更加明顯,在官方文檔中隨處可見。
- 3:bloc更加注重對(duì)細(xì)節(jié)的把握。比如在文檔中經(jīng)常提到
f you want fine-grained control over when the builder function is called you can provide an optional condition to BlocBuilder
If you want fine-grained control over when the listener function is called you can provide an optional condition to BlocListener
- 4:Mobx則因?yàn)槭褂昧舜a生成,導(dǎo)致更多細(xì)節(jié)不容易控制。同時(shí)Mobx還有一種MVVM的思想在里面。
二者文檔的話,由于Mobx引用了json_annotation庫,并且使用了build_runner,mobx_codegen來進(jìn)行相關(guān)的代碼生成,導(dǎo)致文檔讀起來會(huì)比較繞。尤其是對(duì)json注解的理解,需要做solid underStanding才可以充分吸收。
相比較而言,Bloc雖然也使用了equatable庫,來進(jìn)行狀態(tài)之間的比較,因?yàn)橄嗤臓顟B(tài)是會(huì)被忽略的,但是總的學(xué)習(xí)成本要偏低不少。
同時(shí)Bloc的整體代碼量相對(duì)來說會(huì)偏多,但是都是程式代碼。因此使用相關(guān)插件,也可以避免。另外Bloc在調(diào)試方面也較Mobx有優(yōu)勢,比如Bloc的BlocDelegate就可以收集全局的所有事件和狀態(tài)流,來進(jìn)行time-travel。針對(duì)不同的Bloc,也可以單獨(dú)收集。Bloc在mapEventToState()的invoke的調(diào)用前后,都可以進(jìn)行hook等,讓Bloc更加友善。
3:json_serializable庫
無論是Bloc還是Mobx,都可以使用json_serializable庫來處理實(shí)體Model。但是由于Mobx框架還具有MVVM思想,因此Mobx對(duì)實(shí)體Model更加依賴。實(shí)體Model中的變量注解,也就成為了學(xué)習(xí)Mobx的關(guān)鍵。在實(shí)際開發(fā)中,我們的實(shí)體Model往往嵌套比較深,比如
{
"data":{
"user":{
"avatar_url":"https://dev-img-avatar.moremom.cn/2019/18874406/35/FvH0rc_MFtSODLeIdlbafrAfNI6T",
"city":{
"city_id":652900,
"city_name":"阿克蘇地區(qū)"
},
"cv":"混吃混喝又是一天 哦lol王lz 咯一快也扣 咯哦lolX5 哦搜狐心咯我 沐浴液 他墨跡我了 look你 女女OK look哦咯",
"gender":1,
"id":18874406,
"is_mentor":true,
"nickname":"摩爾撻戰(zhàn)士戰(zhàn)士戰(zhàn)士",
"term_id":154,
"title":"清華美院畢業(yè),《哈利·波特》中文版繪者",
"update_avatar":null,
"verified":false
}
},
"status":{
"code":0,
"msg":""
}
}