EventBus

源代码 2024-9-19 18:45:23 165 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官网地点
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2025-4-19 19:23, Processed in 0.142857 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表