题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。


Flutter是谷歌推出的最新的移动开发框架。

【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过

【x2】各种系列的视频教程 免费开源 关注 你不会迷路

【x3】系列文章 百万 Demo 随时 复制粘贴 使用


在 Flutter 中可用于异步通信的方案有如下:

  • Provider ( 就是本文了)

  • ValueNotifier 点击查看详情

  • Stream: StreamController的使用详情 | StreamBuilder组件的结合使用 | StreamBuilder 实现的倒计时进度圆圈

  • EventBus (不考虑使用)

  • Bloc BLoC 异步通信、BlocBuilder的基本使用、BlocProvider的初探


本文章实现的结果如下:


1 前言

Provider 很多网友会说用于状态管理,在这里小编称为异步通信。
Provider 是一个组件也是一种编程思想,在使用 Provider 时首先要添加依赖:点击查看最新版本

dependencies:provider: ^4.3.2+2

然后将依赖库拉取到本地

flutter packages get

provider 库中常用的组件有 ChangeNotifierProvider、MultiProvider、Provider、Consumer、Consumer2等等,后面会一一分析使用。

2 provider 的基本使用

第一步
就是在Flutter应用程序中提供一个 Provider 生产者,应用程序的整体可以是一个 Provider ,局部功能块也可以是单独的一个Provider,在这里,小编直接在根视图处理提供 ChangeNotifierProvider,如下代码清单1-1所示。完整源码在这里

///代码清单 1-1
///flutter应用程序中的入口函数
void main() => runApp(ChangeNotifierProvider(create: (BuildContext context) {return TimeCounterModel();},child: ProviderMainApp(),),);

ChangeNotifierProvider 将数据事件处理源 TimeCounterModel 与 界面显示的UI结合在一起,TimeCounterModel 是我们自定义的ChangeNotifier,Widget页面负责发送事件与消费事件结果。

如一个网络请求,Widget页面发出网络请求的指令,具体的网络请求处理逻辑在 ChangeNotifier 中,然后处理好数据结果后再发送到 Widget 页面中通过 Consumer 将数据结果渲染显示在页面上。

第二步: TimeCounterModel 定义如下:


