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

news2025/8/2 22:07:27

一、前言

在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实现局部刷新实例详解的详细内容,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制造业企业如何高效进行生产计划排单?

随着社会的发展&#xff0c;个性化订单需求越来越多。面对如今更加多样化、紧迫化、随机化的订单&#xff0c;企业必须采用科学合理的方式和手段对生产计划进行控制&#xff0c;以提高企业的经济效益。生产计划在实施的过程中&#xff0c;由于一些原因&#xff0c;往往造成实施…

Node.js 模块化及npm概念介绍

文章目录模块化1 模块化的基本概念1.1 什么是模块化1.2 模块化规范2 Nodejs中的模块化2.1 Nodejs中模块的分类2.2 加载模块2.3 模块的作用域2.4 向外共享模块作用域中的成员2.4.1 module对象2.4.2 module.export对象2.4.3 共享成员时的注意点2.4.4 exports对象2.4.5 exportshe …

栈和队列及其多种接口实现-c语言

今天我们来完成栈和队列&#xff0c;首先我们要明白什么是栈&#xff0c;什么是队列。 目录 栈的选择 栈的结构 栈的初始化 栈的销毁 入栈 出栈 返回栈顶元素 计算数据个数 判断是否为空 队列的选择 队列的结构 入队列 出队列 判断是否为空 取队头元素 取队尾…

Java Spring Bean的生命周期 三级缓存

Java Spring Bean的生命周期 三级缓存 SpringBean的生命周期&#xff1a;是从 Bean 实例化之后&#xff08;即通过反射创建出对象之后&#xff09;&#xff0c;到Bean成为一个完整对象&#xff0c;最终存储到单例池中&#xff0c;这个过程被称为Spring Bean的生命周期。Spring…

盘一盘那些年我们使用的Java

一、序 那些年我们使用过的Java版本。我是一个80后&#xff0c;当年在大学时代使用的是Java5&#xff0c;当时是大三的时候学校有了编程课&#xff0c;最开始学的是汇编语言、VB、C然后再是Java。当时就是Java5&#xff0c;搞了个课程设计与顺便也参加了个校园程序设计大赛。当…

MCE | Nrf2 的“戏精”之路

外界刺激 (如药物、紫外线和电离辐射) 和内源性自由基和活性氧 (ROS) 会直接或者间接地损伤蛋白质、脂质和 DNA 等细胞成分&#xff0c;为了抵御这些不利影响&#xff0c;机体形成了一套复杂的氧化应激应答系统来缓解细胞所受的损害。而 Nrf2&#xff0c;作为调控抗氧化应激的一…

SAP ABAP Function Module 的动态调用方式使用方式介绍试读版

在本教程前面的步骤 7&#xff0c;我们介绍了 ABAP Function Module 的基本使用方法&#xff1a; 7. ABAP function module 的使用 最近我的知识星球有朋友提问&#xff1a; 大佬&#xff0c;我想问一下动态获取到物料主数据的字段名之后&#xff0c;如何将获取到的字段名去与…

01. Docker的基本介绍

Docker概述&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于Go语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器…

1网络模型

网络层次可划分为五层因特网协议栈和七层因特网协议栈 五层 互联网分层 物理层 发送端&#xff1a;链路层给的bit把他变成信号&#xff0c;什么电磁波的信号通过介质传出去 接收端&#xff1a;把物理信号还原为原来的数据01010110这种 传的是比特 链路层 网卡&#xff1a;有…

力扣 112. 路径总和

力扣 112. 路径总和 题目 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

[附源码]java毕业设计医院挂号系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

css解决uniapp使用image标签图片无法撑满全屏问题

css解决uniapp使用image标签图片无法撑满全屏问题 文章目录css解决uniapp使用image标签图片无法撑满全屏问题前言一、问题还原二、问题解决1、在解决问题之前有必要先来学习一个css的属性2、问题的原因3、解决问题总结前言 本片文章主要讲解了如何解决&#xff0c;开发中遇到需…

RTL8380M管理型交换机系统软件操作指南三:VLAN

接下来对管理型交换机的VLAN部分进行详细的描述&#xff0c;主要包括以下七部分内容&#xff1a; VLAN概述、VLAN优点、VID概念、PVID、端口处理报文方式、基础配置、VLAN端口配置一 VLAN概述 VLAN&#xff08;Virtual Local Area Network&#xff09;的中文名为“虚拟局域网”…

数仓之范式

学习目录一、基本概念二、函数依赖三、三范式区别一、基本概念 定义&#xff1a;范式是指数据建模中必须遵守一定的规则 目的&#xff1a;降低数据的冗余性 缺点&#xff1a;获取数据时&#xff0c;需要通过Join拼接出最后的数据 分类&#xff1a;第一范式(1NF)、第二范式(…

大数据可视化之医疗大数据平台

一 项目背景 随着信立泰企业的不断发展&#xff0c;公司管理的需求倒逼业务系统不断引入。经营数据的不断积累使得企业的信息化成为企业进行技术改造及提高企业管理水平的重要手段。信立泰因之而制定了对应的信息化战略&#xff0c;主要任务是最大限度的利用医疗大数据平台加強…

基于java的购物中心商铺管理系统的设计与实现/商铺管理系统

摘 要 随着社会的发展&#xff0c;计算机的优势和普及使得购物中心商铺管理系统的开发成为必需。购物中心商铺管理系统主要是借助计算机&#xff0c;通过对信息进行管理。减少管理员的工作&#xff0c;同时也方便广大用户对个人所需信息的及时查询&#xff0c;其次是大量信息的…

Python:语法进阶

目录 一、运算符 基本运算符 比较运算符 赋值运算符 多变量赋值 逻辑运算符 三元运算符 源码&运行结果 test01 案列 效果 二、循环语句 一、运算符 基本运算符 比较运算符 赋值运算符 多变量赋值 a, b, c 1, 2, 3 # a b c 3 print(b, c) 逻辑运算符 三元运…

docker (五) (搭建MySQL数据库集群)

MySQL集群搭建我们通过PXC【Percona XtraDB Cluster】来实现强一致性数据库集群搭建。 一 Percona XtraDB Cluster &#xff08;理论&#xff09; 1 简介 Percona XtraDB Cluster是MySQL高可用性和可扩展性的解决方案&#xff0c;Percona XtraDB Cluster提供的特性如下&…

二叉树的前序/中序/后序遍历新手入门介绍

一、前序遍历 | 根左右(DLR) 1.1 简介 前序遍历简介也叫先序遍历 前序遍历 可以分为三部分&#xff1a;根、左子树、右子树 先遍历根节点 、再遍历左子树、再遍历右子树 左/右 子树遍历方法&#xff1a;先访问根节点&#xff0c;再访问 左孩子节点&#xff0c;访问到左孩子节…

04、SpringAOP详解

1、Spring AOP简介 1、什么是AOP 1、定义阐述 AOP的全称是 Aspect Oriented Programming&#xff0c;是面向切面编程的技术&#xff0c;把一个个的横切关注点放到某个模块中去&#xff0c;称之为切面。那么每一个的切面都能影响业务的某一种功能&#xff0c;切面的目的就是功…