EventBus

作者: woniu | 来源:发表于2022-07-21 17:13 被阅读0次

    一、EventBus的原理

    EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访问,通过Stream的机制来实现不同widget之间的状态共享。(全局事件总线,通过stream来实现,用于不同页面的跨层访问)

    二、使用

    1、实例化 eventbus

    由于eventbus需要在不同的类里面调用,我们不能在不同的类里面单独创建,需要让其变成全局状态。所以我们新创建一个文件,用来存储event_bus对象。

    import 'package:event_bus/event_bus.dart';
    //事件传递
    EventBus eventBus = new EventBus();
    

    2、定义消息 event 对象

    在全局发送一个消息是需要携带一个对象,来存储消息的内容。所以我们需要新建一个文件来存放需要传递的消息体。

    class HttpErrorEvent {
      final int code;
      final String message;
      HttpErrorEvent(this.code, this.message);
    }
    

    3、创建监听器

    我们针对每种事件都要建立一个监听,并把监听混入到页面中来达到监听的效果。所以需要建立一个监听的文件。http_listener.dart

    import 'dart:async';
    import 'package:flutter/cupertino.dart';
    import 'event_bus.dart';
    import 'home_page.dart';
    import 'http_error_event.dart';
    
    mixin HttpErrorListener on State<MyHomePage> {
      StreamSubscription ? stream;
    
      @override
      void initState() {
        super.initState();
    
        ///Stream演示event bus
        stream = eventBus.on<HttpErrorEvent>().listen((event) {
          errorHandleFunction(event.code, event.message);
        });
      }
    
      @override
      void dispose() {
        super.dispose();
        if (stream != null) {
          stream?.cancel();
          stream = null;
        }
      }
    
      ///网络错误提醒
      errorHandleFunction(int code, message) {
        switch (code) {
          case 404:
            showToast("404: ${message}");
            break;
          default:
            showToast("unknown: ${message}");
            break;
        }
      }
    
      showToast(String message) {
        print('监听了传参:${message}');
      }
    }
    

    4、发送消息

    发送消息时只要调用 eventBus.fire(.....) 即可.
    eventBus.fire(HttpErrorEvent(404, "找不到网页"));

    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:getxflutter/event_bus.dart';
    
    import 'http_error_event.dart';
    import 'http_error_listener.dart';
    
    class MyHomePage extends StatefulWidget {
     final String title;
    
      MyHomePage({ Key? key, required this.title}) : super(key: key);
    
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> with HttpErrorListener {
      int _counter = 0;
    
      @override
      void dispose() {
        // TODO: implement dispose
        super.dispose();
      }
    
      void _incrementCounter() {
        eventBus.fire(HttpErrorEvent(404, "找不到网页"));
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Text(
            'flutter event bus sample',
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

    5、接收消息

     stream = eventBus.on<HttpErrorEvent>().listen((event) {
          errorHandleFunction(event.code, event.message);
        });
    

    6、销毁

      void dispose() {
        super.dispose();
        if (stream != null) {
          stream?.cancel();
          stream = null;
        }
      }
    

    三、自定义组件事件监听

    1、发送事件

      Widget cell(Icons,title){
        return Container(
          color: Colors.orange,
          height: 50,
          child: Row(
            children: [
              SizedBox(width: 15),
              GestureDetector(
                child: Icon(
                  Icons,
                  color: Colors.red,
                ),
                onTap: (){
                  eventBus.fire(LoginSuccessEvent('myBuy'));
                },
              ),
              SizedBox(width: 10),
              Text(title),
            ],
          ),
        );
      }
    

    2、监听事件的触发,根据event的属性来判断点击的是哪一个事件并做处理。

      @override
      void initState() {
        super.initState();
        this.actionEventBus = eventBus.on<LoginSuccessEvent>().listen((event) {
          if(event.str == 'myBuy'){
            print('判断通过~~~~~~~~~~~~${event.str}');
          }
          this.getUserInfo();
        });
        this.getUserInfo();
      }
    

    3、销毁创建的EventBus

      void dispose() {
        super.dispose();
        this.actionEventBus.cancel();
      }
    

    EventBus官网地址

    相关文章

      网友评论

        本文标题:EventBus

        本文链接:https://www.haomeiwen.com/subject/ieauirtx.html