一、EventBus的原理
EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访问,通过Stream的机制来实现不同widget之间的状态共享。(全局事件总线,通过stream来实现,用于不同页面的跨层访问)
二、使用
1、实例化 eventbus
由于eventbus需要在不同的类里面调用,我们不能在不同的类里面单独创建,需要让其变成全局状态。所以我们新创建一个文件,用来存储event_bus对象。
import 'package:event_bus/event_bus.dart';
//事件传递
EventBus eventBus = new EventBus();
2、定义消息 event 对象
在全局发送一个消息是需要携带一个对象,来存储消息的内容。所以我们需要新建一个文件来存放需要传递的消息体。
class HttpErrorEvent {
final int code;
final String message;
HttpErrorEvent(this.code, this.message);
}
3、创建监听器
我们针对每种事件都要建立一个监听,并把监听混入到页面中来达到监听的效果。所以需要建立一个监听的文件。http_listener.dart
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'event_bus.dart';
import 'home_page.dart';
import 'http_error_event.dart';
mixin HttpErrorListener on State<MyHomePage> {
StreamSubscription ? stream;
@override
void initState() {
super.initState();
///Stream演示event bus
stream = eventBus.on<HttpErrorEvent>().listen((event) {
errorHandleFunction(event.code, event.message);
});
}
@override
void dispose() {
super.dispose();
if (stream != null) {
stream?.cancel();
stream = null;
}
}
///网络错误提醒
errorHandleFunction(int code, message) {
switch (code) {
case 404:
showToast("404: ${message}");
break;
default:
showToast("unknown: ${message}");
break;
}
}
showToast(String message) {
print('监听了传参:${message}');
}
}
4、发送消息
发送消息时只要调用 eventBus.fire(.....) 即可.
eventBus.fire(HttpErrorEvent(404, "找不到网页"));
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:getxflutter/event_bus.dart';
import 'http_error_event.dart';
import 'http_error_listener.dart';
class MyHomePage extends StatefulWidget {
final String title;
MyHomePage({ Key? key, required this.title}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with HttpErrorListener {
int _counter = 0;
@override
void dispose() {
// TODO: implement dispose
super.dispose();
}
void _incrementCounter() {
eventBus.fire(HttpErrorEvent(404, "找不到网页"));
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Text(
'flutter event bus sample',
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
5、接收消息
stream = eventBus.on<HttpErrorEvent>().listen((event) {
errorHandleFunction(event.code, event.message);
});
6、销毁
void dispose() {
super.dispose();
if (stream != null) {
stream?.cancel();
stream = null;
}
}
三、自定义组件事件监听
1、发送事件
Widget cell(Icons,title){
return Container(
color: Colors.orange,
height: 50,
child: Row(
children: [
SizedBox(width: 15),
GestureDetector(
child: Icon(
Icons,
color: Colors.red,
),
onTap: (){
eventBus.fire(LoginSuccessEvent('myBuy'));
},
),
SizedBox(width: 10),
Text(title),
],
),
);
}
2、监听事件的触发,根据event的属性来判断点击的是哪一个事件并做处理。
@override
void initState() {
super.initState();
this.actionEventBus = eventBus.on<LoginSuccessEvent>().listen((event) {
if(event.str == 'myBuy'){
print('判断通过~~~~~~~~~~~~${event.str}');
}
this.getUserInfo();
});
this.getUserInfo();
}
3、销毁创建的EventBus
void dispose() {
super.dispose();
this.actionEventBus.cancel();
}
网友评论