Flutter 实现局部刷新 StreamBuilder 实例详解

《Flutter 控件大全》第九十:StreamBuilder 如果你对Flutter还有疑问或者技术方面的疑惑,欢迎加入Flutter交流群(微信:laomengit)。 同时也欢迎关注我的Flutter公众号【老孟程序员】,公众号首发Flutter的相关内容。 Flutter地址:http://laomengit.com 里面包含160多个组件的详细用法。 StreamBuilder组件用于异步接收数据更新组件,与FutureBuilder不同的地... 阅读详情

一、前言

在flutter项目中,页面内直接调用setState方法会使得页面重新执行build方法,导致内部组件被全量刷新,造成不必要的性能消耗。出于性能和用户体验方面的考虑我们经常会使用局部刷新代替全量刷新进行页面更新的操作。包括Provider、ValueNotifier和StatefulBuilder等在内的技术方案,都能够帮助我们实现Flutter局部刷新的需求。

本文记录的是通过StreamBuilder来实现局部刷新的方法。

二、StreamBuilder 简介

StreamBuilder组件的源代码如下,其中包含了四个参数:

const StreamBuilder({
     Key? key,
     this.initialData,
     Stream<t>? stream,
     required this.builder,
   }) : assert(builder != null),
        super(key: key, stream: stream);
</t>

key : 组件的键值

initialData : 初始值数据,用于确保第一帧有可用数据显示,否则将使用 null 值构建第一帧

stream : 用于监听自己创建的数据流

builder : 必传参数,返回一个小部件用于页面构建

其中builder 包含了两个参数,一个页面的context,另一个是当前快照信息:

typedef AsyncWidgetBuilder<t> = Widget Function(BuildContext context, AsyncSnapshot<t> snapshot);
 final AsyncWidgetBuilder<t> builder;

三、StreamBuilder的实际应用

StreamBuilder组件在实际应用中主要分成以下操作:

1、声明一个StreamController类型的控制器;

2、将需要局部刷新数据的组件嵌套在StreamBuilder组件内,接收信息;

3、往StreamBuilder里添加数据,并通知StreamBuilder重新构建;

4、关流,避免内存泄漏

int a = 0;
 // 1、声明一个StreamController类型的控制器,命名为streamController;
 final StreamController<int> streamController = StreamController();
 @override
 Widget build(BuildContext context) {
   return Scaffold(
     appBar: AppBar(),
     body: Center(
       child: Column(
         mainAxisAlignment: MainAxisAlignment.center,
         children: [
           // 2、将需要局部刷新数据的组件嵌套在StreamBuilder组件内,并接收信息;
           StreamBuilder<int>(
             stream: streamController.stream,
             initialData: a,
             builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
               return Text('a : $a');
             },
           ),
           ElevatedButton(
             onPressed: () {
               a++;
               setState(() {});
             },
             child: Text('setState'),
           ),
           ElevatedButton(
             onPressed: () {
               a++;
               // 3、往`StreamBuilder`里添加数据,并通知`StreamBuilder`重新构建;
               streamController.add(a);
             },
             child: Text('streamBuilder'),
           ),
         ],
       ),
     ),
   );
 }
 @override
 void dispose() {
   // TODO: implement dispose
   super.dispose();
   // 4、关流,避免内存泄漏
   streamController.close();
 }

点击第一个ElevatedButton按钮后,页面执行setState(() {})方法,通过系统的Flutter Performance工具我们可以捕获到组件刷新的情况如下,整个页面被重新构建,这种情况下性能消耗较大。
在这里插入图片描述
点击第二个ElevatedButton按钮后,页面执行streamController.add(a)方法,通过系统的Flutter Performance工具我们可以捕获到组件刷新的情况如下,只有StreamBuilder组件及其内部组件被重新构建,实现了局部刷新的功能,有效的提高了页面的性能。
在这里插入图片描述

总结

为了避免State.setState方法重新构建全局造成的性能消耗,我们可以通过StreamBuilder组件对页面进行局部刷新。

以上就是Flutter StreamBuilder实现局部刷新实例详解的详细内容,

【Flutter】Flutter 实现局部刷新 在 Flutter 开发中,我们经常会遇到需要更新 UI 的情况。在这些情况下,我们通常会刷新整个页面,但这样做可能会导致性能问题。为了解决这个问题,我们可以使用局部刷新,只更新需要改变的部分。 阅读详情

相关推荐

flutter 异步Stream以及StreamBuilder组件的使用

