如需转载,请注明出处:Flutter学习笔记(34)--EventBus的使用html
在Android咱们常常会使用到EventBus来进行通讯,经常使用到的场景就是不一样的页面来传递数据,Flutter中也能够经过EventBus来进行不一样页面间的数据传递。ios
EventBus就是一条事件订阅总线,有事件的订阅者、事件的发布者。app
demo就是模拟了一下页面间的数据传递,页面A跳转到页面B,从页面B返回到页面A的时候,经过EventBus传递数据给页面A。ide
先大致说一下用法结构工具
1.导入EventBus依赖:post
event_bus: ^1.1.0
2.单例模式建立EventBus工具类学习
import 'package:event_bus/event_bus.dart'; class EventBusUtils { static EventBus _instance; static EventBus getInstance() { if (null == _instance) { _instance = new EventBus(); } return _instance; } }
3.建立事件,这个事件其实就是一个用来承载共享数据的载体ui
class StringContentEvent{ String str; StringContentEvent(this.str); }
class DoubleContentEvent{ double max; DoubleContentEvent(this.max); }
4.订阅方订阅事件this
import 'package:flutter/material.dart'; import 'package:study_app/EventBusRouteDemo.dart'; import 'package:study_app/util/DoubleContentEvent.dart'; import 'package:study_app/util/StringContentEvent.dart'; import 'package:study_app/util/EventBusUtils.dart'; class EventBusDemo extends StatefulWidget { @override State<StatefulWidget> createState() { return _EventBusDemoState(); } } class _EventBusDemoState extends State { String _content = '我是曾经的数据'; double _max = 0.0; @override Widget build(BuildContext context) { return MaterialApp( title: 'EventBusDemo', home: Scaffold( appBar: AppBar( title: Text('EventBusDemo'), actions: <Widget>[ IconButton( icon: Icon(Icons.navigate_next), onPressed: () { EventBusUtils.getInstance().on<StringContentEvent>().listen((event) { print(event.str); setState(() { _content = event.str; }); }); EventBusUtils.getInstance().on<DoubleContentEvent>().listen((event) { print(event.max); setState(() { _max = event.max; }); }); Navigator.push( context, new MaterialPageRoute( builder: (context) => new EventBusRouteDemo())); }) ], ), body: Center( child: Text(_content + _max.toString()), ), ), ); } @override void deactivate() { // TODO: implement deactivate super.deactivate(); } @override void dispose() { super.dispose(); //关闭event事件流,否则会形成内存泄漏,调用以下代码便可: EventBusUtils.getInstance().destroy(); } }
5.事件的发布方发布事件url
import 'package:flutter/material.dart'; import 'package:study_app/util/DoubleContentEvent.dart'; import 'package:study_app/util/StringContentEvent.dart'; import 'package:study_app/util/EventBusUtils.dart'; class EventBusRouteDemo extends StatefulWidget{ @override State<StatefulWidget> createState() { return _EventBusRouteDemoState(); } } class _EventBusRouteDemoState extends State { @override Widget build(BuildContext context) { return MaterialApp( title: 'EventBusRouteDemo', home: Scaffold( appBar: AppBar( title: Text('EventBusRouteDemo'), leading: IconButton(icon: Icon(Icons.arrow_back_ios), onPressed: (){ EventBusUtils.getInstance().fire(DoubleContentEvent(2.2)); Navigator.of(context).pop(); }), ), body: Center( child: Text('EventBusRouteDemo'), ), ), ); } }
看下效果:
这里可能有人会有疑问,若是多个页面都经过EventBus进行事件订阅,那么当咱们发布事件的时候,会不会多个页面都监听到了呢,回答是不会的,这是由于咱们前面建立的事件来决定的。
EventBusUtils.getInstance().fire(DoubleContentEvent(2.2));
能够看到我建立的是两个不一样的事件,在发布的时候,我发布的是DoubleContentEvent这个事件,因此在订阅的地方,只有订阅的DoubleContentEvent事件才会响应。
以上!有疑问欢迎留言!