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

flutter StreamSubscription 订阅者 stream

当您使用[Stream.listen]收听[Stream]时
则返回[StreamSubscription]对象

List<StreamSubscription?> subscriptions = [];

  @override
  void initState() {
    super.initState();
    
//subscriptions列表添加两个StreamSubscription。Stream.listen返回StreamSubscription对象
    subscriptions
      ..add(ZegoUIKit().getAudioVideoListStream().listen(
      //onStreamListUpdated相当于(event){onStreamListUpdated(event)},接收到数据时触发回调
        onStreamListUpdated,
        onDone: () {//streamController.sink.close(); //只有手动调用close方法发送一个done事件,onDone才会被回调
          print('测试视频控件1-------------getAudioVideoListStream-onDone');
        },
        onError: (e) {//有错误时会回调
          print('测试视频控件1-------------getAudioVideoListStream-onError${e}');
        }
      ))
      
      ..add(
          ZegoUIKit().getScreenSharingListStream().listen(onStreamListUpdated,    onDone: () {
            print('测试视频控件1-------------getScreenSharingListStream-onDone');
          },
              onError: (e) {
                print('测试视频控件1-------------getScreenSharingListStream-onError${e}');
              }));
  }
//流会执行且返回List<ZegoUIKitUser>数据
  Stream<List<ZegoUIKitUser>> getAudioVideoListStream() {
    return ZegoUIKitCore.shared.coreData.audioVideoListStreamCtrl.stream
        .map((users) => users.map((e) => e.toZegoUikitUser()).toList());
  }
//监听数据:获取到流返回的数据后执行下面代码,如果没返回数据就不会执行这里
  void onStreamListUpdated(List<ZegoUIKitUser> streamUsers) {
    print('测试视频控件1---streamUsers${streamUsers}');

    fullScreenUserNotifier.value = ZegoUIKit().getScreenSharingList().isEmpty
        ? null
        : ZegoUIKit().getScreenSharingList().first;

    setState(() {
      updateUserList(
        ZegoUIKit().getAudioVideoList() + ZegoUIKit().getScreenSharingList(),
      );
    });

Flutter异步编程-Stream
Future和stream的区别(Future返回一个异步的结果。stream返回多个结果,持续监听)
Future 表示一个不会立即完成的计算过程。与普通函数直接返回结果不同的是异步函数返回一个将会包含结果的 Future。该 Future 会在结果准备好时通知调用者。Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable(可迭代的),不同的是当你向 Iterable 获取下一个事件时它会立即给你,但是 Stream 则不会立即给你而是在它准备好时

可以使用一个餐厅吃饭场景来理解Future和Stream的区别:
Future就好比你去一家餐厅吃饭,在前台点好你想吃的菜后,付完钱后服务员会给你一个等待的号码牌(相当于先拿到一个Future),后厨就开始根据你下的订单开始做菜,等到你的菜好了后,就可以通过号码牌拿到指定的菜了(返回的数据或异常信息)。 Stream就好比去一家餐厅吃饭,在前台点好A,B,C,D4种你想吃的菜后(订阅数据流过程),然后你就去桌子等着,至于菜什么时候好,你也不知道所以就一直等着(类似于一直监听listen着),后厨就开始根据你下的订单开始做菜, 等着你的第一盘A种菜好了后,服务员就会主动传送A到你的桌子上(基于一种类似订阅-推送机制),没有特殊意外,服务员推送菜的顺序应该也是A,B,C,D。

stream返回数据,监听数据

//Stream实现
void main() async {
Stream stream = Stream.periodic(Duration(seconds: 1), (int value) {
return value + 1;//stream每秒都加1
});
await stream.forEach((element) => print(‘stream value is: $element’));//通过steam可以获得结果
}

相关文章:

  • JAVA-SpringBoot入门Demo用IDEA建立helloworld
  • LONGLORA: EFFICIENT FINE-TUNING OF LONGCONTEXT LARGE LANGUAGE MODELS
  • 机器学习:随机森林
  • Spark任务优化分析
  • css怎么实现文字描边
  • 【18】c++设计模式——>适配器模式
  • 力扣刷题 day40:10-10
  • uniapp微信小程序之分包异步化之组件分包
  • 17. 电话号码的字母组合
  • 深度学习DAY3:激活函数
  • 【RabbitMQ 实战】09 客户端连接集群生产和消费消息
  • Java架构师缓存架构设计解决方案
  • 小米、华为、iPhone、OPPO、vivo如何在手机让几张图拼成一张?
  • Qt开发学习笔记02
  • 面试之并查集
  • Ajax跨域访问,访问成功但一直走error不走success的的问题解决
  • 学习记忆——数学篇——案例——代数——方程——一元二次方程
  • 文生图3.0:添加背景图片 3个回车```文生图```
  • 京东数据分析平台:2023年8月京东奶粉行业品牌销售排行榜
  • Qt实现 图片处理器PictureEdit
  • 安徽亳州涡阳县司法局党组书记刘兴连落马
  • 胳膊一抬就疼,炒菜都成问题?警惕这种“炎症”找上门
  • 国防部:奉劝有关国家不要引狼入室,甘当棋子
  • 老铺黄金拟配售募资近27亿港元,用于门店拓展扩建及补充流动资金等
  • 美联储连续第三次维持利率不变,警示关税影响
  • 从“重规模”向“重回报”转变,公募基金迎系统性改革