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


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

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

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

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


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

  • Provider ( Provider 异步通信、Provider状态管理)

  • ValueNotifier 点击查看详情

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

  • EventBus (不考虑使用)

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

本文章讲解 StreamBuilder 的基本使用,以及通过 StreamBuilder实现的计时器的Demo功能

本文章最终实现的效果如下:

1 计时器实现

在 Flutter 中,StreamBuilder 是一个将 Stream 流与 Widget结合到一起的,可实现局部数据更新的一个组件,基本使用如下代码清单1-1所示:

 ///代码清单1-1/// 监听Stream,每次值改变的时候,更新Text中的内容StreamBuilder<String> buildStreamBuilder() {return StreamBuilder<String>(///绑定streamstream: _streamController.stream,///默认的数据initialData: "00:00:00",///构建绑定数据的UIbuilder: (BuildContext context, AsyncSnapshot<String> snapshot) {///snapshot.data 就是传递的数据对象return Text('当前时间  ${snapshot.data} ',style: TextStyle(fontSize: 22, color: Colors.blue),);},);}

StreamBuilder 需要绑定一个 Stream ,在Flutter中我们一般通过 StreamController 来进行流的操作,所以这里也创建了一个 StreamController。

///使用单订阅流即可StreamController<String> _streamController = StreamController();

在这里实现了一个计时效果,所以需要一个定时器 Timer 来实时刷新页面获取当前系统时间以更新页面显示,核心代码如下:全部代码在这里

class _TestABPageState extends State {///测试数据String _message = "--";///使用单订阅流即可StreamController<String> _streamController = StreamController();///计时器Timer _timer;@overridevoid initState() {super.initState();///间隔1秒执行时间_timer= Timer.periodic(Duration(milliseconds: 1000), (timer) {///获取当前的时间DateTime dateTime= DateTime.now();///格式化时间String formatTime = DateFormat("HH:mm:ss").format(dateTime);_message=formatTime;///流数据更新_streamController.add("$formatTime");});}@overridevoid dispose() {super.dispose();///关闭_streamController.close();///取消计时器_timer.cancel();}... ... 省略
}

然后再结合 Android Studio 的 Flutter Performance 调试工具,可查看得知页面数据刷新了StreamBuilder内部包裹的Widget数据状态,同时内存GC更新时间间隔出比较长,如下图所示:

在应用业务开发中,巧妙的使用 StreamBuilder 实现局部数据刷新机制可巧妙的提升应用的性能。

当不使用 StreamBuilder 实现的计时功能,核心实现代码如下:全部代码在这里

///测试数据String _message = "--";///计时器Timer _timer;@overridevoid initState() {super.initState();///间隔1秒执行时间_timer = Timer.periodic(Duration(milliseconds: 1000), (timer) {///获取当前的时间DateTime dateTime = DateTime.now();///格式化时间String formatTime = DateFormat("HH:mm:ss").format(dateTime);setState(() {_message = formatTime;});});}@overrideWidget build(BuildContext context) {///页面主体脚手架return Scaffold(appBar: AppBar(title: Text("测试Stream $_message"),),body: Text('当前时间  $_message ',style: TextStyle(fontSize: 22, color: Colors.blue),),);}

运行效果及内存分析如下图所示:

在不使用 StreamBuilder 时,setState 刷新的是当前页面中所有的Widget数据状态,然后从上图分析也得知内存GC的时间间隔也是比较知的,所以性能相对来讲是较低的。

2 业务场景应用

如下图是我们的产品中的一个签到页面,大家可以看到,签到按钮的背景在缓慢变化,然后一个计时器,1.0版本未使用 StreamBuilder ,全部是清一色的 setState ,如下图可看到页面的刷新频率,而且整个 Widget 页面中所有的组件会全部被刷新。

当使用 StreamBuilder 优化方案后,如下图所示:


完毕

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

  • 点击查看详情

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

