Fluter 事件传递

Android中可以使用EventBus来进行组件之间的事件传递。

Flutter: https://book.flutterchina.club/chapter8/eventbus.html

typedef void EventCallback(arg);

class EventBus{

  EventBus._internal();

  static EventBus _singleton = new EventBus._internal();

  factory EventBus() => _singleton;

  var _eMap = new Map<Object, List<EventCallback>>();

  /// 添加订阅者
  void register(eventName, EventCallback f) {
    if (eventName == null || f == null) {
      return;
    }
    _eMap[eventName] ??= new List<EventCallback>();
    _eMap[eventName].add(f);
  }

  /// 移除订阅者
  void unRegister(eventName, [EventCallback f]) {
    var list = _eMap[eventName];
    if (eventName == null || list == null) return;
    if (f == null) {
      _eMap[eventName] = null;
    } else {
      list.remove(f);
    }
  }

  /// 触发事件,事件触发后该事件所有订阅者会被调用
  void post(eventName, [arg]) {
    var list = _eMap[eventName];
    if (list == null) return;
    int len = list.length - 1;
    //反向遍历,防止订阅者在回调中移除自身带来的下标错位
    for (var i = len; i > -1; --i) {
      list[i](arg);
    }
  }
}

使用:
主页:


class EventBusMainPage extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return _EventBusPageState();
  }
}

class _EventBusPageState extends State<EventBusMainPage>{

  String textRes = "";

  @override
  void initState() {

  }

  @override
  void deactivate() {
    super.deactivate();
    EventBus().register("testEvent", (arg){
      setState(() {
        textRes = "${arg}";
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("EventBus事件接收页"),
      ),
      body: Column(
        children: <Widget>[
          Text("参数:${textRes}"),
          RaisedButton(
            onPressed: (){
              Navigator.pushNamed(context, "/EventBusNotifyPage");
            },
            child: Text("去传递页"),
          )
        ],
      )
    );
  }

  @override
  void dispose() {
    super.dispose();
    EventBus().unRegister("testEvent");
  }
}

传递页:

class EventBusNotifyPage extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("通知"),
      ),
      body: RaisedButton(
        onPressed: (){
          EventBus().post("testEvent", "我是参数");
        },
        child: Text("发送消息"),
      ),
    );
  }
}

Demo地址

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