• flutter StreamSubscription 订阅者 stream


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

    List 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}');
                  }));
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    //流会执行且返回List数据
      Stream<List<ZegoUIKitUser>> getAudioVideoListStream() {
        return ZegoUIKitCore.shared.coreData.audioVideoListStreamCtrl.stream
            .map((users) => users.map((e) => e.toZegoUikitUser()).toList());
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    //监听数据:获取到流返回的数据后执行下面代码,如果没返回数据就不会执行这里
      void onStreamListUpdated(List<ZegoUIKitUser> streamUsers) {
        print('测试视频控件1---streamUsers${streamUsers}');
    
        fullScreenUserNotifier.value = ZegoUIKit().getScreenSharingList().isEmpty
            ? null
            : ZegoUIKit().getScreenSharingList().first;
    
        setState(() {
          updateUserList(
            ZegoUIKit().getAudioVideoList() + ZegoUIKit().getScreenSharingList(),
          );
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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可以获得结果
    }

  • 相关阅读:
    【精选】自学网络安全的三个必经阶段(含路线图)
    【实习】DLL相关
    英语语法笔记
    四、python基础——基本结构语句&&函数和模块
    缺陷的数据,不能证明测试工作做得好
    Java 与 Go:数字和字符串的相互转换
    代码随想录训练营第29天|LeetCode 491.递增子序列、46.全排列、47.全排列 II
    用C++语言写一个可读的回调函数
    电脑查看WiFi使用密码
    excel split text into different rows
  • 原文地址:https://blog.csdn.net/weixin_44911775/article/details/133670215