Flutter學習筆記(34)--EventBus的使用

如需轉載,請註明出處: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事件纔會響應。

以上!有疑問歡迎留言!

相關文章
相關標籤/搜索