如需轉載,請註明出處: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事件纔會響應。
以上!有疑問歡迎留言!