triggerEvent<T> static method

Future<void> triggerEvent<T>({
  1. required void onStateChange(
    1. DKStateEvent<T> state
    ),
  2. required Future<T> event(),
  3. 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),
    );
  }
}