Flutter实现EventBus

在Android中相信大家都时分熟悉EventBus,使用Flutter来实现EventBus,直接上代码

import 'dart:async';

class EventBus {
  static EventBus _instance;
  StreamController _streamController;
  factory  EventBus.getDefault(){
    return _instance ??= EventBus._init();
  }
  EventBus._init(){
    _streamController = StreamController.broadcast();
  }

  StreamSubscription<T> register<T>(void onData(T event)) {
    ///需要返回订阅者,所以不能使用下面这种形式
//   return _streamController.stream.listen((event) {
//      if (event is T) {
//        onData(event);
//      }
//    });
    ///没有指定类型,全类型注册
    if (T == dynamic) {
      return _streamController.stream.listen(onData);
    } else {
      ///筛选出 类型为 T 的数据,获得只包含T的Stream
      Stream<T>stream = _streamController.stream.where((type) => type is T)
          .cast<T>();
      return stream.listen(onData);
    }
  }

  void post(event) {
    _streamController.add(event);
  }

  void unregister() {
    _streamController.close();
  }

}

下面是使用样例

import 'package:flutter/material.dart';
import 'package:flutter_xu/util/event_bus.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int _i;

  ///绘制界面,当setState触发的时候会再次被调用
  @override
  Widget build(BuildContext context) {
    debugPrint("build");
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("导航"),),
        body: RaisedButton(onPressed: () {
          setState(() {
            _i++;
            EventBus.getDefault().post(_i);//发送EnentBus消息
          });
        }, child: Center(child: Text("点击我$_i"),),),
      ),
    );
  }

  ///当Widget第一次插入到Widget树时会被调用,对于每一个State对象,Flutter framework只会调用一次该回调
  @override
  void initState() {
    ///初始化
    super.initState();
    _i = 1;
    debugPrint("initState");
    EventBus.getDefault().register((int i) { //注册
      debugPrint("enent bus ${i}"); //接受消息打印
    });
  }
  

  ///当State对象从树中被永久移除时调用;通常在此回调中释放资源
  @override
  void deactivate() {
    ///销毁
    super.deactivate();
    debugPrint("deactivate");
    EventBus.getDefault().unregister();  //销毁
  }
}

项目链接,其中包含目前学习Flutter的一些内容https://github.com/shunplus/flutter_xu

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shunsix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值