Flutter Stream 简介及部分操作符使用

前言

     对于刚接触Flutter的同学来说,Stream(流)是一个相对比较抽象,也相对比较难以理解的东西。准确的来说Stream并不是Flutter的特性,而是Dart语言自身所带库。StreamFuture都位于dart:async核心库,是Dart中异步操作的两大高手。所以不仅仅可以用于Flutter,而是可以用于任何Dart语言上的实现。

    在我们刚开始学习Flutter的时候基本都是使用 StatefulWidgetsetState((){})来刷新界面的数据,当我熟练使用流之后就可以基本完全使用StatelessWidget告别 StatefulWidget同样达到数据刷新效果。

Stream分类

流可以分为两类:

  • 单订阅流(Single Subscription),这种流最多只能有一个监听器(listener)

  • 多订阅流(Broadcast),这种流可以有多个监听器监听(listener)

Stream创建方式

  • Stream.fromFuture 接收一个Future对象作为参数

    Stream<String>.fromFuture(getData());
    
    Future<String> getData() async{
        await Future.delayed(Duration(seconds: 5));
        return "返回一个Future对象";
      }
    

  • Stream.fromIterable 接收一个集合对象作为参数

    Stream<String>.fromIterable(['A','B','C']);
    

  • Stream.fromFutures 接收一个Future集合对象作为参数

    Stream<String>.fromFutures([getData()]);
    

  • Stream.periodic 接收一个 Duration对象作为参数

    Duration interval = Duration(seconds: 1);
    Stream<int> stream = Stream<int>.periodic(interval);
    

操作方式及使用

使用Stream .periodic 方式创建一个Stream对象

用于创建一个周期发送事件的流,如下

///用于创建一个每隔一秒发送一次无限事件的流,并打印出值
void _stream() async{
    Duration interval = Duration(seconds: 1);
    Stream<int> stream = Stream.periodic(interval, (data) => data);
    await for(int i in stream ){
      print(i); 
    }
}

//(data){return data;} 上面的这句是用来回来值,如果省略这句,打印的值都为null

.

  • Stream.take(int count)

    上面创建了一个无限每隔一秒发送一次事件的流,如果我们想指定只发送10个事件则,用take。下面就只会打印出0-9

    void _stream() async{
        Duration interval = Duration(seconds: 1);
        Stream<int> stream = Stream.periodic(interval, (data) => data);
        stream = stream.take(10); //指定发送事件个数
        await for(int i in stream ){
         print(i);
        }
    }
    

  • Stream.takeWhile

    上面这种方式我们是只制定了发送事件的个数,如果我们也不知道发送多少个事件,我们可以从返回的结果上做一个返回值的限制,上面结果也可以用以下方式实现

    void _stream() async {
        Duration interval = Duration(seconds: 1);
        Stream<int> str
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值