Flutter RxBus實現

剛剛使用RxDart簡單實現了EvnetBus效果,

github地址:flutter_rxbus

在pubspec.yaml引入

dependencies:
  flutter_rxbus: ^0.0.1

用法一:

1、註冊

    ///註冊接收T類型消息
    RxBus.getInstance().register<T>((value) {
    });

2、發送消息

///發送T類型消息
RxBus.getInstance().post(T)

3、解除註冊

  @override
  void dispose() {
    ///解除接收T類型消息
    RxBus.getInstance().unregister<T>();
    super.dispose();
  }

用法二

1、註冊返回一個Observable,通過listen實現消息接收。

	StreamSubscription _subscription;
	
    ///返回T類型的Observable,
     _subscription = RxBus.getInstance().toObservable<T>().listen((value) {
    });

2、發送消息

///發送T類型消息
RxBus.getInstance().post(T)

3、手動解除註冊

  @override
  void dispose() {
    ///取消註冊
    _subscription?.cancel();
    super.dispose();
  }

示例代碼:

class _MyAppState extends State<MyHomePage> {
  StreamSubscription _subscription;

  @override
  void initState() {
    super.initState();

    ///註冊的方式使用
    RxBus.getInstance().register<int>((event) {
      print("通過註冊,收到event: $event");
    });

    ///返回指定類型的Observable,
    _subscription = RxBus.getInstance().toObservable<MyEvent>().listen((event) {
      print("返回MyEvent類型的Observable,收到event: ${event.msg}");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('flutter_rxbus'),
      ),
      body: Center(child: Text("RxBus"),),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(context, MaterialPageRoute(builder: (context) {
            return SecondPage();
          }));
        },
        child: Icon(Icons.add),
      ),
    );
  }

  @override
  void dispose() {
    ///解除註冊
    RxBus.getInstance().unregister<int>();
    ///取消註冊
    _subscription?.cancel();
    super.dispose();
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Page"),
      ),
      body: Column(
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          RaisedButton(
            onPressed: () => RxBus.getInstance().post(1111),
            child: Text("發送int類型廣播"),
          ),
          RaisedButton(
            onPressed: () => RxBus.getInstance().post(MyEvent("你好")),
            child: Text("發送MyEvent類型廣播"),
          ),
        ],
      ),
    );
  }
}

在SecondPage中分別發送一次int類型消息和MyEvent類型消息,收到消息如下:

I/flutter (22402): 通過註冊,收到event: 1111

I/flutter (22402): 返回MyEvent類型的Observable,收到event: 你好

注意

需要注意的是RxBus.getInstance().unregister<T>();只能解除通過register方法註冊的廣播。
使用toObservable方式需要自己聲明一個StreamSubscription接收,最後調用_subscription?.cancel();來解除註冊。

總結

其實我項目都已經引入了EventBus了,只不過想通過多實踐來熟悉Rxdart使用。如果有什麼不對的地方,請指正。

項目地址:
https://github.com/Zhengyi66/flutter_rxbus

發佈了85 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章