设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间15 现在时间15 缓存数据 一个人挺好的

一个人挺好的 -- 一个

查看: 915|回复: 4

Flutter状态管理Provider的使用示例详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:2
  • 打卡月天数:0
  • 打卡总奖励:29
  • 最近打卡:2024-08-06 02:38:42
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
30
主题
26
精华
0
金钱
125
积分
64
注册时间
2023-9-29
最后登录
2025-5-31

发表于 2024-4-2 21:33:24 | 显示全部楼层 |阅读模式
目录


  • 前言
  • 计数器
  • 全局状态
  • 总结

前言

Provider是三大主流状态管理框架官方推荐使用的框架,它是基于官方数据共享组件
  1. InheritedWidget
复制代码
实现的,通过数据改变调用生命周期中的
  1. didChangeDependencies()
复制代码
方法,来实现状态的通知改变。
  1. InheritedWidget
复制代码
的使用可以参考我之前的这篇Flutter中几种数据传递的应用总结。

计数器

还是以计数器为例,这次通过
  1. Provider
复制代码
实现,
  1. provider
复制代码
相较于
  1. bloc
复制代码
并没有那么强制性分层,所以这里我们自己分为数据层(state)、逻辑处理层(provider)、UI层(view)。
首先创建文件夹:
1.jpeg

数据层: 用来保存数据,基本和
  1. bloc
复制代码
一样。
  1. /// 数据层
  2. class PNumState {
  3.   int num;
  4.   // 初始化
  5.   PNumState({this.num = 0});
  6.   PNumState clone() {
  7.     // 获取最新对象
  8.     return PNumState()..num = num;
  9.   }
  10. }
复制代码
业务逻辑层 ChangeNotifier: 用来处理页面的逻辑,和
  1. bloc
复制代码
相比较代码较为简洁,
  1. ChangeNotifier
复制代码
继承自
  1. Listenable
复制代码
,Listenable是一个维护监听者列表的对象,通过它我们可以调用
  1. notifyListeners();
复制代码
方法发送通知监听者实现页面状态的更新。
2.jpeg
  1. /// 业务逻辑层
  2. class PNumProvider extends ChangeNotifier {
  3. /// 初始化数据对象
  4.   final state = PNumState(num: 0);
  5.   /// 自增计数方法
  6.   add() {
  7.     state.num++;
  8.     notifyListeners();
  9.   }
  10. }
复制代码
UI层: 根结点返回
  1. ChangeNotifierProvider
复制代码
,通过它可以让provider实例和页面所有子节点进行绑定,实现
  1. create
复制代码
方法和
  1. builder
复制代码
方法分别返回
  1. provider
复制代码
和我们的页面
  1. Widget
复制代码
。 对于需要更新的组件使用
  1. Consumer<P>
复制代码
包裹,当范型里的实例调用
  1. notifyListeners
复制代码
的时候,
  1. builder
复制代码
返回的
  1. Widget
复制代码
将得到通知,从而达到数据的更新。
  1. /// UI层
  2. class PNumPage extends StatelessWidget {
  3.   @override
  4.   Widget build(BuildContext context) {
  5.   // 通过ChangeNotifierProvider将UI层和逻辑层进行绑定
  6.     return ChangeNotifierProvider(
  7.       create: (BuildContext context) => PNumProvider(),
  8.       builder: (context, child) => _buildPage(context),
  9.     );
  10.   }
  11.   Widget _buildPage(BuildContext context) {
  12.   // 获取provider示例
  13.     final provider = context.read<PNumProvider>();
  14.     return Stack(
  15.       children: [
  16.         Consumer<PNumProvider>(
  17.           builder: (context, provider, child) {
  18.           // builder方法回返回provider实例,和上面获取的实例一样
  19.             return Center(child: Text("点击了${provider.state.num}次"));
  20.           },
  21.         ),
  22.         Positioned(
  23.           child: FloatingActionButton(
  24.             onPressed: () {
  25.             // 调用自增方法
  26.               provider.add();
  27.             },
  28.             child: Icon(Icons.add),
  29.           ),
  30.           bottom: 20,
  31.           right: 20,
  32.         )
  33.       ],
  34.     );
  35.   }
  36. }
复制代码
效果:
3.webp

当然上方的代码也可以通过小呆呆的插件自动生成。
4.jpeg


全局状态
  1. provider
复制代码
全局状态使用也非常的方便,我们刚才的逻辑层需要在顶层runApp方法里进行初始化
  1. provider
复制代码
,使用
  1. MultiProvider
复制代码
可以同时管理多个全局状态。
  1. //全部状态管理
  2. class Status {
  3.   // 全局初始化
  4.   static Widget init(Widget child) {
  5.     //使用 MultiProvider 设置多个Provider 状态
  6.     return MultiProvider(
  7.       providers: [
  8.         ChangeNotifierProvider(
  9.         // 全局管理app主题
  10.             create: (_) => AppTheme(AppTheme.getDefaultTheme())),
  11.       ],
  12.       child: child,
  13.     );
  14.   }
  15. }
  16. // 在 runApp方法之前初始化
  17. runApp(Status.init(MyApp()));
复制代码
在接收的地方还是一样使用
  1. Consumer
复制代码
包裹组件,代码略...

总结
  1. provider
复制代码
相较于
  1. bloc
复制代码
没有强制的分层,即使是数据也是我们自己分出来的,不分出来直接写在逻辑层也是可以的,所以
  1. provider
复制代码
的使用感觉更加的灵活一些。对于不同项目我们可以使用不同的框架,开发人多建议
  1. bloc
复制代码
强制代码分层,如果人少就
  1. provider
复制代码

以上就是Flutter状态管理Provider的使用示例详解的详细内容,更多关于Flutter状态管理Provider的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
12
积分
4
注册时间
2024-5-4
最后登录
2024-5-4

发表于 2024-9-3 07:54:12 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2024-12-4 14:36:17 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2025-3-15 04:20:36 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:5
  • 最近打卡:2024-02-19 23:51:55
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
6
注册时间
2023-5-13
最后登录
2024-2-19

发表于 2025-3-18 10:47:57 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表