Flutter 事件传递
·
Fluter 事件传递
Android中可以使用EventBus来进行组件之间的事件传递。
Flutter: https://book.flutterchina.club/chapter8/eventbus.html
typedef void EventCallback(arg);
class EventBus{
EventBus._internal();
static EventBus _singleton = new EventBus._internal();
factory EventBus() => _singleton;
var _eMap = new Map<Object, List<EventCallback>>();
/// 添加订阅者
void register(eventName, EventCallback f) {
if (eventName == null || f == null) {
return;
}
_eMap[eventName] ??= new List<EventCallback>();
_eMap[eventName].add(f);
}
/// 移除订阅者
void unRegister(eventName, [EventCallback f]) {
var list = _eMap[eventName];
if (eventName == null || list == null) return;
if (f == null) {
_eMap[eventName] = null;
} else {
list.remove(f);
}
}
/// 触发事件,事件触发后该事件所有订阅者会被调用
void post(eventName, [arg]) {
var list = _eMap[eventName];
if (list == null) return;
int len = list.length - 1;
//反向遍历,防止订阅者在回调中移除自身带来的下标错位
for (var i = len; i > -1; --i) {
list[i](arg);
}
}
}
使用:
主页:
class EventBusMainPage extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return _EventBusPageState();
}
}
class _EventBusPageState extends State<EventBusMainPage>{
String textRes = "";
@override
void initState() {
}
@override
void deactivate() {
super.deactivate();
EventBus().register("testEvent", (arg){
setState(() {
textRes = "${arg}";
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("EventBus事件接收页"),
),
body: Column(
children: <Widget>[
Text("参数:${textRes}"),
RaisedButton(
onPressed: (){
Navigator.pushNamed(context, "/EventBusNotifyPage");
},
child: Text("去传递页"),
)
],
)
);
}
@override
void dispose() {
super.dispose();
EventBus().unRegister("testEvent");
}
}
传递页:
class EventBusNotifyPage extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("通知"),
),
body: RaisedButton(
onPressed: (){
EventBus().post("testEvent", "我是参数");
},
child: Text("发送消息"),
),
);
}
}
更多推荐
所有评论(0)