Flutter之Stream流
1.介绍
为什么dart中会出现Stream流,以及它适合的场景,我们常常用到它的多订阅模式,为什么适用订阅模式。在我们android中,有EventBus,LiveData,LiveDataBus,以及BroadcastReceiver。采用发布订阅模式,在我们android应用开发中非常常见。
常见解决问题:
A页面订阅,B页面订阅,C页面订阅…等等,我们想在N页面发布一条消息,其他所有页面都能监听到。这便是它最常见的场景
注意:退出时,记得销毁, 其中LiveData不用,原因采用LifeCycle自行监听销毁了,其他需要,否则会造成难以挽回的内存泄漏。
2.适用方式,
上一篇转载的Flutter45文章中,已经介绍了Stream流的适用方式, 我们没有必要掌握那么多,但里面必须掌握多订阅模式和单订阅模式
3.多订阅模式适用
Page01页面,跳转到Page02页面,Page02发送消息,Page01监听消息, 多订阅流,是说可以有多个监听,最常用
如何适用
1.创建流对象
import 'dart:async';
StreamController<String> streamController = StreamController.broadcast();
2.设置流监听
StreamSubscription _streamSubscription = streamController.stream.listen((event) {
//然后在这里面进行更新数据的操作
setState(() {
values = event;
});
});
3.发送数据
streamController.add("测试数据");
4.取消注册
_streamSubscription.cancel();
完整代码
Page01
import 'dart:async';
import 'package:flutter/material.dart';
import 'Page02.dart';
import 'StreamControllerDemo.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
home:Scaffold(
appBar:AppBar(
title:Text('Flutter Demo')
),
body:Page01(),
),
theme: ThemeData(
primarySwatch: Colors.yellow
),
);
}
}
class Page01 extends StatefulWidget {
Page01({Key key}) : super(key: key);
@override
_Page01State createState() {
return _Page01State();
}
}
class _Page01State extends State<Page01> {
///消息订单对象
StreamSubscription _streamSubscription;
var values = "监听数据";
@override
void initState() {
super.initState();
///监听二
_streamSubscription = streamController.stream.listen((event) {
//然后在这里面进行更新数据的操作
setState(() {
values = event;
});
});
}
@override
void dispose() {
super.dispose();
_streamSubscription.cancel();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Column(
children: [
Text(values),
RaisedButton(
child: Text("跳转到第二个页面页面"),
onPressed: () {
//路由跳转
Navigator.of(context).push(
MaterialPageRoute(
builder: (context)=>Page02()
)
);
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary)
],
);
}
}
Page02
import 'package:flutter/material.dart';
import 'StreamControllerDemo.dart';
class Page02 extends StatefulWidget {
Page02({Key key}) : super(key: key);
@override
_Page02State createState() {
return _Page02State();
}
}
class _Page02State extends State<Page02> {
///消息订单对象
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Column(
children: [
SizedBox(height: 50),
RaisedButton(
child: Text("发送数据"),
onPressed: () {
streamController.add("测试数据");
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary),
RaisedButton(
child: Text("返回第一个页面,查看数值是否变化"),
onPressed: () {
//路由跳转
Navigator.of(context).pop();
},
color: Theme.of(context).accentColor,
textTheme: ButtonTextTheme.primary)
],
);
}
}
StreamControllerDemo
import 'dart:async';
StreamController<String> streamController = StreamController.broadcast();
4.单订阅流
单订阅流只允许有一个监听,用StreamController();来创建,不常用,原因:当有多个listen监听时,会报错
StreamController<String> streamSingController = StreamController();
5.讲解StreamSubscription
- _streamSubscription.pause(): 暂停接收消息
- _streamSubscription.resume():恢复接收消息
- _streamSubscription.cancel():取消消息订阅,记住,执行取消消息订阅之后,订阅监听不可复用,于android eventBus,BroadcastReceiver都是一样的