網站首頁 編程語言 正文
前言
Provider是三大主流狀態管理框架官方推薦使用的框架,它是基于官方數據共享組件InheritedWidget
實現的,通過數據改變調用生命周期中的didChangeDependencies()
方法,來實現狀態的通知改變。
InheritedWidget
的使用可以參考我之前的這篇Flutter中幾種數據傳遞的應用總結。
計數器
還是以計數器為例,這次通過Provider
實現,provider
相較于bloc
并沒有那么強制性分層,所以這里我們自己分為數據層(state)、邏輯處理層(provider)、UI層(view)。
首先創建文件夾:
數據層: 用來保存數據,基本和bloc
一樣。
/// 數據層 class PNumState { int num; // 初始化 PNumState({this.num = 0}); PNumState clone() { // 獲取最新對象 return PNumState()..num = num; } }
業務邏輯層 ChangeNotifier: 用來處理頁面的邏輯,和bloc
相比較代碼較為簡潔,ChangeNotifier
繼承自Listenable
,Listenable是一個維護監聽者列表的對象,通過它我們可以調用notifyListeners();
方法發送通知監聽者實現頁面狀態的更新。
/// 業務邏輯層 class PNumProvider extends ChangeNotifier { /// 初始化數據對象 final state = PNumState(num: 0); /// 自增計數方法 add() { state.num++; notifyListeners(); } }
UI層: 根結點返回ChangeNotifierProvider
,通過它可以讓provider實例和頁面所有子節點進行綁定,實現create
方法和builder
方法分別返回provider
和我們的頁面Widget
。 對于需要更新的組件使用Consumer<P>
包裹,當范型里的實例調用notifyListeners
的時候, builder
返回的Widget
將得到通知,從而達到數據的更新。
/// UI層 class PNumPage extends StatelessWidget { @override Widget build(BuildContext context) { // 通過ChangeNotifierProvider將UI層和邏輯層進行綁定 return ChangeNotifierProvider( create: (BuildContext context) => PNumProvider(), builder: (context, child) => _buildPage(context), ); } Widget _buildPage(BuildContext context) { // 獲取provider示例 final provider = context.read<PNumProvider>(); return Stack( children: [ Consumer<PNumProvider>( builder: (context, provider, child) { // builder方法回返回provider實例,和上面獲取的實例一樣 return Center(child: Text("點擊了${provider.state.num}次")); }, ), Positioned( child: FloatingActionButton( onPressed: () { // 調用自增方法 provider.add(); }, child: Icon(Icons.add), ), bottom: 20, right: 20, ) ], ); } }
效果:
當然上方的代碼也可以通過小呆呆的插件自動生成。
全局狀態
provider
全局狀態使用也非常的方便,我們剛才的邏輯層需要在頂層runApp方法里進行初始化provider
,使用MultiProvider
可以同時管理多個全局狀態。
//全部狀態管理 class Status { // 全局初始化 static Widget init(Widget child) { //使用 MultiProvider 設置多個Provider 狀態 return MultiProvider( providers: [ ChangeNotifierProvider( // 全局管理app主題 create: (_) => AppTheme(AppTheme.getDefaultTheme())), ], child: child, ); } } // 在 runApp方法之前初始化 runApp(Status.init(MyApp()));
在接收的地方還是一樣使用Consumer
包裹組件,代碼略...
總結
provider
相較于bloc
沒有強制的分層,即使是數據也是我們自己分出來的,不分出來直接寫在邏輯層也是可以的,所以provider
的使用感覺更加的靈活一些。對于不同項目我們可以使用不同的框架,開發人多建議bloc
強制代碼分層,如果人少就provider
。
原文鏈接:https://juejin.cn/post/7160632051308167175
相關推薦
- 2022-12-05 Python中的內置函數isdigit()_python
- 2022-05-10 Element-ui 中<template slot-scope=“scope“> 的用法問題以及剖
- 2023-07-07 Spring 管理事務的方式有幾種? Spring 事務中的隔離級別有哪幾種?
- 2022-07-22 對稱式加密與非對稱式加密的對比
- 2023-04-07 React?styled?components樣式組件化使用流程_React
- 2022-04-02 Android中Button實現點擊換圖案及顏色_Android
- 2022-09-09 詳解C語言中動態內存管理及柔性數組的使用_C 語言
- 2023-02-09 c++報錯問題解決方案lvalue?required?as?left?operand?of?assi
- 最近更新
-
- 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同步修改后的遠程分支