1、前言
在APP中,我们经常会需要一个广播机制,用以跨页面事件通知,Flutter中我们可以使用event_bus提供的事件总线功能来实现一些状态的更新,其核心是基于Dart Streams(流);事件总线通常实现了订阅者模式,订阅者模式包含发布者和订阅者两种角色,可以通过事件总线来触发事件和监听事件,接下来我将学习event_bus,并异步实现主题颜色的更新。
2、Flutter中集成EventBus
在pubspec.yaml文件中添加event_bus,当前版本1.1.0:
event_bus: ^1.1.0
在dart代码中引入:
import 'package:event_bus/event_bus.dart';
现在已经引入event_bus插件库了,接下来可以在对应类中引入使用event_bus,也许使用flutter插件库都是同样的步骤吧!
3、创建EventBus
通常每个应用程序只有一个事件总线,但可以设置多个事件总线以对一组特定事件进行分组,因此新建event_bus.dart类,在类中创建EventBus实例,并使其能够在其他类中被使用,并定义了ThemeColorEvent通知修改主题颜色的事件:
import 'package:event_bus/event_bus.dart';
/// 创建EventBus
EventBus eventBus = EventBus();
/// Event 修改主题色
class ThemeColorEvent {
String colorStr;
ThemeColorEvent(this.colorStr);
}
这里是通过EventBus eventBus = EventBus();来创建EventBus实例的,先看一下库源码EventBus()方法:
EventBus({bool sync = false})
: _streamController = StreamController.broadcast(sync: sync);
其创建EventBus过程中,是通过StreamController.broadcast方法来实现事件总线的创建,前面说过EventBus核心是基于Dart Streams(流),StreamController.broadcast就是Streams的一种广播流,这里可以看到EventBus创建时还可以传入一个sync,默认sync为false,即异步操作;当sync为true,即同步操作。
4、注册事件监听器
接下来我在main.dart程序入口类中,注册了监听修改主题颜色的监听器,用于接收一个颜色值,然后setState更新主题状态。
//订阅eventbus
_colorSubscription = eventBus.on<ThemeColorEvent>().listen((event) {
Color color = AppColors.getColor(event.colorStr);
setState(() {
_primaryColor = color;
});
由于EventBus其核心是基于Dart Streams(流),这里我定义了StreamSubscription _colorSubscription;相当于订阅者,因此在退出页面的时候也要取消订阅,防止内存泄漏:
@override
void dispose() {
// TODO: implement dispose
super.dispose();
//取消订阅
_colorSubscription.cancel();
}
5、发送事件
我新建了一个子页面,子页面中有个输入框,用于输入颜色值的,然后点击按钮,就会带上输入框的颜色值,执行EventBus发送修改主题颜色的事件:
//发送订阅消息去修改颜色
eventBus.fire(ThemeColorEvent(_colorController.text));
这样在前面的main.dart类中注册的监听器即可接收到子页面传过来的颜色值,这边便实现了修改APP主题色功能。
效果图:
gfone.gif
源码地址:
https://github.com/ChessLuo/flutter_study_app
支持我的话可以关注下我的公众号,一起学习Android、小程序、跨平台开发~
my二维码.jpg
网友评论