首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

StreamBuilder触发一个方法两次,而与变量相同的操作只触发一次

StreamBuilder是Flutter框架中的一个组件,用于构建基于流的UI。它可以监听一个流并根据流的事件来更新UI。

当使用StreamBuilder时,如果流中的数据发生变化,StreamBuilder会重新构建并更新UI。但是有时候会遇到StreamBuilder触发一个方法两次,而与变量相同的操作只触发一次的情况。

这种情况通常是由于流中的数据发生了多次变化,导致StreamBuilder多次触发。为了解决这个问题,可以使用distinct方法来过滤掉重复的数据,只保留不同的数据。

例如,假设有一个名为stream的流,我们可以在StreamBuilder中使用distinct方法来确保只有不同的数据才会触发方法:

代码语言:txt
复制
StreamBuilder(
  stream: stream.distinct(),
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    // 构建UI
  },
)

在这个例子中,我们使用distinct方法来过滤掉重复的数据,确保只有不同的数据才会触发builder方法。这样就可以避免StreamBuilder触发一个方法两次,而与变量相同的操作只触发一次的问题。

推荐的腾讯云相关产品:腾讯云云函数(SCF)。腾讯云云函数是一种事件驱动的无服务器计算服务,可以帮助开发者更轻松地构建和管理应用程序。您可以使用腾讯云云函数来处理流数据,并根据需要触发相应的方法。

了解更多关于腾讯云云函数的信息,请访问:腾讯云云函数

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

优雅UI与Model绑定 Flutter DataBus使用~

当我们点击按钮时使本地变量key1,key2做增加操作,之后调用setState()。 ? img ? img ? img ?...从代码可知StreamBuilder接受两个参数,一个stream,表示我们监听Stream(一个StreamBuilder监听一个Stream,但是一个Stream能被多个Widget监听),builder...在key1点击事件中往Stream中add数据,这样在key1流上产生了一条数据,对应监听者收到数据后,更新自己内容,不会重建其他区域。 ? ? ?...核心在于我们addObserver中,该方法需要传入一个 返回值为Widget Function(BuildContext context, T data) observer方法,这个传入方法正是我们需要构建...基于此设计了一个dataBus总线管理。 ? 我们将每一个key和对应DataLine存入Map中进行管理,通过直接调用getLine(key)方法获取创建DataLine。

2.5K41

Flutter响应式编程:Streams和BLoC

StreamSubscription也允许以下操作: 停止监听 暂时 恢复Stream只是一个简单管道吗?不,Stream还允许在流出之前处理流入其中数据。.../操作, ...Stream类型Stream有两种类型。...单订阅Stream这种类型Stream只允许在该Stream整个生命周期内使用单个监听器。即使在第一个订阅被取消后,也无法在此类流上收听两次。...在这里,重建StreamBuilder(当然还有子窗口小部件); 我们仍然在为页面使用StatefulWidget唯一原因,仅仅是因为我们需要通过dispose方法释放StreamController...换句话说,从事件(例如,点击),变量变化,消息,......到构建请求,可能改变或发生所有事物所有内容将被传送,由数据流触发

