当前位置: 首页 > news >正文

Flutter StreamBuilder 实现局部刷新 Widget

Stream 就是事件流或者管道,是基于事件流驱动设计代码,然后监听订阅事件,并针对事件变换处理响应。

Stream 分单订阅流和广播流,单订阅流在发送完成事件之前只允许设置一个监听器,并且只有在流上设置监听器后才开始产生事件,取消监听器后将停止发送事件.

核心使用代码为:


本页面实现 Demo 效果如下

程序入口

main() {runApp(MaterialApp(//不显示 debug标签debugShowCheckedModeBanner: false,//显示的首页面home: DemoStreamBuilder(),));
}

DemoStreamBuilder 主页面


///代码清单
class DemoStreamBuilder extends StatefulWidget {@override_DemoStreamBuilderState createState() => _DemoStreamBuilderState();
}class _DemoStreamBuilderState extends State<DemoStreamBuilder> {int _count = 0;//流Stream 控制器StreamController<int> _streamController = StreamController();@overridevoid dispose() {//销毁_streamController.close();super.dispose();}@overrideWidget build(BuildContext context) {//return Scaffold(floatingActionButton: FloatingActionButton(child: Icon(Icons.add),onPressed: () {_count++;//发送消息_streamController.add(_count);},),appBar: AppBar(title: Text("StreamBuilder"),),body: Container(padding: EdgeInsets.all(30),child: Column(children: [//接收消息StreamBuilder<int>(//初始值initialData: _count,//绑定Streamstream: _streamController.stream,builder: (BuildContext context, AsyncSnapshot<int> snapshot) {return Text("测试使用 ${snapshot.data}");},),Text("测试使用"),Text("测试使用"),],),),);}
}

Flutter StatefulBuilder 用来实现局部数据刷新

1 作用描述
用来实现局部数据刷新的功能,官网描述如下:

  • A platonic widget that both has state and calls a closure to obtain its child widget. 一个柏拉图式的小部件,它既有状态,又调用一个闭包来获取它的子小部件。
  • The StateSetter function passed to the builder is used to invoke a rebuild instead of a typical State’s State.setState.传递给构建器的StateSetter函数用于调用重构,而不是典型的State的State. setstate。
  • Since the builder is re-invoked when the StateSetter is called, any variables that represents state should be kept outside the builder function.由于在调用StateSetter时将重新调用构建器,所以表示状态的任何变量都应该保留在构建器函数之外。

2 基本使用核心代码

class DemoStatefulBuilderPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(//状态构建器body: buildStatefulBuilder(),);}
}
int _count = 0;StatefulBuilder buildStatefulBuilder() {return StatefulBuilder(//构建状态改变的Widgetbuilder: (BuildContext context, void Function(void Function()) setState) {//居中return Center(//手势识别child: GestureDetector(child: Text("早起的年轻人 $_count"),//单击事件onTap: () {//刷新当前  StatefulBuilder 中的状态setState(() {_count++;});},),);},);}

Flutter 实现局部刷新

当widget需要进行刷新时,我们可以通过调用widget的setState方法来实现,setState随后会调用State的build方法来进行重建

//请求刷新setState((){});#State<T extends StatefulWidget>@overrideWidget build(BuildContext context) {//构建新的Widgetreturn new Text(_text);}

那么,如果 我们能将 build方法中的 return new Text(_text) 暴漏出去,我们就可以实现通用的 局部刷新 Widget。

实现方案


1. 接口回调,将return new Text(_text);暴露出去:
用typedef function实现

//定义函数别名typedef BuildWidget = Widget Function();

将函数别名 BuildWidget 作为参数,传递到State.build方法即可

完整代码

import 'package:flutter/material.dart';//封装 通用局部刷新工具类
//定义函数别名
typedef BuildWidget = Widget Function();class PartRefreshWidget extends StatefulWidget {PartRefreshWidget(Key key, this._child): super(key: key);BuildWidget _child;@overrideState<StatefulWidget> createState() {return PartRefreshWidgetState(_child);}}class PartRefreshWidgetState extends State<PartRefreshWidget> {BuildWidget child;PartRefreshWidgetState(this.child);@overrideWidget build(BuildContext context) {return child.call();}void update() {print('update');setState(() {});}}

使用:

import 'package:flutter/material.dart';import 'PartRefreshWidget.dart';class GlobalKeyDemo extends StatefulWidget {@override_GlobalKeyDemoState createState() => _GlobalKeyDemoState();
}class _GlobalKeyDemoState extends State<GlobalKeyDemo> {int _count = 0;//使用1 创建GlobalKeyGlobalKey<PartRefreshWidgetState> globalKey = new GlobalKey();@overrideWidget build(BuildContext context) {print('----------------build');return Scaffold(appBar: AppBar(title: Text("inheritedWidget"),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[//使用2 创建通用局部刷新widgetPartRefreshWidget(globalKey, () {///创建需要局部刷新的widgetreturn Text('变化的:$_count',style: TextStyle(color: Colors.green),);}),Text('不变的: $_count'),RaisedButton(onPressed: () {//点击_count++;//使用3调用刷新方法globalKey.currentState.update();},),],),));}
}

效果如下图所示:

相关文章:

Flutter StreamBuilder 实现局部刷新 Widget

Stream 就是事件流或者管道&#xff0c;是基于事件流驱动设计代码&#xff0c;然后监听订阅事件&#xff0c;并针对事件变换处理响应。 Stream 分单订阅流和广播流,单订阅流在发送完成事件之前只允许设置一个监听器&#xff0c;并且只有在流上设置监听器后才开始产生事件&…...

【代码随想录】算法训练营 第十六天 第六章 二叉树 Part 3

104. 二叉树的最大深度 题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 思路 用递归来做&#xff0c…...

【C++数据结构】顺序存储结构的抽象实现

文章目录 前言一、目标二、SeqList实现要点三、SeqList函数实现3.1 get函数3.2 set函数3.3 insert函数带2个参数的insert带一个参数的insert 3.4 remove函数3.5 clear函数3.6 下标运算符重载函数无const版本const版本 3.7 length函数 总结 前言 当谈到C数据结构时&#xff0c;…...

LeetCode75——Day31

文章目录 一、题目二、题解 一、题目 206. Reverse Linked List Given the head of a singly linked list, reverse the list, and return the reversed list. Example 1: Input: head [1,2,3,4,5] Output: [5,4,3,2,1] Example 2: Input: head [1,2] Output: [2,1] Exa…...

小白学爬虫:通过商品ID或商品链接封装接口获取淘宝商品销量数据接口|淘宝商品销量接口|淘宝月销量接口|淘宝总销量接口

淘宝商品销量接口是淘宝开放平台提供的一种API接口&#xff0c;通过该接口&#xff0c;商家可以获取到淘宝平台上的商品销量数据。使用淘宝商品销量接口的步骤如下&#xff1a; 1、在淘宝开放平台注册并创建应用&#xff0c;获取API Key和Secret Key等必要的信息。 2、根据淘宝…...

AI:75-基于生成对抗网络的虚拟现实场景增强

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

【MySQL数据库】| 索引以及背后的数据结构

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;MySQL数据库 &#x1f397;️ 如何优雅的活着&#xff0c;是我找寻的方向 目录 1. 基本知识2. 索引背后的数据结构总结 1. 基本知识 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有…...

家用电脑做服务器,本地服务器搭建,公网IP申请,路由器改桥接模式,拨号上网

先浇一盆冷水&#xff01; 我不知道其他运营商是什么情况。联通的运营商公网IP端口 80、8080、443 都会被屏蔽掉&#xff0c;想要开放必须企业备案&#xff08;个人不行&#xff09;才可以。也就是说&#xff0c;只能通过其他端口进行showtime了。 需要哪些东西&#xff1f; 申…...

原神游戏干货分享:探索璃月的宝箱秘密,提高游戏资源获取效率!

《原神》是一款备受玩家喜爱的开放世界冒险游戏&#xff0c;而在游戏中获取资源是提升角色实力的重要途径。在这篇实用干货分享中&#xff0c;我们将介绍一些探索璃月地区的宝箱秘密&#xff0c;帮助你提高游戏资源获取的效率。 首先&#xff0c;璃月地区的宝箱分为普通宝箱和精…...

idea 2023 设置启动参数、单元测试启动参数

找到上方的editconfigration&#xff0c; 如下图&#xff0c;如果想在启动类上加&#xff0c;就选择springboot&#xff0c;如果想在单元测试加&#xff0c;就选择junit 在参数栏设置参数&#xff0c;多个参数以空格隔开 如果没有这一栏&#xff0c;就选择就可以了。 然后&…...

RSA加密算法(后端)

public class RSA {private static final String RSA_ALGORITHM "RSA";/*** 生成RSA密钥对** return RSA密钥对*/public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(RSA…...

挑战100天 AI In LeetCode Day08(热题+面试经典150题)

挑战100天 AI In LeetCode Day08&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-102.1 题目2.2 题解 三、面试经典 150 题-103.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…...

地铁机电设备健康管理现状及改善方法

轨道交通和我们的生活息息相关&#xff0c;从火车到地铁再到轻轨&#xff0c;给人们的出行带来了很大的便利。因此&#xff0c;保障轨道交通的的正常运行和安全至关重要&#xff0c;需要运维人员及时排查设备的问题&#xff0c;解决故障&#xff0c;保证轨道交通的安全运行。本…...

安卓NDK开发

1、jni&#xff1a;java native interface 作用&#xff1a;用于java代码和C、c代码的交互&#xff08;代码混编&#xff09;&#xff1b; 分类使用&#xff1a;Jni静态注册、jni动态注册 2、静态注册 1&#xff09;.绑定java方法和C/C方法的方式之一&#xff1b; …...

高性能网络编程 - 解读5种I/O模型

文章目录 服务端处理网络请求流程图基础概念阻塞调用 vs 非阻塞调用同步处理 vs 异步处理阻塞、非阻塞 和 同步、异步的区别recvfrom 函数 五种I/O模型I/O模型1&#xff1a;阻塞式 I/O 模型(blocking I/O&#xff09;I/O模型2&#xff1a;非阻塞式 I/O 模型(non-blocking I/O&a…...

复盘一个诡异的Bug

该Bug的诡异之处在于这是一个由多种因素综合碰撞之后形成的综合体。纵观整个排查过程&#xff0c;一度被错误的目标误导&#xff0c;花费大量功夫后才找到问题点所在&#xff0c;成熟的组件在没有确凿证据之前不能随意怀疑其稳定性。 前言 此前在接入两台粒径谱仪&#xff08;…...

【uniapp】通用列表封装组件

uniapp页面一般都会有像以下的列表页面&#xff0c;封装通用组件&#xff0c;提高开发效率&#xff1b; &#xff08;基于uView前端框架&#xff09; 首先&#xff0c;通过设计图来分析一下页面展示和数据结构定义 w-table组件参数说明 参数说明类型可选值默认值toggle列表是…...

17 Linux 中断

一、Linux 中断简介 1. Linux 中断 API 函数 ① 中断号 每个中断都有一个中断号&#xff0c;通过中断号可以区分出不同的中断。在 Linux 内核中使用一个 int 变量表示中断号。 ② request_irq 函数 在 Linux 中想要使用某个中断是需要申请的&#xff0c;request_irq 函数就是…...

微信小程序真机调试连接状态一直在正常和未链接之间反复横跳?

背景&#xff1a;小程序真机调试的时候&#xff0c;发现真机的network不显示接口调用情况&#xff0c;控制台也没有输出内容。具体如下所示&#xff1b; 解决方法&#xff1a; 1、确保手机端连接的网络和微信开发者工具网络一致&#xff0c;比如用同一个WiFi 2、真机自动调试…...

最新Next 14快速上手基础部分

最新Next 14快速上手基础部分 最新的NEXT快速上手文档&#xff0c;2023.10.27 英文官网同步&#xff0c;版本Next14.0.0 本项目案例&#xff1a;GitHub地址&#xff0c;可以根据git回滚代码到对应知识&#xff0c;若有错误&#xff0c;欢迎指正&#xff01; 一、介绍 1.什么是…...

别再手动改PR了!教你写个ABAP报表,一键批量处理采购申请审批与信息更新

告别低效操作&#xff1a;用ABAP打造智能采购申请批量处理系统 每天面对数百条采购申请的状态更新和文本修改&#xff0c;你是否已经厌倦了重复的点击和等待&#xff1f;在SAP系统中&#xff0c;采购申请的日常维护往往成为业务人员的时间黑洞。本文将带你从零开始构建一个智能…...

TerraMaster D1 SSD Pro Thunderbolt 5硬盘盒评测与使用指南

1. 产品概述&#xff1a;TerraMaster D1 SSD Pro Thunderbolt 5硬盘盒TerraMaster最新推出的D1 SSD Pro Thunderbolt 5硬盘盒&#xff0c;是前代Thunderbolt 4版本D1 SSD Plus的全面升级。作为一名长期使用各类外置存储设备的视频剪辑师&#xff0c;我第一时间入手测试了这款产…...

工业智能化趋势与CAD图检系统价值解析

一、工业智能化核心发展趋势 在新型工业化推进过程中&#xff0c;工业智能化已从单点技术应用迈向系统级融合赋能阶段&#xff0c;呈现出自主化、数智化、生态化三大核心演进方向。 &#xff08;一&#xff09;技术演进&#xff1a;从自动化智能迈向自主化智能 制造业智能化…...

MPV播放器完整配置指南:3步打造你的专属高清影院体验

MPV播放器完整配置指南&#xff1a;3步打造你的专属高清影院体验 【免费下载链接】mpv_PlayKit &#x1f504; mpv player 播放器折腾记录 Windows conf | 中文注释配置 汉化文档 快速帮助入门 | mpv-lazy 懒人包 Win11 x64 config | 着色器 shader 滤镜 filter 整合方案 项目…...

5个让你成为暗黑2单机游戏大师的秘密武器:d2s-editor存档编辑器深度解析

5个让你成为暗黑2单机游戏大师的秘密武器&#xff1a;d2s-editor存档编辑器深度解析 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经在暗黑破坏神2中为了一个稀有装备刷了整整一个周末&#xff1f;是否因为想尝试新职…...

RPC 原理:Dubbo为了偷懒而存在的中间商

Dubbo 的核心使命只有一个&#xff1a;让程序员在调用远程方法时&#xff0c;产生一种“我就在本机内存里调个函数”的错觉。为了实现这个巨大的谎言&#xff0c;Dubbo 在底层搞了三场惊天动地的“魔术”。咱们这就钻进 JVM 和网卡的缝隙里&#xff0c;看看它到底是怎么忽悠你的…...

告别噪音困扰!用STM32CubeMX和INMP441麦克风,5分钟搞定I2S立体声采集(附完整代码)

5分钟极速搭建INMP441麦克风立体声采集系统&#xff1a;STM32CubeMX实战指南 当你第一次拿到INMP441数字麦克风模块时&#xff0c;可能会被I2S协议、24位数据处理这些概念吓到。但事实上&#xff0c;用STM32CubeMX工具配合正确的配置方法&#xff0c;完全可以在5分钟内让这个高…...

智能眼镜在急救医疗中的多模态多任务学习应用

1. 智能眼镜在急救医疗中的多模态多任务学习应用概述急救医疗服务&#xff08;EMS&#xff09;是医疗体系中最具挑战性的场景之一。急救医疗技术人员&#xff08;EMT&#xff09;需要在高压环境下快速做出生死攸关的决策&#xff0c;同时处理复杂的认知和操作任务。传统急救系统…...

批量给文件改名的方法有哪些?这5个实用技巧新手也能秒会

在日常办公和学习中&#xff0c;我们常常需要处理大量文件&#xff0c;杂乱的文件名不仅影响工作效率&#xff0c;还可能导致文件查找困难。无论是学生整理作业、职场人士归档资料&#xff0c;还是摄影爱好者管理照片&#xff0c;批量给文件改名都是必备技能。本文将详细介绍5种…...

5个步骤掌握Happy Island Designer:从新手到岛屿设计大师的终极指南

5个步骤掌握Happy Island Designer&#xff1a;从新手到岛屿设计大师的终极指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Ani…...