在Android中相信大家都时分熟悉EventBus,使用Flutter来实现EventBus,直接上代码
import 'dart:async';
class EventBus {
static EventBus _instance;
StreamController _streamController;
factory EventBus.getDefault(){
return _instance ??= EventBus._init();
}
EventBus._init(){
_streamController = StreamController.broadcast();
}
StreamSubscription<T> register<T>(void onData(T event)) {
///需要返回订阅者,所以不能使用下面这种形式
// return _streamController.stream.listen((event) {
// if (event is T) {
// onData(event);
// }
// });
///没有指定类型,全类型注册
if (T == dynamic) {
return _streamController.stream.listen(onData);
} else {
///筛选出 类型为 T 的数据,获得只包含T的Stream
Stream<T>stream = _streamController.stream.where((type) => type is T)
.cast<T>();
return stream.listen(onData);
}
}
void post(event) {
_streamController.add(event);
}
void unregister() {
_streamController.close();
}
}
下面是使用样例
import 'package:flutter/material.dart';
import 'package:flutter_xu/util/event_bus.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
int _i;
///绘制界面,当setState触发的时候会再次被调用
@override
Widget build(BuildContext context) {
debugPrint("build");
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("导航"),),
body: RaisedButton(onPressed: () {
setState(() {
_i++;
EventBus.getDefault().post(_i);//发送EnentBus消息
});
}, child: Center(child: Text("点击我$_i"),),),
),
);
}
///当Widget第一次插入到Widget树时会被调用,对于每一个State对象,Flutter framework只会调用一次该回调
@override
void initState() {
///初始化
super.initState();
_i = 1;
debugPrint("initState");
EventBus.getDefault().register((int i) { //注册
debugPrint("enent bus ${i}"); //接受消息打印
});
}
///当State对象从树中被永久移除时调用;通常在此回调中释放资源
@override
void deactivate() {
///销毁
super.deactivate();
debugPrint("deactivate");
EventBus.getDefault().unregister(); //销毁
}
}
项目链接,其中包含目前学习Flutter的一些内容https://github.com/shunplus/flutter_xu