前言 在Dart中Stream 也是用于接收异步事件数据,和Future 不同的是,它可以接收多个异步操作的结果,它常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。 即Future可以给我们一个值,但Stream会给我们多个值。 Stream 如何监听Stream 监听数据流的两种方式: 1,stream.listen 2,StreamBuilder 比如:每隔1秒钟后返回一个数字: final future = Future.delayed(Duration(seconds:1), ()=

智玲君 1092

flutter开发实战-StreamBuilder使用介绍及实例

flutter开发实战-StreamBuilder使用介绍及实例StreamBuilder是一个Widget,它依赖Stream来做异步数据获取刷新widget。

一名开发者 2798

【AI Infra】【RLHF框架】VeRL中WorkerGroup与Ray资源调度的协同机制剖析

本文深入剖析了VeRL框架中WorkerGroup与Ray资源调度的协同机制。通过解析Ray Placement Group的资源抽象和VeRL的RayResourcePool封装,详细阐述了WorkerGroup如何与底层资源精确绑定,并实现RLHF训练中异构、多阶段任务的灵活资源分配与动态调整,为大规模分布式强化学习训练提供了高效解决方案。

weixin_29204205的博客 389

Flutter 中的 StreamBuilder 小部件:全面指南

是一个根据Stream对象的最新数据来构建 widget 的小部件。当Stream中有新数据产生时,会根据这些数据更新其子组件。这使得成为处理实时数据流并更新 UI 的理想选择。stream: cameraImageStream, // 假设这是一个从相机获取图像数据的 Stream// 将图像数据显示为一个 Widget${snapshoterror');} else {// 表示正在加载},

smileKH的博客 1277

HDMI调试避坑指南:从AVI InfoFrame到通用控制包,这些DataIsland Packet细节千万别忽略

本文深入解析HDMI调试中DataIsland数据包的关键细节,包括AVI InfoFrame、通用控制包和音频时钟再生包(ACR)的配置与故障排查。通过实际案例和寄存器配置示例,帮助工程师快速定位显示异常、色彩失真和音频中断等问题,提升HDMI接口调试效率。

weixin_30897233的博客 635

红外:非均匀性校正01_基本原理与基本方法

非均匀校正(nonuniformity correction,NUC) 基本原理 这里要表达的意思就是:图中每一条直线对应一个像素点的,亮度/辐照度的情况。由于硬件的关系,每一个像素点的线性响应很不一样,所以需要通过矩阵来校正。 校正原理: 一点校正 两点校正 其他原理介绍: 参考链接: 基于多项式拟合的红外焦平面非均匀校正 课件:光电成像——非均匀性校正 红外图像非均匀性校正相关汇总 红外非均匀性校正算法总结 红外图像非均匀矫正——一点矫正 ...

dlvector的博客 2万+

Flutter局部刷新

在Flutter中,如果我们想要更新页面中的某个widget的状态的话,一般会使用setState方法重走build方法来刷新。当页面布局复杂的时候,这样肯定是不行的。 下面提供了两种局部刷新的方式,通过provider和StreamBuilder来实现局部刷新 1、通过provider刷新 首先在pubspec.yaml中添加provider依赖 # provider provider:...

正义 8292

一文详解数据仓库、数据湖、湖仓一体和数据网格

本文对数据仓库、数据湖、湖仓一体、数据网格四个技术概念进行了辨析,并对它们的优势和局限给出了对比介绍。

oOBubbleX的博客 2595

Flutter中的异步组件-StreamBuild-Stream(一)

该代码简单的对StreamBuild进行演示,程序的效果是执行一个持续发射事件的流 ///用来展示StreamBuild异步任务的代码演示 ///FutureBuild用来处理单次的异步任务,该组件可以用来处理多次的异步任务,比如事件流 ///对于详细的使用需要了解一下异步任务中的Stream事件流,这里只做简单的介绍 import 'dart:async'; import 'package:flutter/material.dart'; void main() => runApp(MyApp())

Mr_Tony的专栏 517

我用两个月时间,终于把优快云付费资源项目玩明白了!

关于项目的定位,这是一个知识付费项目,根据市场研究机构的数据显示,到2023年,全球知识付费市场规模将达到2000亿美元,所以说知识付费的前景是十分广阔的,当下互联网时代信息大爆炸,80后、90后、00后群体对知识付费的认可度也大幅提升,同时这群作为知识付费的主流人群已经具备了更强的消费能力,而且对于知识付费的需求更高。目前整个知识付费领域仍然在发展起步的初期,尽快在知识付费领域布局可以帮助我们在这波红利中获得一份不错的收益。而且个人认为,

白话机器学习 2万+

v86.01 鸿蒙内核源码分析 (静态分配篇) | 很简单的一位小朋友 | 百篇博客分析 OpenHarmony 源码

相比动态分配,静态内存池的分配就是个小弟弟,非常的简单,两个结构体 + 一张图 就能说明白。

日拱一卒,力出一孔 775

StreamBuilder使用

Flutter局部刷新StreamBuilder组件

zhanglei85730的博客 901

【信号与系统】Multisim 仿真信号合成与分解

软件 Multisim 进行方波信号的产生、分解和合成,观察信号波形的分解与合成,加深对信号频谱的理解。

AXYZdong的博客 2万+

Flutter实现局部刷新的几种方式

在Flutter开发过程中,当你的 Flutter 应用的状态发生改变时我们会调用setState去刷新UI,这个操作会触发用户界面的重绘。当我们的UI页面比较复杂的时候,使用setState会损耗一部分的性能,这篇文章主要使用Flutter中UI局部刷新的几种方法。

我叫柱子哥 6129

《派出你的AI同事:WorkBuddy案例实战》055:客服工单自动分类与话术生成

客服工单自动分类与话术生成 —— 《派出你的AI同事:WorkBuddy案例实战》系列文章,配图已统一为规范示意图。

LuckyHanMo的博客 283

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Flutter StreamBuilder 实现局部刷新 Widget

当widget需要进行刷新时,我们可以通过调用widget的setState方法来实现,setState随后会调用State的build方法来进行重建。那么,如果 我们能将 build方法中的 return new Text(_text) 暴漏出去,我们就可以实现通用的 局部刷新 Widget。Stream 就是事件流或者管道,是基于事件流驱动设计代码,然后监听订阅事件,并针对事件变换处理响应。Flutter StatefulBuilder 用来实现局部数据刷新。本页面实现 Demo 效果如下。

Dream It Possible 1272

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Flutter 局部刷新

但由于在实际开发中依赖异步数据更新UI的这种场景非常常见,并且当StatefulWidget中控件树较大时,更新一个属性导致整个树重建,消耗性能,因此Flutter专门提供了FutureBuilder和SteamBuilder两个组件来快速实现这种功能。但到多选的时候,需要知道当前选中的选项,有选项被点击的时候需要存储下来,当再次被点击的时候要清空这个选项,同时界面还需要同步更新,因此就涉及到状态管理了。方法构建有状态组件,并且提供了状态更新方法,因此在里面完成状态管理。生成的组件的状态的。

qq_27909209的博客 5430

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Flutter StreamBuilder 异步更新数据

在 Flutter 中,StreamBuilder 是一个将 Stream 流与 Widget结合到一起的,可实现局部数据更新的一个组件

代码小疯子 2639

【Flutter】Flutter局部刷新的几种方式

在Flutter开发中,我们会根据一些状态的值来改变UI样式,setState也是我们常用的状态刷新方式;但是当我们的页面布局比较复杂的时候,我们再用setState的时候,整个页面就会重绘,比较影响APP的性能,这种场景我们就可以只更新局部的组件。上述几种方式可以根据不同的需求场景来选择。setState 是最基础的局部刷新,ValueNotifier 和 ChangeNotifier 等更适合状态管理场景,而 RepaintBoundary 则更注重性能优化。

ZFJ_张福杰 2005

详解flutter刷新流程,让你的应用更流畅

Flutter是谷歌推出的高性能、跨端UI框架,可以通过一套代码,支持iOSAndroid等多个平台,且能达到原生性能。Flutter也可以与平台原生代码进行混合开发,其更新迭代速度很快,技术发展也日趋成熟,如今已经有很多公司在使用这种新跨端技术。我们知道在flutter中可以使用setState()来刷新的UI,这会遍历调用子Widget的build()重构视图。当一个页面内容比较复杂时,会包含多个widget,如果直接调用根组件的setState(),会遍历所有子Widget的build()

you__are_my_sunshine的博客 2435

Flutter的状态管理以及如何实现局部刷新

Flutter的状态管理以及如何实现局部刷新

极客洪成的博客 1152

Flutter 状态管理 | StreamBuild 、局部刷新的效果、Flutter局部刷新

ui页面是经常要改内容的 但是如果用setState方法去刷新 每次都会重新Build构造一遍 会造成app卡顿 资源占用高,所以可以使用StreamBuild 去订阅 刷新需要刷新的那个UI部件 就不用重构一遍整个页面,除了StreamBuild以外 还有很多种方式 如谷歌的亲儿子Provider ,以及第三方的Bloc ,个人觉得 bloc 使用起来比较复杂,本人喜欢StreamBuild这...

jq的博客 1758

Flutter StreamBuilder 实现的一个倒计时功能

本文章讲解 StreamBuilder 的基本使用,以及通过 StreamBuilder实现的计时器的Demo功能,本效果在应用开发中常用于 APP 的开屏广告倒计时页面功能。

代码小疯子 1711

Flutter之StreamBuilder的封装,让你的项目更加工程化

本文章就不对StreamBuilder过多的介绍了,如果不了解的可以去这篇文章中先行了解一下 https://www.jianshu.com/p/889ea7f9734a 关于StreamBuilder,我们常用来做的就是异步加载WidgetUI,为了使整个项目做到统一的规范化,我们将封装一个统一的StreamBuilder,用来全局使用。 大体分为以下几个文件 他们分别的作用是 GlobalS...

qq_38774121的博客 4829

Flutter中如何利用StreamBuilder和BLoC来控制Widget状态

参考文章:Reactive Programming - Streams - BLoC (为了便于阅读,略去了原文中的一些跟StreamBuilder和Bloc无关的拓展概念,比如RxDart、Demo的解释等,想要进一步了解的可以移步原文。) 先粗略讲点关于Stream的东西   Stream其实类似于Rx大家族,也是一种对于数据流的订阅管理。Stream可以接受任何类型的数据,值、事件、对象...

吉原拉面 8935
上一篇: Flutter基础知识
下一篇: Android compileSdkVersion 升级到33
黄毛火烧雪下
黄毛火烧雪下 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄14年 7714粉丝 439原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值