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

Flutter项目上传图片至Firebase时出现StorageTask状态变更错误

Flutter Firebase图片上传错误:unable to change internal state to INTERNAL_STATE_CANCELED

错误信息

[1] W/StorageTask( 5144): unable to change internal state to: INTERNAL_STATE_CANCELED, INTERNAL_STATE_CANCELING isUser: true from state:INTERNAL_STATE_SUCCESS

问题代码

uploadImage(mImageFile) async {
     storageRef.Reference reference =
        storageRef.FirebaseStorage.instance.ref().child("menus");
    storageRef.UploadTask uploadTask =
        reference.child(uniqueIDName + ".jpg").putFile(mImageFile);

    storageRef.TaskSnapshot taskSnapshot = await uploadTask.whenComplete(() {});

    String downloadURL = await taskSnapshot.ref.getDownloadURL();
    return downloadURL;
 }

解决方案

这个错误核心是上传任务已成功完成后,仍有代码尝试取消该任务,或是SDK状态管理的小冲突,可通过以下方式解决:

  • 简化上传任务的等待逻辑:
    替换whenComplete为直接await uploadTask,前者可能触发任务完成后的状态变更冲突,直接等待任务完成更可靠。

  • 排查取消逻辑:
    检查项目中是否有其他代码调用了uploadTask.cancel(),如果在任务成功后仍执行取消操作,就会触发该错误,需调整为仅在任务未完成时允许取消。

  • 更新Firebase依赖:
    旧版本SDK可能存在状态管理bug,升级firebase_storage等相关依赖到最新版本可解决这类问题。

修改后的代码

Future<String> uploadImage(File mImageFile) async {
  // 简化引用获取,避免冗余前缀
  final storageRef = FirebaseStorage.instance.ref().child("menus/${uniqueIDName}.jpg");
  final uploadTask = storageRef.putFile(mImageFile);

  // 直接等待上传完成
  final taskSnapshot = await uploadTask;
  
  // 获取并返回下载URL
  return await taskSnapshot.ref.getDownloadURL();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:51:05