///代码清单1-2
import 'package:flutter/cupertino.dart';
import 'package:intl/intl.dart';class TimeCounterModel with ChangeNotifier {String _formatTime="00:00:00";void getCurrentTime() {///获取当前的时间DateTime dateTime= DateTime.now();///格式化时间 import 'package:intl/intl.dart';///需要添加 intl 依赖_formatTime = DateFormat("HH:mm:ss").format(dateTime);notifyListeners();//2}get formatTime => _formatTime;//3
}

第三步
然后在 ProviderMainApp (当然外面还需要有一些嵌套,可以查看完整源码)这个页面中 定义了一个计时器 Timer 用来实现页面的时间按秒更新数据。

///代码清单1-3
class _TestABPageState extends State {///计时器Timer _timer;@overridevoid initState() {super.initState();///间隔1秒执行时间_timer = Timer.periodic(Duration(milliseconds: 1000), (timer) {///发送事件Provider.of<TimeCounterModel>(context,listen: false).getCurrentTime(); //2});}@overridevoid dispose() {super.dispose();///取消计时器_timer.cancel();}@overrideWidget build(BuildContext context) {... ... }}

在这里使用到了Provider发送数据,其实就是通过 Provider 结合 context 来获取TimeCounterModel的过程,获取到 TimeCounterModel 再调用其 getCurrentTime方法获取当前时间来触发时间更新。

TimeCounterModel model = Provider.of<TimeCounterModel>(context,listen: false);

然后就是 build 方法中定义的消费者,代码如下:

 ///代码清单1-4/// 通过 Consumer 来消费事件结果Widget buildBlocBuilder() {return Consumer<TimeCounterModel>(///参数 value 就是绑定的事件结果 TimeCounterModelbuilder: (BuildContext context, value, Widget child) {return Container(///外边距margin: EdgeInsets.only(left: 12, top: 12),child: Text('${value.formatTime}',style: TextStyle(fontSize: 22.0, color: Colors.red),),);},);}

运行调试结果如下:

3 多数据源的巧妙操作

多数据源对应多个 ChangeNotifierProvider ,一个 Widget 页面同时需要绑定多个数据源的更新操作,每一个数据源都对应一个 ChangeNotifierProvider,在provider 框架中 通过 MultiProvider 来组合这些 ChangeNotifierProvider 代码如下:完整源码在这里

///代码清单2-1
class TestProviderMulPage extends StatelessWidget {@overrideWidget build(BuildContext context) {///组合多个Providerreturn MultiProvider(providers: [///计时器ChangeNotifierProvider(create: (BuildContext context) {return TimeCounterModel();},),///随机数据ChangeNotifierProvider(create: (BuildContext context) {return RandomNumberModel();},)],child: MaterialApp(home: TestConsumerTimePage(),),);}
}

然后在事件消费结果处理处可以分别使用 Consumer 来处理结果,代码如下:

 @overrideWidget build(BuildContext context) {///页面主体脚手架return Scaffold(appBar: AppBar(title: Text("Provider "),),body: Column(children: [buildTimeConsumer(),buildNumberConsumer(),],),);}
/// 通过 Consumer 来消费事件结果/// 计时器的更新Widget buildTimeConsumer() {return Consumer<TimeCounterModel>(builder: (BuildContext context, value, Widget child) {return Container(///外边距margin: EdgeInsets.only(left: 12, top: 12),child: Text('当前时间 ${value.formatTime}',style: TextStyle(fontSize: 22.0, color: Colors.red),),);},);}
 ///随机数的更新Widget buildNumberConsumer() {return Consumer<RandomNumberModel>(builder: (BuildContext context, value, Widget child) {return Container(///外边距margin: EdgeInsets.only(left: 12, top: 12),child: Text('回传的数据 ${value.randomNumber}',style: TextStyle(fontSize: 22.0, color: Colors.red),),);},);}

运行效果如下:

当然也可以通过 Consumer2 来组合同时监听这两个结果代码如下:完整源码在这里

///通过 Consumer2 来同时监听处理两个结果Widget buildTimeConsumer2() {return Consumer2<TimeCounterModel,RandomNumberModel>(///参数 value 为 TimeCounterModel 类型///参数 value2 为 RandomNumberModel 类型builder: (BuildContext context, value,value2, Widget child) {return Container(///外边距margin: EdgeInsets.only(left: 12, top: 12),child: Text('当前时间 ${value.formatTime} 随机数 ${value2.randomNumber}',style: TextStyle(fontSize: 22.0, color: Colors.red),),);},);}

运行调试效果如下:


以小编的性格,要实现百万Demo随时复制粘贴肯定是需要源码的

MultiProvider 、Consumer2 完整源码在这里

ChangeNotifierProvider 、Consumer 完整源码在这里

当然以小编的性格,肯定是要有视频录制的,目前正在录制中,你可以关注一下 西瓜视频 — 早起的年轻人 随后会上传

Flutter Provider 异步通信、Provider状态管理相关推荐

  1. Flutter 全能型选手GetX —— 状态管理

    使用篇 简介 依赖管理 路由管理 状态管理 主题配置 多语言配置 离线缓存 网络请求 原理篇 Flutter 从源码看Getx的依赖原理 一.简介 Obx:响应式状态管理,当数据源变化时,将自动执行刷 ...

  2. Flutter: MobX和flutter_mobx状态管理器

    MobX.dart网站上的 " 入门指南" mobxjs video 组织Stores 安装依赖 dependencies:mobx:flutter_mobx:dev_depend ...

  3. Flutter项目该如何选择状态管理?

    状态管理原则 我们在开发过程中,为了提高项目的可维护度和性能,也为了让页面UI跟数据(本地或服务端数据)有效分离的同时又能有效同步,都会让项目保持清晰的目录结构.同时启用状态管理库. 而MVVM模式已 ...

  4. Flutter 状态管理

    目录 一.状态管理简介 1.1 为什么需要状态管理 1.1.1 Flutter与adr/ios UI框架区别 1.1.2 状态管理框架使用场景 1.2 需要解决的问题 二.状态管理框架现有方案调研 2 ...

  5. Flutter 超简单状态管理

    Flutter 状态管理 目前Flutter已经有许多状态管理的方案,但就我个人而言,并不能完全满足我的要求.我希望状态管理更加简单,而不是成为负担,我希望状态管理更加可靠,而不是使用过于复杂的实现. ...

  6. unable to recognize ole stream是什么意思_洞彻状态管理,或者说为什么你永远做不到...

    作者:Matt Carroll 原文:https://medium.com/fluttery/understanding-state-management-and-why-you-never-will ...

  7. flutter基于provider状态管理设置主题颜色、实现简单登录、注册功能---页面+逻辑

    一.provider状态管理设置主题颜色 第一步: 安装依赖库 provider: ^4.3.2+3 第二步: 创建共享数据模型 import 'package:flutter/material.da ...

  8. Flutter Provider状态管理-Consumer

    前言 如果对Consumer很了解的同学可以继续学习 Flutter Provider状态管理 - Selector 个人觉得Flutter的学习有三个很重要的阶段 widget的学习和使用 数据以及 ...

  9. Flutter 状态管理指南之 Provider

    2019 Google I/O 大会,Flutter 团队在"Pragmatic State Management in Flutter "演讲上正式介绍了 Provider.自此 ...

最新文章

  1. stm32f103r6最小系统原理图_电气工程师电气系统设计与电气设备的选择
  2. 1.8 深入解析new运算符
  3. 今年的校招,Java好拿offer吗?
  4. python numba jit加速使用方法
  5. c语言 遍历.jpg图像,求指导,如何用c语言实现读取*.raw格式图像
  6. 【Leetocde | 10 】54. 螺旋矩阵
  7. python大列表分割成小列表_Python有什么方法将列表分割成大小均匀的块?求使用实例...
  8. 運輸配送信息Delivery_Information
  9. Mysql如何新建一个服务和移除所新建的服务
  10. lucene中的nrt
  11. 论破坏计算机信息系统罪,论破坏计算机信息系统罪
  12. MySQL-ProxySQL中间件Admin Schemas介绍
  13. JTAG Pin脚定义及要求
  14. 国内外各大免费收录网站搜索引擎及导航网址提交入口
  15. 3.7V锂电池升压到5V1A,FS2114升压转换芯片设计布局
  16. 什么是结构化数据、半结构化数据、非结构化数据
  17. 学习计算机网络感想,计算机网络学习心得体会
  18. Java在PDF文档中添加或删除页面
  19. 结对项目之需求分析与原型设计(选择和分配本科毕设导师)
  20. 计算机c盘能备份数据吗,Win10不进系统就能备份C盘文件的方法,你知道吗?

热门文章

  1. CVPR 2020 | 旷视提出新型人-物交互检测框架,实现当前最佳
  2. 【提醒】刷脸取件被小学生“破解”!丰巢紧急下线
  3. 超Mask RCNN速度4倍,仅在单个GPU训练的实时实例分割算法
  4. 何恺明随机连接神经网络复现
  5. 【python教程入门学习】7个习惯提升python效率
  6. 美术零基础转行做游戏美术3D,如何快速入行?
  7. 大数据分析必须要会的数据预处理操作(一)!!!
  8. 乘法更新规则对于并发的非负矩阵分解和最大间隔分类
  9. webassembly类型_WebAssembly 现状与实战
  10. java自动获取ip_java自动获取电脑ip和MAC地址