hi-client/lib/app/utils/kr_event_bus.dart
2025-10-13 18:08:02 +08:00

102 lines
2.6 KiB
Dart
Executable File

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<String, dynamic> 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<KRMessageData?>(null);
/// 发送消息
void kr_sendMessage(
KRMessageType type, {
Map<String, dynamic> 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<KRMessageType> 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);
}
});
}
}