import 'package:get/get.dart'; import 'package:kaer_with_panels/app/utils/kr_log_util.dart'; /// 消息类型枚举 enum KRMessageType { kr_payment, kr_subscribe_update, } /// 消息数据类 class KRMessageData { final KRMessageType kr_type; // 消息类型 final Map kr_data; // 消息数据 KRMessageData({ required this.kr_type, required this.kr_data, }); } /// 消息总线工具类 class KREventBus { // 单例模式 static final KREventBus _instance = KREventBus._internal(); factory KREventBus() => _instance; KREventBus._internal(); // 消息流控制器 final _kr_messageController = Rx(null); /// 发送消息 void kr_sendMessage( KRMessageType type, { Map data = const {}, }) { _kr_messageController.value = KRMessageData( kr_type: type, kr_data: data, ); } /// 监听特定类型的消息 /// 返回 Worker 对象,可用于手动取消订阅 /// 在控制器的 onClose 方法中调用 worker.dispose() 来取消订阅 /// 示例: /// ```dart /// class MyController extends GetxController { /// Worker? _worker; /// /// @override /// void onInit() { /// super.onInit(); /// _worker = KREventBus().kr_listenMessage( /// KRMessageType.kr_paymentSuccess, /// (message) => KRLogUtil.kr_d('收到消息: $message', tag: 'EventBus'), /// ); /// } /// /// @override /// void onClose() { /// _worker?.dispose(); /// super.onClose(); /// } /// } /// ``` Worker kr_listenMessage( KRMessageType type, Function(KRMessageData) callback, ) { return ever(_kr_messageController, (KRMessageData? message) { if (message != null && message.kr_type == type) { callback(message); } }); } /// 监听多个类型的消息 /// 返回 Worker 对象,可用于手动取消订阅 /// 在控制器的 onClose 方法中调用 worker.dispose() 来取消订阅 Worker kr_listenMessages( List types, Function(KRMessageData) callback, ) { return ever(_kr_messageController, (KRMessageData? message) { if (message != null && types.contains(message.kr_type)) { callback(message); } }); } /// 监听所有消息 /// 返回 Worker 对象,可用于手动取消订阅 /// 在控制器的 onClose 方法中调用 worker.dispose() 来取消订阅 Worker kr_listenAllMessages(Function(KRMessageData) callback) { return ever(_kr_messageController, (KRMessageData? message) { if (message != null) { callback(message); } }); } }