EventBus
是全局事件总线,底层通过Stream
来实现;它可以实现不同页面的跨层访问,通过Stream
的机制来实现不同widget
之间的状态共享.你有一个主界面,里面有一些信息可能会修改,但触发源不在该界面,是在其他的界面触发了一些事件后,首页的内容需要做修改。如果没有
EventBus
,也有很多的方式可以实现,譬如定义全局静态变量、或者定义个CallBack
接口传出去等等。不管怎样,总是要把主页和触发源关联起来,这是相当难受的,这不但会导致代码量暴涨,同时还会导致耦合度极高,不得不写的这个引用让人如鲠在喉。
在
flutter
中使用eventbus
主要可以归纳为如下步骤:
eventbus
event
对象eventbus
eventbus
是可能在不同类里调用的eventbus
,那么网络请求可能发生在很多歌类的代码里event_bus.dart
用它来专门存储 event_bus
对象import 'package:event_bus/event_bus.dart';
EventBus eventBus = new EventBus();
event
对象Android
、iOS
或者其他任意技术的同学都知道flutter
的 event_bus
也是如此http_event.dart
来存放这种需要传递的消息体class HttpErrorEvent {
final int code;
final String message;
HttpErrorEvent(this.code, this.message);
}
eventbus
),需要建立一个监听widget
中)来达到监听效果http_listener.dart
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'event_bus.dart';
import 'home_page.dart';
import 'http_event.dart';
mixin HttpErrorListener on State<MyHomePage> {
StreamSubscription stream;
BuildContext _context;
@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) {
Fluttertoast.showToast(
msg: message,
gravity: ToastGravity.CENTER,
toastLength: Toast.LENGTH_LONG);
}
}
_context
是因为此时 State
的 context
是 FlutterReduxApp
而不是 MaterialApp
context
是会获取不到 MaterialApp
的 Localizations
哦。
showToast
是一个三方的吐司库 可以再dependences
中添加fluttertoast: ^7.1.1
即可
eventBus.fire(...)
即可HttpErrorEvent(404, "找不到网页")
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
@override
void dispose() {
super.dispose();
}
void _incrementCounter() {
eventBus.fire(HttpErrorEvent(404, "找不到网页"));
}
@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),
),
);
}
}
Toast
),等等诸如此类State
对象后混入:with HttpErrorListener
即可class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with HttpErrorListener {
// ...
}
_MyHomePageState
的监听就会收到消息对象HttpErrorListener
中的 errorHandleFunction
方法去触发其中的 showToast(String message)
方法,从而在屏幕上弹出一个 Toast
为了方便大家理解,对于
Dart
中混合mixin、on、with
语法陌生的同学可以看这篇文章 Flutter 知识梳理 (Dart) - implements, extends, mixin 的理解
event_bus
能有效的解耦,把本该有联系的需要传引用的给简化了,由它来分发事件了。这在某些时候和Android
里的broadcast
有点像,都是能通知很多个观察者,只不过更简便一点。github
:bilibili-workspace/flutter_eventbus_sample扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有