Flutter中如何为firebase_storage实现文件上传进度监听?
在Flutter中监听Firebase Storage上传进度
嘿,刚好我对这块熟得很!其实firebase_storage官方已经给咱们封装了进度监听的能力,不用自己去实现什么OnProgressListener,直接用它内置的API就能搞定,下面给你一步步讲清楚:
核心思路:利用UploadTask的snapshotEvents流
当你调用putFile/putData上传文件时,会得到一个UploadTask对象,这个对象的snapshotEvents是一个Stream,它会实时推送上传的快照信息,里面就包含了进度数据。
完整代码示例
咱们直接上可运行的代码片段,一看就懂:
import 'dart:io'; import 'package:firebase_storage/firebase_storage.dart'; // 定义一个上传文件并监听进度的函数 Future<void> uploadFileWithProgress(File file) async { // 1. 获取Firebase Storage的引用(这里替换成你的存储路径) final storageRef = FirebaseStorage.instance.ref().child('uploads/${file.path.split('/').last}'); // 2. 创建上传任务 final uploadTask = storageRef.putFile(file); // 3. 监听上传进度和状态 final subscription = uploadTask.snapshotEvents.listen((TaskSnapshot snapshot) { // 计算上传进度百分比 final progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100; print('上传进度:${progress.toStringAsFixed(2)}%'); // 根据上传状态做不同处理 switch (snapshot.state) { case TaskState.running: // 正在上传,这里可以更新UI进度条 break; case TaskState.paused: // 上传暂停了 print('上传已暂停'); break; case TaskState.success: // 上传成功,获取文件下载URL snapshot.ref.getDownloadURL().then((url) { print('文件上传完成,下载URL:$url'); }); break; case TaskState.canceled: // 上传被取消 print('上传已取消'); break; case TaskState.error: // 上传出错 print('上传失败:${snapshot.error}'); break; } }, onError: (error) { // 处理全局上传错误 print('上传发生错误:$error'); }); // 如果你需要手动取消监听,可以调用subscription.cancel(); // 比如在页面销毁时记得取消,避免内存泄漏 }
关键细节说明
- 进度计算:
snapshot.bytesTransferred是已经上传的字节数,snapshot.totalBytes是文件总字节数,两者相除再乘100就是百分比。 - 状态处理:
TaskState枚举包含了所有可能的上传状态,你可以根据这些状态更新UI(比如显示进度条、成功提示、错误弹窗)。 - 暂停/恢复/取消任务:
UploadTask还提供了pause()、resume()、cancel()方法,你可以绑定到按钮点击事件上,实现手动控制上传。
额外提示
如果你是用putData上传内存中的数据(比如Uint8List),用法和putFile完全一样,同样通过snapshotEvents监听进度。
内容的提问来源于stack exchange,提问作者Jus10
相关产品推荐
相关产品推荐

