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
相关产品推荐
相关产品推荐

