triggerEvent<T> static method
Future<void>
triggerEvent<T>({
- required void onStateChange(
- DKStateEvent<
T> state
- DKStateEvent<
- required Future<
T> event(), - String? tag,
触发事件并自动管理状态变化
这是一个通用的事件触发逻辑,会自动处理:
- 生成唯一的运行 ID 用于日志追踪
- 发送 Loading 状态
- 执行异步操作
- 发送 Success 或 Error 状态
- 记录日志
@param onStateChange 状态变化回调,用于发送新状态 @param event 异步事件操作 @param tag 日志标签(可选) @return Future
示例:
await DKStateEventHelper.triggerEvent<String>(
onStateChange: (state) => controller.add(state),
event: () async => await fetchData(),
tag: 'FetchData',
);
Implementation
static Future<void> triggerEvent<T>({
required void Function(DKStateEvent<T> state) onStateChange,
required Future<T> Function() event,
String? tag,
}) async {
// 生成唯一的运行 ID
final runId = _generateRunId();
final logTag = tag ?? _tag;
try {
DKStateUtil.callLog(
() => DKLog.title("[$runId] 开始处理事件: $T", tag: logTag),
);
DKStateUtil.callLog(DKLog.separator);
DKStateUtil.callLog(() => DKLog.d("[$runId] 触发事件: $T", tag: logTag));
// 发送加载中状态
onStateChange(DKStateEventLoading<T>(runId));
// 执行异步操作
final result = await event();
// 发送成功状态
onStateChange(DKStateEventSuccess<T>(runId, result));
DKStateUtil.callLog(() => DKLog.i("[$runId] 事件成功完成: $T", tag: logTag));
// 记录结果(如果需要)
if (result != null) {
try {
DKStateUtil.callLog(() => DKLog.json(result, tag: logTag));
} catch (_) {
// JSON 序列化失败时忽略
DKStateUtil.callLog(
() => DKLog.d("[$runId] 结果: $result", tag: logTag),
);
}
}
} catch (e, stackTrace) {
// 发送错误状态
final errorMessage = e.toString();
onStateChange(
DKStateEventError<T>(
runId,
errorMessage,
error: e,
stackTrace: stackTrace,
),
);
DKStateUtil.callLog(
() => DKLog.e(
"[$runId] 事件执行出错: $errorMessage",
tag: logTag,
error: e,
stackTrace: stackTrace,
),
);
} finally {
onStateChange(DkStateEventCompleted<T>(runId));
DKStateUtil.callLog(() {
DKLog.d("[$runId] 事件处理完成: $T", tag: logTag);
});
DKStateUtil.callLog(DKLog.separator);
DKStateUtil.callLog(
() => DKLog.title("[$runId] 结束处理事件: $T", tag: logTag),
);
}
}