Flutter StreamBuilder 异步更新数据相关推荐

  1. 日常随笔: React useEffect中使用异步更新数据方法遇到的问题

    开发随笔:react hooks 异步更新的问题 1. 问题叙述 在使用antd/G2图表更新的时候发现:在useEffect中通过异步函数对图表渲染的data进行更新, 但是由于第一次更新后,数据是 ...

  2. Flutter ValueNotifier 异步通信、ValueListenableBuilder异步更新数据

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. Flutter是谷歌推出的最新的移动开发框架. [x1]微信公众号的每日提醒 随时随记 每日积累 随心而过 [x2]各种系列的视频教程 ...

  3. WinForm 界面异步更新数据(方式二)

    在WINForm开发过程中,我们经常遇到填充比较多的数据到界面时,有时候界面卡死啦,这时候我们最好的办法是采用线程来对数据进行收集,然后再体现在界面上. 1.第一种是比较繁琐的采用异步进行操作. 创建 ...

  4. Java 异步更新数据

    1. 背景 字典或者模型加载经常会用到双buffer这样读多写少的数据结构.在C++的时候会经常用到brpc里面的双buffer实现.具体可以参考:https://blog.csdn.net/Al_x ...

  5. wpf在presenter(VM)中异步更新viewer中数据

    在MVP或者MVVM模式中,VM和Presenter通过binding与Viewer交换数据.在实际项目中,往往需要动态刷新界面的数据.本人一般通过刷新与之绑定的属性变化完成.但是,如果遇到数据量较大 ...

  6. echars vue 添加数据没更新_vue在使用ECharts时的异步更新和数据加载详解

    前言 最近在学习eCharts,学习到了异步更新和数据加载这一块,觉着有必要总结一下,方法以后的时候参考学习,在开始本文之前,对eCharts不熟悉的朋友们可以参考下这篇文章:下面话不多说了,来一起看 ...

  7. 完全代码实现UITableView下拉更新,异步请求数据

    原文:http://www.cnblogs.com/xiaobaizhu/archive/2012/12/01/2797817.html 之前写了一篇用控件实现自定义UITableViewCell的, ...

  8. Oracle CDC (Change Data Capture)更新数据捕获——概述

    Change Data Capture能高效识别并捕获数据的插入.修改和删除,使更新数据供个人或应用使用. CDC从oracle 9i开始引入,//TODO 在11G R2之后的版本里将取消支持,被O ...

  9. tensorflow分布式训练之同步更新和异步更新

    1.同步更新 在同步更新的时候, 每次梯度更新,要等所有分发出去的数据计算完成后,返回回来结果之后,把梯度累加算了均值之后,再更新参数.这样的好处是loss的下降比较稳定, 但是这个的坏处也很明显, ...

最新文章

  1. 模板 - 拓扑排序
  2. 5、Java并发性和多线程-相同线程
  3. 计算机科学班(原acm班),计算机科学创新实验班(以下简称ACM班)培养计划.doc
  4. 【算法设计与分析】16 分治策略:快速排序(快速排序的时间复杂度计算)
  5. php5.4配置gd库,php配置GD库
  6. MySQL服务无法正常启动的解决方法(1053错误)
  7. 误差理论实际应用公式
  8. MTK GPS问题调试
  9. MAXWELL软件的初步使用
  10. 用聚宽量化炒股-5获取数据函数-6)获取指数成分股代码函数get_index_stocks
  11. oracle共有同义词,Oracle同义词概念
  12. 【数据分析与挖掘实战】航空公司客户价值分析
  13. 复杂性理论:科学方法的第三个梯级
  14. paip.重装系统后svn服务器修复
  15. Servlet 使用getRequestDispatcher进行请求转发页面未跳转 后台也未报错的问题的解决方法
  16. san-miguelbunny
  17. Unix File Permissions ACLs in OS X(part 2)
  18. Mol Cell Proteomics. |陈洁| 整合鸟枪法蛋白质组学中鉴定和定量的错误率
  19. 《Python数据结构与算法分析》第一章课后习题
  20. Git版本控制工具的使用一

热门文章

  1. 口罩人脸检测与分类开源代码汇总
  2. CVPR2019 | 弱监督图像分类建模
  3. 实例说明代码段(.text)、数据段(.data)、bss段、只读数据段(.rodata)、堆栈的划分依据
  4. 点云上的卷积神经网络及其部分应用
  5. Python数据分析模块 | pandas做数据分析(二):常用预处理操作
  6. OpenCV人脸识别之一:数据收集和预处理
  7. 二次规划问题转换为半正定问题(QPtoSDP)
  8. linux的可执行文件通常放在哪个目录中?写出该目录的路径.,实验2 Linux的基本操作与 使用vi编辑器 2010 (1)...
  9. linux sata raid,linux – 两个SIL RAID卡的SATA驱动器问题
  10. hive连接mysql报错_hive远程模式初始化mysql报错