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