在这个博客中,我们将探索 Flutter 中的 StreamBuilder。我们还将实现一个演示程序,并向您展示如何在您的 Flutter 应用程序中使用 StreamBuilder。...介绍: StreamBuilder 可以监听公开的流,并返回小部件和捕获获得的流信息的快照。造溪者提出了两个论点。...A stream 构建器,它可以将流中的多个组件更改为小部件 Stream 像一条线。当您从一端输入值而从另一端输入侦听器时,侦听器将获得该值。...一个流可以有多个侦听器,这些侦听器的负载可以获得流水线,流水线将获得等价值。如何在流上放置值是通过使用流控制器实现的。流构建器是一个小部件,它可以将用户定义的对象更改为流。...你需要使用 async * 关键字来创建一个流。若要发出值,可以使用 yield 关键字后跟要发出的值。
catchError((error) { //执行失败到此处 print(error); }).whenComplete(() => print("完成")); Future.wait() 如果要等到多个异步任务都结束之后再进行一些操作...,就会自动调用下面的 build 函数, initialData:初始值,在 future 没完成的时候可以暂时使用该值,该值会放在 AsyncSnapshot 的 data 中,在 future...**,如果是活跃的,则就可以获取他的值了 创建方式及常用的函数 使用 Stream.periodic 的方式来创建一个数据流,如上面的示例所示 读取文件的方式 File("").openRead()...需要注意的是使用完成之后要进行关闭操作,否则就会泄漏资源 并且 flutter 会一直警告, 上面的这种方式只能有一个监听,如果添加多个监听则就会保存,那么如何添加多个监听呢,可以使用广播的方式,如下...做的小游戏 在日常开发中,StreamBuilder 还是挺实用的,这次我们用 StreamBuilder 来做一个小游戏,先看效果: 从上面的动画来看,可以将其分为三个部分,第一个部分则是底部的键盘
它标注在函数{ 之前,其方法必须返回一个 Iterable对象 ? 的码为\u{1f47f}。...记住一点yield*后面的表达式是一个Iterable对象 比如下面getEmoji方法是核心,现在想要打印每次的时间,使用getEmojiWithTime yield*之后的getEmoji(...它标注在函数{ 之前,其方法必须返回一个 Stream对象 下面fetchEmojis被async*标注,所以返回的必然是Stream对象 注意被async*标注的函数,可以在其内部使用yield...-- 2020-05-20T07:35:27.511723 ---- 四、Stream的使用-StreamBuilder Stream在组件层面最常用的就数StreamBuilder,本文只是简单用一下...,以后会有专文 StreamBuilder组件使用的核心就是,它接受一个Stream对象, 根据builder函数在流元素的不同状态下构建不同的界面。
它标注在函数{ 之前,其方法必须返回一个 Iterable对象 的码为\u{1f47f}。...记住一点yield*后面的表达式是一个Iterable对象 比如下面getEmoji方法是核心,现在想要打印每次的时间,使用getEmojiWithTime yield*之后的getEmoji(count...它标注在函数{ 之前,其方法必须返回一个 Stream对象 下面fetchEmojis被async*标注,所以返回的必然是Stream对象 注意被async*标注的函数,可以在其内部使用yield...-StreamBuilder Stream在组件层面最常用的就数StreamBuilder,本文只是简单用一下,以后会有专文 StreamBuilder组件使用的核心就是,它接受一个Stream对象,...根据builder函数在流元素的不同状态下构建不同的界面。
在UI层中,有两种写法,一种是直接使用StatelessWidget,在build函数中初始化BlocProvider.of(context),另一种是使用StatefulWidget...BLoC流的单播与广播 Flutter中的Stream分为两种,单播与多播,默认情况下创建的是单播Stream,这样的话,只能有一个StreamBuilder来监听,如果存在多个StreamBuilder..._countController = StreamController.broadcast(); 在多页面使用的时候,有个地方需要注意,那就是流是实时的,不具有粘滞性。...举个例子,比如在第一个界面在流中添加了一些数据,再打开第二个界面的时候,创建StreamBuilder之后,是无法直接获取流的最新数据的,因为这时候流中的的数据在StreamBuilder监听之前就已经结束了...所以这种情况下,要么是在创建StreamBuilder前,初始化initialData的值为流中最新的数据;要么是使用RxDart来强化流的功能。
在Flutter状态管理(1)——InheritedWidget中介绍了状态管理以及如何使用InheritedWidget来实现全局状态的管理。这篇博客将介绍如何使用Stream来实现状态管理。...Stream是一种流,在dart中用于异步产生数据,分为两种类型:单订阅Stream和广播Stream。...单订阅Stream只允许在该Stream的整个生命周期内使用单个监听器,即使第一个subscription被取消了,也无法在这个流上监听到第二次事件;而广播Stream允许任意个数的subscription...,可以随时随地给它添加subcontractor,只要新的监听开始工作流,它就能收到新的事件。...广播Stream 广播Stream,可以有多个订阅者,当发布一个事件后,存在的多个订阅者就都可以收到消息。
关于 FutureBuilder 的使用,我在之前的公众号文章中有写过, 如果没看过的可以跳转:Flutter FutureBuilder 异步UI神器....See /// [FutureBuilder.initialData] and [StreamBuilder.initialData]....activeCallbackIdentity == callbackIdentity) { setState(() { _snapshot = AsyncSnapshot.withData(ConnectionState.done...activeCallbackIdentity == callbackIdentity) { setState(() { _snapshot = AsyncSnapshot.withError(ConnectionState.done...在 Flutter 中,我们可以通过查看源码来获取很多的灵感,因为 Flutter 的 注释写的简直不要太到位!
当我们点击按钮时使本地变量key1,key2做增加操作,之后调用setState()。 ? img ? img ? img ?...在key1的点击事件中往Stream中add数据,这样在key1的流上产生了一条数据,对应的监听者收到数据后,只更新自己的内容,不会重建其他区域。 ? ? ?...StreamBuilder可以完美解决局部刷新的问题,但StreamBuilder也有着同样明显的缺点,使用起来非常麻烦,需要自己手动创建流,将控件用StreamBuilder包裹构造。...进行了封装,以此简化StreamBuilder的使用。..._dataLine.dispose(); } 复制代码 ---- 三、DataBus如何解决多个Stream的绑定 上面我们通过SingDataLine简化了StreamBuilder的使用,但当页面中有多个
在Flutter中,一切UI皆Widget,那么View层也很明确了,就是Widget部分。...实例 实现的效果如下: [App截图] 网络层 请求就是使用官方的http库发起,具体可以看源码。 知乎日报的API网上一搜即可,本文不再赘述。...() { _storyListController.close(); } } 很简单的逻辑,注释(1)处是StreamController创建的Sink,之所以用broadcast,是方便之后拓展...,可能不只一个Stream监听这里的数据变化,使用broadcast可以让多个流监听同一个Sink。...,在stream参数给上我们ViewModel的output stream,也就是说当ViewModel中的Sink对象被add数据后,StreamBuilder会监听到这个变化,然后重新通过builder
单订阅Stream只允许在该Stream的整个生命周期内使用单个监听器,即使第一个subscription被取消了,你也没法在这个流上监听到第二次事件;而广播Stream允许任意个数的subscription...刚才在stream定义那里已经说过了,stream是基于数据流的,从skin管道入口到StreamController提供stream属性作为数据的出口之间,可以对数据做任何操作,包括过滤、重组、修改等等...StreamBuilder,而不需要任何setState: 我在代码里注释了步骤(四步): import 'dart:async'; import 'package:flutter/material.dart...的监听,StreamBuilder重建并刷新counter //步骤4.往StreamBuilder里添加流,数据变了,就用通知小部件 _streamController.sink.add...但是 不用StatefulWidget,如何关流? StatelessWidget 没有dispose()方法,不能关流,所以此时还需要使用StatefulWidget。
可以理解为在ScopedModel的基础上再次封装了一下,使用起来更加方便。...有需要的可以先了解一下 Flutter —— 状态管理 | ScopedModel Provide 使用 第一步 创建model ///为了更好的理解,我创建了两个model import 'package...构建小部件 二者区别在于StreamBuilder可以操作stream流,做一些简单的操作。...通过流我们可以做一系列的变换,这是Provide的一大亮点。...2.Provide 可以添加多个Model Provide 源码分析 内容点1: providers ..provide(Provider.value(counter)); (1) Provider.value
通俗来说,Stream 就是事件流或者管道,事件流相信大家并不陌生,简单的说就是:基于事件流驱动设计代码,然后监听订阅事件,并针对事件变换处理响应。...image.png 如上图,通过源码我们知道: 1、Stream 在 listen 的时候传入了 onData 回调,这个回调会传入到 StreamSubscription 中,之后通过 zone.registerUnaryCallback...A Stream 的 listen 添加 _handleData 回调,之后在回调里再次调用新的 Current B Stream 的 _handleData 。...二、StreamBuilder 如下代码所示, 在 Flutter 中通过 StreamBuilder 构建 Widget ,只需提供一个 Stream 实例即可,其中 AsyncSnapshot 对象为数据快照...StreamBuilder 中直接使用的原因。
那么在具体调用的地方,使用代码如下所示。...EventChannel EventChannel用于在事件流中将消息传递给Flutter端。 EventChannel与MethodChannel一样,在Flutter中通过Name来进行标志。...final double z; AccelerometerReadings(this.x, this.y, this.z); } 在调用的地方,需要通过StreamBuilder来承载EventChannel..., ), ); } else if (snapshot.connectionState == ConnectionState.done) {...大部分的开发场景,我们都可以使用MethodChannel来解决通信问题 如果需要更加灵活的控制,我们可以使用BasicMessageChannel Flutter从原生获取数据流,可以使用EventChannel
使用这个字段来保证 builder 在 Future 结束之前也被调用一次,这时的 snapshot 持有的值即 initialData 而非缺省的 null。...但通常不直接使用这个类,而是在 Dart 库的其他类中向外暴露这个类。所以可以将其视为用于跟数据流动通道交互的接口。...另外,HTML 元素也暴露 Stream 用于处理用户在页面上的交互。 还有很多类使用 Stream。...本篇将先看看如何使用 Stream Transformers 对 stream 进行变换。之后学习 stream 用法的常用设计模式。 Stream Transformer 是什么?...但广播 stream 允许定义多个数据监听器。
在Dart语言中,所有的Dart代码都运行在某个isolate中,代码只能使用所属isolate的类和值。不同的isolate可以通过port发送message进行交流。...它是一个异步流,我们可以在代码中任何地方定义 Stream,然后在其他地方添加数据,Stream会监听到数据变化,并将改变后的数据传递给监听者。...4.1 Stream分类 单订阅流(Single Subscription) 多订阅流(BroadCast) 4.2 Stream使用 创建一个Stream返回Future: Stream<String...; controller.sink.close(); // 调用close方法,结束Stream中的逻辑处理 以上部分是单订阅流,也就是单监听器的Stream,下面来看下多订阅流的使用: 构建多订阅流的方式有两种...使用 StreamBuilder是Flutter中的一个Widget,记录着流中最新的数据,当数据流发生变化时,会自动调用Builder进行重建 const StreamBuilder({ Key
而流处理平台就是专门处理这种数据集的系统或框架。下图生动形象地展示了流处理和批处理的区别: 总体来说,流处理给人的印象是低延时,但是结果可能不太精确。...一个最简单的Streaming的结构如下图所示: 从一个Topic中读取到数据,经过一些处理操作之后,写入到另一个Topic中,嗯,这就是一个最简单的Streaming流式计算。...光是在 Apache 基金会孵化的项目,关于流处理的大数据框架就有十几个之多,比如早期的 Apache Samza、Apache Storm,以及这些年火爆的 Spark 以及 Flink 等。...而在设计上,Kafka Streams在底层大量使用了Kafka事务机制和幂等性Producer来实现多分区的写入,又因为它只能读写Kafka,因此Kafka Streams很easy地就实现了端到端的...在处理过程中会创建一个Table,名为test-stream-ktable,它会作为输入流和输出流的中间状态。在Kafka Streams中,流在时间维度上聚合成表,而表在时间维度上不断更新成流。
[image.png] 如你所见,PublishSubject仅向监听器发送在订阅之后添加到Stream的事件。...下面的代码演示了如何使用StreamBuilder: StreamBuilder( key: ...optional, the unique ID of this Widget......可能使用此信息的地方(无处,同一页面,另一个页面,或者几个页面...), 当这些信息可能被使用时(几乎是直接,几秒钟之后,永远不会......)。 .........在BLoC级别,您还需要转换某些数据的“假”注入,以触发提供您希望通过流接收的数据。...不同BLoCs / Streams的编排 下图显示了如何使用主要3个BLoC: 在BLoC的左侧,哪些组件调用Sink 在右侧,哪些组件监听流 例如,当MovieDetailsWidget调用inAddFavorite
使用 ScopedModel Widget 加载 Model 。...利用 StreamBuilder 加载监听 Stream 数据流,通过 snapShot 中的 data 更新控件。...之后我们可以 dispatch 一个 Action ,在经过 middleware 之后,触发对应的 Reducer 返回数据,而事实上这里核心的内容实现,还是 Stream 和 StreamBuilder...的结合使用 ,接下来就让我们看看这个流程是如何联动起来的吧。...StreamBuilder / StoreConnector 的内部实现主要是 StreamBuilder 。
然而,在构建完成并将它们一次次的重构之后,我调整出了一种在我所有项目中都能够运行完好的开发体系,因此,在本文中,我将介绍一种我定义的新的架构模式: 从现有的开发模式中借鉴了很多思想; 调整它们以满足实际开发...如果有需要,我们甚至可以执行高级的流操作,例如通过combineLatest将流组合在一起。 但是要明确: 1.如果需要以某种方式组合,我建议在单个BLoC中使用多个流。...2.我不鼓励在一个BLoC中使用多个StreamControllers。相反,我更喜欢将代码分割到两个或更多的BLoC类中,以便更好地分离关注点。...要了解它们,您还需要熟悉Stream和StreamBuilder。 使用Stream时,需要考虑以下因素: 流的连接状态是什么(没有,等待,活跃,完成)? 流是被单次还是多次订阅?...结论 本文是对WABS的深入介绍,WABS是我在多个项目中使用了一段时间后探索得出的架构模式。 说实话,随着时间的推移我一直在改进它,在我写这篇文章之前它都还没有名字。
(:人生苦短,就不要浪费时间在重复造轮子这件事情上了。 下面,我们就开始正式地学习它。 首先,我们先来解释一下什么是流?...(流水线),并把数据放上去 使用中间方法(intermediate operation)对流水线上的数据进行操作(比如:过滤、转换等,方法调用完毕之后,还可以调用其他的方法) 使用终端方法/终结方法(terminal...operation)对流水线上的数据进行操作(比如:统计、打印等,终端方法是Stream流的最后一步,调用完毕之后,不能再调用其他方法) 同时,Stream流在使用的时候会结合Lambda表达式,简化集合...,如果我们想动态构建一个流,比如根据特定条件动态的决定是否将元素加入流中,我们可以使用StreamBuilder流构建器来添加元素和构建流。...StreamBuilder对象 Stream.Builder streamBuilder = Stream.builder(); // 通过add方法添加元素到流中
领取专属 10元无门槛券
手把手带您无忧上云