• Flutter学习笔记(34)--EventBus的使用


    如需转载,请注明出处:Flutter学习笔记(34)--EventBus的使用

    在Android我们经常会使用到EventBus来进行通信,常用到的场景就是不同的页面来传递数据,Flutter中也可以通过EventBus来进行不同页面间的数据传递。

    EventBus就是一条事件订阅总线,有事件的订阅者、事件的发布者。

    demo就是模拟了一下页面间的数据传递,页面A跳转到页面B,从页面B返回到页面A的时候,通过EventBus传递数据给页面A。

    先大体说一下用法结构

    1.导入EventBus依赖:

    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.创建事件,这个事件其实就是一个用来承载共享数据的载体

    class StringContentEvent{
      String str;
    StringContentEvent(this.str);
    }
    class DoubleContentEvent{
      double max;
      DoubleContentEvent(this.max);
    }

    4.订阅方订阅事件

    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.事件的发布方发布事件

    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事件才会响应。

    以上!有疑问欢迎留言!

  • 相关阅读:
    【NOIP2013模拟9.29】Mixing Chemicals
    【NOIP2013模拟9.29】TheSwaps
    【NOIP2013模拟9.29】密码
    【GDKOI2004】使命的召唤
    【GDKOI2003】分球
    【GDKOI2003】最大公共子串
    linux安装问题
    PLSQL 看连接数据库的用户
    Hibernate 框架的配置之一
    Struts2 Tomcat的配置
  • 原文地址:https://www.cnblogs.com/upwgh/p/13159064.html
Copyright © 2020-2023  润新知