【Flutter】Steam基本用法(入门)

学习资料

视频资料

把基础的stream用法学一下,后面有新的资料再添上,再深入学习进阶的用法

代码

案例gitee地址
github上传了好几次,上传不了,换gitee了

0、工具

//工具函数
//打印流函数
printStream(Stream<Object> stream) async {
  await for (var val in stream) {
    print(val);
  }
}

//异步函数
Future<int> funi = Future(() {
  return 100;
});
//异步函数
Future<int> funii = Future(() {
  return 200;
});

1、创建stream

1.1、延迟间隔

periodic() async {
  Stream<int> stream = Stream<int>.periodic(Duration(seconds: 1), (val) => val);
  //stream获取需要时间,所以异步
  await printStream(stream);
}

1.2、future数据源

fromFuture() async {
  Stream<int> stream = Stream<int>.fromFuture(funi);
  await printStream(stream);
}

1.3、futures多数据源

fromFutures() async {
  Stream<int> stream = Stream<int>.fromFutures([funi, funii]);
  await printStream(stream);
}

2、stream监听

2.1、单对单

listen() async {
  Stream<int> stream = Stream<int>.periodic(Duration(seconds: 1), (val) => val);
  stream.listen((event) {
    print(event);
  }, onError: (err) {
    print(err);
  }, onDone: () {}, cancelOnError: true);
}

2.2、广播

boardcast() async {
  Stream<int> stream = Stream<int>.periodic(Duration(seconds: 1), (val) => val)
      .asBroadcastStream();
  stream.listen((event) {
    print(event);
  });
  stream.listen((event) {
    print(event);
  });
}

2.3 操作task skip

opt() async {
  Stream<int> stream = Stream<int>.fromIterable([1, 2, 3, 4, 5]);
  // stream = stream.take(3); //按顺序打印前三个
  stream = stream.skip(2); //跳过前面两个,打印后面
  stream.listen((event) {
    print(event);
  });
}

3、StreamController流控制类

3.1、单点&订阅对象

scListen() async {
  StreamController sc = StreamController(
      onListen: () {
        print("onListen");
      },
      onPause: () {
        print("onPause");
      },
      onCancel: () {
        print("onCancel");
      },
      onResume: () {
        print("onResume");
      },
      sync: false); //同步还是异步

  //订阅对象
  StreamSubscription ss = sc.stream.listen((event) {
    print(event);
  });

  sc.add(100);

  ss.pause(); //暂停
  ss.resume(); //恢复
  ss.cancel(); //取消

  sc.close();
}

3.2、广播

scBroadcast() async {
  StreamController sc = StreamController.broadcast();

  StreamSubscription ss1 = sc.stream.listen((event) {
    print(event);
  });
  StreamSubscription ss2 = sc.stream.listen((event) {
    print(event);
  });

  // ss2.cancel();

  sc.addStream(Stream.fromIterable([1, 2, 3, 4, 5]));

  await Future.delayed(Duration(seconds: 2));
  sc.close();
}

3.3、StreamTransformer流转换

scTransformer() async {
  StreamController sc = StreamController<int>.broadcast();
  //int 入, double 返回
  StreamTransformer stf = StreamTransformer<int, double>.fromHandlers(
    handleData: (data, sink) {
      //int data, EventSink sink
      sink.add((data * 2).toDouble()); //sink更新流
    },
    handleError: (error, stacktrace, sink) {
      sink.addError('wrong: $error');
    },
    handleDone: (sink) {
      sink.close();
    }
  );

  Stream stream = sc.stream.transform(stf);

  stream.listen(print);
  stream.listen(print);

  sc.addStream(Stream<int>.fromIterable([1,2,3,4,5]));

  await Future.delayed(Duration(seconds: 2));
  sc.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sheng_er_sheng

打赏是什么?好吃么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值