網站首頁 編程語言 正文
前言
目前Flutter三大主流狀態管理框架分別是provider
、flutter_bloc
、getx
,三大狀態管理框架各有優劣,本篇文章將介紹其中的flutter_bloc
框架的使用,他是bloc
設計思想模式在flutter上的實現,bloc
全程全稱 business logic
,業務邏輯的意思,核心思想就是最大程度的將頁面ui與數據邏輯的解耦,使我們的項目可讀性、可維護性、健壯性增強。
兩種使用模式
首先第一步引入插件:
flutter_bloc: ^8.1.1
引入之后,flutter_bloc
使用支持以下兩種模式管理。
Bloc
模式,分別有ui層(view)、數據層(state)、事件層(event)、邏輯處理層(bloc)
,適合大型復雜頁面使用。這四層結構bloc
在源碼處就進行了封裝處理,所以我們使用的時候是必須要分離出來的,比如event
和state
是要強制分開去寫的。這也導致了簡單頁面使用此模式復雜化的問題,所以這種模式對于簡單頁面是非常沒有必要的,但是如果是復雜頁面的話,非常建議使用此模式,相信你在處理頁面數據邏輯的時候會非常的清晰。
下面我們以計數器為例寫個demo,記住bloc
模式有四層,且必須分開,我們建四個文件分別代表這四層,
數據層: 用來存放數據,這個很簡單。
/// 數據層 class DemoState { // 自增數字 late int num; DemoState init() { // 初始化為0 return DemoState()..num = 0; } DemoState clone() { // 獲取最新對象 return DemoState()..num = num; } }
事件層: 用來存放頁面所有事件的地方,比如計數器頁面只有初始化事件和自增事件。
/// 頁面中所有的交互事件 abstract class DemoEvent {} /// 初始化事件 class InitEvent extends DemoEvent {} /// 自增事件 class IncrementEvent extends DemoEvent {}
Bloc邏輯處理層: 處理上方數據和事件邏輯的地方,通過源碼就能發現作者的意圖,泛型里必須分開傳入事件和數據,也足以說明這個模式的特點,就是為復雜頁面準備的。
所以如果寫計數器的話,你就會感覺非常沒有必要,因為計數器頁面很簡單,但是當你的state
層里的數據非常多且復雜的時候,你就能體會出分開的好處了。
代碼:
/// 邏輯處理層 繼承Bloc class DemoBloc extends Bloc<DemoEvent, DemoState> { ///構造方法 DemoBloc() : super(DemoState().init()) { /// on 注冊所有事件 on固定寫法 on<InitEvent>(_init); on<IncrementEvent>(_add); } /// 私有化邏輯方法 暴露Event事件即可 void _init(InitEvent event, Emitter<DemoState> emit) { // emit方法,通知更新狀態 類似于 ChangeNotifier的notifyListeners方法。 emit(state.clone()); } _add(IncrementEvent event, Emitter<DemoState> emit) { state.num++; // 調用emit方法更新狀態 emit(state.clone()); } }
UI層: UI層只負責頁面的編寫,而無需關心數據的生成,根節點返回BlocProvider
,并實現create
方法,返回我們的bloc實體類。child
實現我們的 UI頁面。
/// UI層 class BlocNumPage extends StatelessWidget { @override Widget build(BuildContext context) { // 以下固定寫法 return BlocProvider( create: (BuildContext context) => DemoBloc()..add(InitEvent()), child: Builder(builder: (context) => _buildPage(context)), ); } Widget _buildPage(BuildContext context) { // 獲取bloc實例 final bloc = BlocProvider.of<DemoBloc>(context); return Stack( children: [ Center( // 對于需要更新狀態的組件 外層包裹一個BlocBuilder,傳入bloc、state child: BlocBuilder<DemoBloc, DemoState>( builder: (context, state) { // 返回具體ui組件 return Text("點擊了${bloc.state.num}次"); }, ), ), Positioned( bottom: 20, right: 20, child: FloatingActionButton( onPressed: () { // 調用add方法觸發自增事件, bloc.add(IncrementEvent()); }, child: Icon(Icons.add), ), ) ], ); } }
效果:
Cubit模式
Cubit
模式,分別有ui層(view)、數據層(state)、邏輯處理層(cubit)
,相較于bloc
模式去掉了event層,適合比較簡單的頁面。跟bloc
模式只是邏輯處理哪里發生了改變,數據層、頁面ui層代碼一模一樣。
可以看到Cubit
模式的邏輯就少了很多代碼,而且是直接處理數據即可。通過源碼,作者意圖也很明顯,只是傳遞了數據層。
/// 寫邏輯 class CubitCubit extends Cubit<CubitState> { CubitCubit() : super(CubitState().init()); ///自增 void increment() => emit(state.clone()..num = state.num + 1); }
其他寫法跟Bloc
是一樣的,就不粘貼了,那看到這有的小伙伴可能就要問了,一個頁面要創建3、4個文件,這也太麻煩了吧,高端的程序員往往不會去寫一些重復性較高的代碼,其實上面的四個文件都是可以通過插件自動生成的,這里下面兩個插件,一個是官方的,官方的不會自動生成ui層的文件,一個是小呆呆寫的,可以自動生成ui層重復性的代碼文件,兩者區別不大,推薦小呆呆的,因為可以多生成一個文件。
最后
Bloc本質上是一種數據邏輯和UI解耦思想,上面的演示只是非常非常簡單的用法,就可以看出作者在源碼層給我們強制性的設定了非常明確的各個模型,每個模型只專心負責一個事情,這樣看起來一個頁面會非常的清晰,可以說Flutter_Bloc
是一個非常適合大型項目使用的狀態管理框架。
原文鏈接:https://juejin.cn/post/7160259367563067400
相關推薦
- 2022-08-14 Android?中TextureView和SurfaceView的屬性方法及示例說明_Android
- 2022-09-30 QT設計秒表功能(跑步計時器)_C 語言
- 2023-12-19 CentOS和Ubuntu中防火墻相關命令
- 2023-03-01 GoLang中Strconv庫有哪些常用方法_Golang
- 2022-12-15 Native?Memory?Tracking追蹤區域示例分析_React
- 2022-01-08 iframe 監聽滾動事件并滾動到指定位置
- 2022-05-31 關于k8s?使用?Service?控制器對外暴露服務的問題_云其它
- 2022-11-14 CSS樣式中選擇器+盒子模型+定位+浮動
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支