You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

取消Firebase Storage UploadTask触发异常问题排查

问题分析与解决方案

你的操作触发异常的核心原因是:你尝试取消一个已经完成(成功/失败)的Firebase UploadTask——Firebase Storage的UploadTask不允许对已完成的任务调用cancel方法,因此抛出了异常。

正确的处理方式

1. 调用cancel前先校验任务状态

在执行取消操作前,先判断任务是否处于活跃的运行状态,只有状态为TaskState.running时才调用cancel:

final currentTask = SettingsUtils.uploadStatus.value;
if (currentTask.state == TaskState.running) {
  currentTask.cancel();
}

2. 优化上传任务的生命周期管理

  • 启动新上传前清理旧任务:避免同时存在多个上传任务,也防止误操作已完成的旧任务:
    // 先取消可能在运行的旧任务
    final oldTask = SettingsUtils.uploadStatus.value;
    if (oldTask != null && oldTask.state == TaskState.running) {
      oldTask.cancel();
    }
    // 赋值新的上传任务
    SettingsUtils.uploadStatus.value = ref.putFile(targetZipFile);
    
  • 监听任务完成状态,及时清理:任务完成后可以做标记或重置,避免后续误操作:
    SettingsUtils.uploadStatus.value.whenComplete(() {
      // 任务完成后可重置状态,比如改为null(如果用Nullable的ValueNotifier)
      // SettingsUtils.uploadStatus.value = null;
    });
    

3. 用Nullable类型优化任务存储

建议将uploadStatus改为可空的ValueNotifier,避免初始化时的无效任务实例:

// 修改SettingsUtils中的定义
static final ValueNotifier<UploadTask?> uploadStatus = ValueNotifier(null);

此时取消操作可以更安全:

final task = SettingsUtils.uploadStatus.value;
if (task != null && task.state == TaskState.running) {
  task.cancel();
}

4. 异常兜底捕获(可选)

如果无法完全避免调用已完成任务的cancel,可以用try-catch捕获特定异常,防止崩溃:

try {
  SettingsUtils.uploadStatus.value.cancel();
} catch (e) {
  // 仅处理取消已完成任务的异常,其他异常重新抛出
  if (e.toString().contains('Cannot cancel a completed upload task')) {
    // 可提示用户“上传已完成,无需取消”或直接忽略
  } else {
    rethrow;
  }
}

内容的提问来源于stack exchange,提问作者WilliamKose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:00:16