第七十九回:如何管理Stream事件流


我们在上一章回中介绍了事件流相关的内容,本章回中将介绍 如何管理Stream事件流。闲话休提,言归正传,让我们一起Talk Flutter吧。

概念介绍

我们简单回顾一下前面的知识:Stream把相关的事件组成了事件流,并且提供方法来监听这些事件的运行情况,事件的运行由事件自身决定而且不受Stream控制,不过Stream可以控制监听操作。我们在本章回中介绍的管理主要是指对监听操作的管理,比如暂停和恢复。从代码角度看就是对listen()方法的功能进行管理。

管理方法

Streamlisten()方法运行时会返回StreamSubscription类型的对象,该类型提供了相关的方法来控制监听操作,下面是该类提供的方法:

  • pause()方法:监听操作自动运行,通过该方法可以暂停监听操作;
  • resum()方法:该方法可以恢复被暂停的监听操作;
  • cancel()方法:该方法可以取消监听操作;

示例代码

介绍完原理和管理监听操作的方法后,通过具体的代码来演示:

  //用来存放stream listen方法返回的结果
  late StreamSubscription<String> _streamSubscription;

 //使用方法抽象出三个事件
  Future<String> _eventOne() async{
    await Future.delayed(Duration(seconds: 2),()=>debugPrint('do one'),);
    return 'Event One';
  }

  Future<String> _eventTwo() async{
    await Future.delayed(Duration(seconds: 2),()=>debugPrint('do two'),);
    throw "Event exception";
  }

  Future<String> _eventThree() async{
    await Future.delayed(Duration(seconds: 2),()=>debugPrint('do three'),);
    return 'Event Three';
  }

  //带有数据的事件流,数据类型为string
  _eventStream = Stream.fromFutures([
    _eventOne(),
    _eventTwo(),
    _eventThree(),
  ]);

  //封装三个方法,它们用在stream的listen方法中
  _onData(data) => debugPrint("onData: $data");
  _onError(error) => debugPrint("onError: $error");
  _onDone() => debugPrint("onDone:");

  void _startStream() {
    _streamSubscription = _eventStream.listen(_onData,onError:_onError ,onDone:_onDone);
  }

  void _resumeStream() {
    _streamSubscription.resume();
  }

  void _pauseStream() {
    _streamSubscription.pause();
  }

  void _cancelStream() {
    _streamSubscription.cancel();
  }

上面的代码中的Stream事件流包含三个事件,有两个事件返回String类型的数据,一个事件抛出异常。这三个事件都是通过Future构建的,事件的返回类型与Future中泛型的类型相同,都是String类型。

从监听操作对应的onData()方法中可以获取到事件返回的数据,我们把数据打印到终端,这样方便观看数据的值。

我们把监听操作以及对监听操作的控制(管理)方法封装成了单独的方法,然后把这些方法赋值给按钮的onPress属性,这样就可以通过按钮手动控制监听操作。

编译上面的程序,然后点击监听方法(_startStream)所在的按钮,就会得到以下运行结果:

//正常的运行结果
I/flutter ( 5894): do one
I/flutter ( 5894): onData: Event One
I/flutter ( 5894): do two
I/flutter ( 5894): onError: Event exception
I/flutter ( 5894): do three
I/flutter ( 5894): onData: Event Three
I/flutter ( 5894): onDone:

从程序的运行结果看,Stream流中包含三个事件,三个事件依次运行,监听方法监听到了事件运行完成后返回的数据。

这和上一章回中程序的运行结果基本相同,不同的地方在于事件运行完成后返回了String类型的数据,并且在监听方法中获取到了这些数据。

如果我们启动监听操作(_startStream)后,先按下Pause(_pauseStream)再按下Resume(_resumeStream)就会得到下面的运行结果:

I/flutter ( 5894): do one
I/flutter ( 5894): do two
I/flutter ( 5894): do three
D/EGL_emulation( 5894): app_time_stats: avg=328.19ms min=11.28ms max=9683.02ms count=31
I/flutter ( 5894): onData: Event One
I/flutter ( 5894): onError: Event exception
I/flutter ( 5894): onData: Event Three
I/flutter ( 5894): onDone:

把该程序的运行结果与上面正常运行的结果做对比后就会发现:第一个事件输出do one后监听操作的onData方法没有运行,接着第二个,第三个事件依次运行。这说明监听操作被暂停了,过了一会儿后才运行onData方法和onDone方法,这说明监听操作恢复了正常的运行。

建议大家仔细对比上面提供的两种程序运行结果,体会它们之间的不同。同时建议大家自己动手去实践,亲自体会一下手动控制监听操作的过程。这里没有列出与按钮相关的代码,大家可以参考github上ex034文件中的代码去实践。

看官们,关于"如何管理Stream事件流"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

talk_8

真诚赞赏,手有余香

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

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

打赏作者

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

抵扣说明:

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

余额充值