4.2K90
  • Flutter完整开发实战详解(十二、全面深入理解状态管理设计)

    之后我们可以 dispatch 一个 Action ,在经过 middleware 之后,触发对应 Reducer 返回数据,而事实上这里核心内容实现,还是 Stream 和 StreamBuilder...5、最后一个 NextDispatcher 执行时会先执行 reducer 方法获取新 state ,然后通过 _changeController.add 将状态加载到 Stream 流程中,触发 StoreConnector...在 flutter_redux 中,开发者每个操作都只是一个 Action ,而这个行为所触发逻辑完全由 middleware 和 reducer 决定,这样设计在一定程度上将业务与UI隔离,同时也统一了状态管理...image 因为篇幅原因,这里也展示部分代码,其中 reducer 还是我们熟悉存在,而闲鱼在这 redux 基础上提出了 Comoponent 概念,这个概念下 fish_redux 是从 Context...7、Store 对象对外提供 dispatch 方法,执行时内部会执行 4 中 List _listeners,触发 onNotify。

    2.1K20

    Flutter 绘制探索 4 | 深入分析 setState 重建和更新 | 七日打卡

    StatefulWidget,使用 Timer.periodic 创建一个定时计时器,每 3 秒触发一次,修改激活索引,并执行 _ColorChangeWidgetState#setState 来重构界面...= color; } } 复制代码 ---- 2.案例调试测试 现在在 ShapePainter#paint 方法上添加断点, 下面是两次 paint 时情况。...Window#scheduleFrame 是一个 native 方法,通过注释可以知道,该方法会在下一次适当时机调用onBeginFrame 和 onDrawFrame 回调函数。 ?...由于 StatefulElement 父类是 ComponentElement,所以入栈方法如下: ? ---- 继续向下,会发现有一个局部变量 built 会通过 build() 方法初始化。...这里都非 null 会继续向下,声明一个 newChild 局部变量,这里 child 非空。 ?

    1.9K20

    flutter中使用BloC模式

    在flutter中,实现BloC模式精髓就是, 展示数据从BloC中来,具体到了stream上,有了stream到来,就可以使用StreamBuilder来构建ui了。...,之后,stream中产生了新数据,于是,StreamBuilder触发了UI更新,整个流程就跑通了。...3、便面了setState方式来触发build,可能性能更好,注意,只是可能,因为这也是大佬们说,我并不太认可,实际上我认为,即便是使用streamBuilder,当stream有新data时,也是触发了其包裹组件走...2、如果让我选择,我更加倾向于直接使用Bloc,最少代码完成需求,比起引入一个库,话费代价要少。 初学者疑问 1、想bloc发送事件一定需要通过另外一个streamController么?...答案是不一定,写成一个公开发送,直接操作那个数据相关StreamController发送数据也可以,个人觉得这么写可能还更加简单呢?只是看自己以业务逻辑吧。

    17.5K82

    【Flutter 异步编程 - 拾】 | 探索 Stream 转换原理与拓展

    所以 T 类型代表是输出类型,这就是 _ForwardingStream 代表是 输出流 原因。 其中 _handleData 是唯一抽象方法,也是之后触发转换操作地方。...到这里,其实流转化原理就介绍完了。总的来看并不复杂,就是创建一个新流,监听输入流,再触发转换方法,将新元素加入新流而已。 ---- 3....这里 _runUserCode 方法,可能有些朋友看作比较晕: 这个方法很简单,两个函数入参,第一个触发,作为第二个函数回调值。...在滑动过程中可以看出 throttle 是间隔性触发,会在满足阈值之后多次触发。 而对于 debounce 而言,前后元素时间间隔差大于阈值才会触发一次。...也就是说当你一直拖拽,前后元素响应时间戳都会很短,是不会触发 debounce 。上面动图中,停顿了一下,前后间隔超过阈值,所以中间会触发一次。 ---- 2.

    90230

    Flutter完整开发实战详解(十一、全面深入理解Stream)

    ); 执行 1 中得到 _onData 对象,触发 listen 时传入回调方法。...在上一篇章中说过,因为 Dart 中 Future 之类异步操作是无法被当前代码 try/cacth ,而在 Dart 中你可以给执行对象指定一个 Zone,类似提供一个沙箱环境 ,而在这个沙箱内,...如下图所示,一般操作符变换 Stream 实现类,都是继承了 _ForwardingStream , 在它内部_ForwardingStreamSubscription 里,会通过上一个 Pre...image 同时 Stream 还有转换为 Future , 如 firstWhere 、 elementAt 、 reduce 等操作方法,基本都是创建一个内部 _Future 实例,然后再 listen...二、StreamBuilder 如下代码所示, 在 Flutter 中通过 StreamBuilder 构建 Widget ,只需提供一个 Stream 实例即可,其中 AsyncSnapshot 对象为数据快照

    3.8K41

    iOS - 关于 KVO 一些总结

    :分别在值改变前后触发方法(即一次修改有两次触发) ** context: 可以传入任意数据(任意类型对象或者C指针),在监听方法中可以接收到这个数据,是KVO中一种传值方式...,即一次修改有两次触发两次触发分别在willChangeValueForKey:和didChangeValueForKey:时候进行。   ...Key>AtIndexes: 可以不实现替换方法,但是如果不实现替换方法,执行替换操作时,KVO会把它当成先删除后添加,即会触发两次KVO。...如果实现替换方法,则执行替换操作只会触发一次KVO,并且change字典会同时包含new和old,前提条件是注册方法options传入对应枚举值。...三个步骤; 实现KVO与事件发生处代码上下文相同,不需要跨方法传参数; 增加了block和SEL自定义操作对NSKeyValueObserving回调处理支持; 每一个keyPath会对应一个block

    2.6K21

    读Zepto源码之Touch模块

    触发 longTap 事件前,先将保存定时器变量 longTapTimeout 释放,如果 touch 对象中存在 last ,则触发 longTap 事件, last 保存是最后触摸时间。...如果有触发 longTap 定时器,清除定时器即可阻止 longTap 事件触发。 最后同样需要将 longTapTimeout 变量置为 null ,等待垃圾回收。...因为 TouchEvent 支持多点触碰,这里取触碰第一点存入 firstTouch 变量。...注意,swipe 事件并不是在 end 系列事件触发时立即触发,而是设置了一个 0ms 定时器,让事件异步触发,这个有什么用呢?后面会讲到。...系列文章 读Zepto源码之代码结构 读Zepto源码之内部方法 读Zepto源码之工具函数 读Zepto源码之神奇$ 读Zepto源码之集合操作 读Zepto源码之集合元素查找 读Zepto源码之操作

    92300

    你还在困惑MySQL中锁吗?

    RR级别和RC级别采集"快照"原则是不同,这也是导致两种隔离级别存在不同"读象"(不可重读或幻读)原因,其中: RR级别以进入事务后第一次操作时间作为快照版本(注意是第一次操作时间,而与开启事务时间无关...大意:之前查询结果中不存在、但之后查询得到记录称作是幻读。例如,一个查询执行两次,期间另一个事务进行了插入或更新记录并提交,导致前一个事务两次查询结果不一致。...个人观点,幻读本身当然属于不可重复读一种,毕竟两次读取结果"不一致"。但幻读侧重是之前没有、之后虚幻出来了新行这种特定操作。 案例: ①,RR级别可避免RC级别中不可重复读问题: ?...RR级别下,特殊操作仍可触发幻读(更新快照) 实际上,MVCC机制只是为保证读取结果采取快照方式,所以能保证可重复读,但对于执行insert、update和delete操作时,仍然会实际检测当前数据库中最新记录状态...而且,更重要是,这种现象并不具有普遍性:仅当事务执行update操作时才会更新快照版本,而对于delete和insert操作则是检测状态不更新快照版本。 ?

    1.1K20

    双击事件(dblclick)时,不触发鼠标按下(mousedown) 动作事件

    一个dom节点事件绑定中,如果同时绑定了dblclick和mousedown那么想要执行双击事件(dblclick)时能就会触发两次mousedown事件。...两者区别是,mouseenter事件触发一次,而只要鼠标在节点内部移动,mouseover事件会在子节点上触发多次。...在单击时候(也就是鼠标按下时候)不会执行双击,但是双击时候会执行两次单击再执行双击事件。 解决思路:要想双击时不执行单击事件,就使用定时器清除掉两个单击事件,留下一个双击事件。...要想不执行第一次任务队列,那么定时器时间间隔就必须大于两次单击时间间隔了。这样才能清除第一次单击事件,所以,这个200是酌情值,大于间隔就行。...第一次单击任务不执行了,是被定时器延时,然后第二次点击时候给清除了。那么第二次点击事件呢? 在两次单击之后,会立马执行一个双击事件,双击事件一开头就把这个第二次点击事件给清除了。

    67920

    两个闹钟,10 分钟教你写出 lodash 中 debounce & throttle

    :函数在 wait 秒内执行一次,若这 wait 秒内,函数高频触发,则会重新计算时间。...2、最简单案例 以最简单情景为例:在某一时刻点调用一次 debounced func 函数,那么将在 wait 时间后才会真正触发 func 函数。...判断时间差为 wait 故而做出判断(依据 debounce 函数功能定义):需要触发一次 func 函数,我们用红色闹钟来表示 func 函数调用,所以就放置一个红色闹钟 ?...简易 debounce - 实现 `trailing` 情况 防抖函数概念:函数在 n 秒内执行一次,若这 n 秒内,函数高频触发,则会重新计算时间。...debounce 仍旧返回闭包(匿名函数) timerId 是闭包变量,相当于标志位,通过它可以知道某个函数调用是否在上一次函数调用影响范围内 假如调用该闭包两次: 如果调用两次间隔 < wait

    2K10

    给你几个闹钟,或许用 10 分钟就能写出 lodash 中 debounce & throttle

    :函数在 wait 秒内执行一次,若这 wait 秒内,函数高频触发,则会重新计算时间。...2、最简单案例 以最简单情景为例:在某一时刻点调用一次 debounced func 函数,那么将在 wait 时间后才会真正触发 func 函数。...判断时间差为 wait 故而做出判断(依据 debounce 函数功能定义):需要触发一次 func 函数,我们用红色闹钟来表示 func 函数调用,所以就放置一个红色闹钟 ?...简易 debounce - 实现 `trailing` 情况 防抖函数概念:函数在 n 秒内执行一次,若这 n 秒内,函数高频触发,则会重新计算时间。...debounce 仍旧返回闭包(匿名函数) timerId 是闭包变量,相当于标志位,通过它可以知道某个函数调用是否在上一次函数调用影响范围内 假如调用该闭包两次: 如果调用两次间隔 < wait

    72310

    一次React渲染死循环

    先执行 useEffect1,会触发 setValueObj,此操作会产生一个 state 更新事件,产生一次计划 UI 更新(注意:此时并不会立即修改valueObj值)。...onChange 同步执行,即会立即调用父组件 App setValue 方法方法同样是一个 state,会产生一个 state 更新事件,产生一次计划 UI 更新。...第2步:合并渲染 经过第一步之后,会合并前面的两次 setState 触发 UI 更新计划,进行一轮新综合性组件 UI 更新。...因此,我们不难推断出,接下来同样会产生两次 setState 触发 UI 更新计划。 而这次更新结果就是 value 和 valueObj 再次互换。...我采用办法是:定义一个临时变量 valueObjTemp 来保存 valueObj 值。

    1.4K20

    编码篇-KVO使用大全

    当某个类属性对象第一次被观察时,系统就会在运行期间动态地创建该类一个派生类,在这个派生类中重写基类任何被观察属性setter方法。派生类在被重写setter方法内实现真正通知机制。...我们知道,每一个类中都有一个isa指针指向当前类,所有系统就是在当一个对象第一次被观察时候,系统就会偷偷将isa指针指向动态生成派生类,从而在被监听属性赋值时被执行是派生类setter方法。...会发现,上述设置只是设置了返回数值是改变前还是改变后,但是如果一直设置相同值,不断重复,还是会不断触发通知。...,下面的代码,“222”不会触发观察方法, “DJ Earworm”会触发观察方法。...p.age = 100; // 调用了set方法 p->_age = 998; // 不会监听到,因为KVO监听通过set方法修改属性值, 而p->age并未不是通过set方法修改属性值

    62220

    Spark程序开发调优(前奏)

    一个简单例子: //需要对名为“hello.txt” HDFS 文件进行一次 map 操作,再进行一次 reduce 操作。 //也就是说,需要对一份数据执行两次算子操作。...//这里执行了两次 textFile 方法,针对同一个 HDFS 文件,创建了两个 RDD 出来, //然后分别对每个 RDD 都执行了一个算子操作。...//要彻底解决这个问题,必须结合“原则三:对多次使用 RDD 进行持久化”, //才能保证一个 RDD 被多次使用时被计算一次。...// 因此还需要配合“原则三:对多次使用 RDD 进行持久化”进行使用, //才能保证一个 RDD 被多次使用时被计算一次。...// 此时再对 rdd1 执行两次算子操作时,只有在第一次执行 map 算子时,才会将这个 rdd1 从源头处计算一次

    35610

    XILINX ARM+FPGA Zynq-701020 Linux-RT案例开发手册

    Linux-RT内核与普通Linux内核相比,几个主要相同之处是: 具有相同开发生态系统,包括相同工具链、文件系统和安装方法,以及相同POSIX API等。 仍然存在内核空间和用户空间划分。...Linux系统实时性测试 本章节主要介绍使用Cyclictest延迟检测工具测试Linux系统实时性方法。...它可测量由硬件、固件和操作系统引起实时系统延迟。...图 7 图 8 tl_rt_gpio_ctrl案例 案例说明 通过创建一个基本实时线程,在线程内触发LED1电平翻转,同时程序统计实时线程调度延时,并通过示波器测出LED1电平两次翻转时间间隔...图 15 tl_rt_input案例 案例说明 通过创建一个基本实时线程,在线程内打开input设备,并对按键事件进行监听,然后触发评估底板LED1电平翻转,再通过示波器测量按键触发到LED1电平翻转期间实际耗时

    1.9K30
    领券