剛剛使用RxDart簡單實現了EvnetBus效果,
github地址:flutter_rxbus
在pubspec.yaml引入
dependencies:
flutter_rxbus: ^0.0.1
用法一:
1、註冊
///註冊接收T類型消息
RxBus.getInstance().register<T>((value) {
});
2、發送消息
///發送T類型消息
RxBus.getInstance().post(T)
3、解除註冊
@override
void dispose() {
///解除接收T類型消息
RxBus.getInstance().unregister<T>();
super.dispose();
}
用法二
1、註冊返回一個Observable
,通過listen實現消息接收。
StreamSubscription _subscription;
///返回T類型的Observable,
_subscription = RxBus.getInstance().toObservable<T>().listen((value) {
});
2、發送消息
///發送T類型消息
RxBus.getInstance().post(T)
3、手動解除註冊
@override
void dispose() {
///取消註冊
_subscription?.cancel();
super.dispose();
}
示例代碼:
class _MyAppState extends State<MyHomePage> {
StreamSubscription _subscription;
@override
void initState() {
super.initState();
///註冊的方式使用
RxBus.getInstance().register<int>((event) {
print("通過註冊,收到event: $event");
});
///返回指定類型的Observable,
_subscription = RxBus.getInstance().toObservable<MyEvent>().listen((event) {
print("返回MyEvent類型的Observable,收到event: ${event.msg}");
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('flutter_rxbus'),
),
body: Center(child: Text("RxBus"),),
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return SecondPage();
}));
},
child: Icon(Icons.add),
),
);
}
@override
void dispose() {
///解除註冊
RxBus.getInstance().unregister<int>();
///取消註冊
_subscription?.cancel();
super.dispose();
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Page"),
),
body: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
RaisedButton(
onPressed: () => RxBus.getInstance().post(1111),
child: Text("發送int類型廣播"),
),
RaisedButton(
onPressed: () => RxBus.getInstance().post(MyEvent("你好")),
child: Text("發送MyEvent類型廣播"),
),
],
),
);
}
}
在SecondPage中分別發送一次int
類型消息和MyEvent
類型消息,收到消息如下:
I/flutter (22402): 通過註冊,收到event: 1111
I/flutter (22402): 返回MyEvent類型的Observable,收到event: 你好
注意
需要注意的是RxBus.getInstance().unregister<T>();
只能解除通過register
方法註冊的廣播。
使用toObservable
方式需要自己聲明一個StreamSubscription
接收,最後調用_subscription?.cancel();
來解除註冊。
總結
其實我項目都已經引入了EventBus了,只不過想通過多實踐來熟悉Rxdart使用。如果有什麼不對的地方,請指正。