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();  //銷燬
  }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章