102 lines
2.6 KiB
Dart
Executable File
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);
|
|
}
|
|
});
|
|
}
|
|
} |