在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(); //銷燬
}
}