Flutter中如何捕获Firebase Storage的所有不同类型错误?
Flutter firebase_storage 错误规范捕获方案
你需要的类型化错误捕获能力,firebase_storage 2.0.0及以上稳定版本已经原生支持,无需硬编码错误字符串,实现方式如下:
前置要求
确保项目依赖的firebase_storage版本 >= 2.0.0,旧版本需先升级到官方稳定版。
方案1:监听上传任务状态(适合需要实时进度反馈的场景)
通过监听UploadTask的状态流,可以直接用TaskState枚举匹配所有任务状态,错误场景下用官方预定义的FirebaseStorageError常量匹配错误类型:
final UploadTask task = FirebaseStorage.instance.ref("目标存储路径").putFile(本地文件对象); task.snapshotEvents.listen((TaskSnapshot snapshot) { switch (snapshot.state) { case TaskState.running: // 上传中:可更新进度条 double progress = snapshot.bytesTransferred / snapshot.totalBytes; break; case TaskState.paused: // 上传已暂停 break; case TaskState.success: // 上传成功:可获取下载链接 String downloadUrl = await snapshot.ref.getDownloadURL(); break; case TaskState.canceled: // 上传已取消 break; case TaskState.error: // 上传出错:细分错误类型 final FirebaseException err = snapshot.error as FirebaseException; if (err.code == FirebaseStorageError.unauthenticated) { // 用户未登录/无上传权限 } else if (err.code == FirebaseStorageError.quotaExceeded) { // 存储空间已满 } else if (err.code == FirebaseStorageError.objectNotFound) { // 目标存储对象不存在 } break; } });
方案2:async/await + try-catch(适合不需要实时进度的场景)
直接捕获FirebaseStorageException,结合FirebaseStorageError常量做类型匹配:
try { TaskSnapshot snapshot = await FirebaseStorage.instance.ref("目标存储路径").putFile(本地文件对象); String downloadUrl = await snapshot.ref.getDownloadURL(); // 上传成功后续逻辑 } on FirebaseStorageException catch (e) { switch (e.code) { case FirebaseStorageError.canceled: // 处理上传取消逻辑 break; case FirebaseStorageError.retryLimitExceeded: // 处理重试次数超限逻辑 break; case FirebaseStorageError.unknown: // 处理未知错误逻辑 break; // 按需补充其他错误类型的处理分支 } }
说明
FirebaseStorageError是官方SDK提供的错误码常量类,所有可能的错误码都被封装为静态字符串常量,会跟随SDK版本同步更新,完全避免了硬编码字符串可能出现的版本不兼容问题。如果需要查看全量支持的错误类型,可以直接查看SDK内FirebaseStorageError类的定义,每个常量都对应了明确的错误场景注释。
内容的提问来源于stack exchange,提问作者Tom3652
相关产品推荐
相关产品推荐

