Firebase技术疑问:如何在Cloud Storage写入成功后再写入Realtime Database?
解决方案
要实现仅在Cloud Storage上传成功后才写入Realtime Database的逻辑,需要从两个核心点修改代码:
1. 让Cloud Storage上传函数暴露执行结果
原代码里saveToCloudStorage用空catch吃掉了所有错误,外部无法判断上传是否成功。我们需要调整这个函数,让执行状态可以被外部感知:
写法一:移除空catch,让错误向外抛出
// 修改为Future<void>,允许外部await并捕获错误 Future<void> saveToCloudStorage(String filepath, String filename) async { _firebaseStoragePath = MyAppStorageDir + filename; File file = File(filepath); // 去掉空catch,上传失败时直接抛出异常 await _firebaseStorage .ref(_firebaseStoragePath) .putFile(file); }
写法二:保留catch,返回布尔值表示成功状态
// 返回bool,明确告知外部上传是否成功 Future<bool> saveToCloudStorage(String filepath, String filename) async { _firebaseStoragePath = MyAppStorageDir + filename; File file = File(filepath); try { await _firebaseStorage .ref(_firebaseStoragePath) .putFile(file); return true; // 上传成功 } catch (e) { // 可在此添加错误日志逻辑 return false; // 上传失败 } }
2. 在sendFile中等待上传结果,再触发数据库写入
修改sendFile函数,通过await等待上传完成,仅在成功时调用saveToRTDB:
对应写法一的实现
void sendFile(ChatData file, String filepath, String filename) async { try { // 等待Cloud Storage上传完成 await saveToCloudStorage(filepath, filename); // 上传成功后,才执行数据库写入 saveToRTDB(file); } catch (e) { // 可在此添加上传失败的处理,比如提示用户 } }
对应写法二的实现
void sendFile(ChatData file, String filepath, String filename) async { bool uploadSuccess = await saveToCloudStorage(filepath, filename); if (uploadSuccess) { saveToRTDB(file); } else { // 可在此添加上传失败的处理逻辑 } }
补充说明
- 原代码中
async函数声明为void会导致无法正确等待执行结果,因此必须改为Future<void>或Future<bool>类型。 saveToRTDB仍保持“即发即弃”的特性,但只会在Cloud Storage上传成功后被触发,完全符合需求。
内容的提问来源于stack exchange,提问作者whatwhatwhat
相关产品推荐
相关产品推荐

