EventBus
2024-04-09 20:40:23  阅读数 989

一、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官网地址