Flutter中如何将Dio的onSendProgress数据回传至Widget?
实现上传进度回传并更新AlertDialog的进度显示
第一步:给外部的uploadFile方法新增进度回调参数
修改TheClass里的uploadFile方法,添加一个进度回调参数,让Dio的上传进度能传递到Widget层面:
// 更新TheClass的uploadFile方法 Future<void> uploadFile(String folderID, String imagePath, {Function(int sent, int total)? onProgress}) async { // 这里保留你原本构建url、formData、headers_form的逻辑 final response = await dio.post( url.toString(), data: formData, options: Options(headers: headers_form), onSendProgress: (int sent, int total) { print(sent); // 将进度传递给外部回调 onProgress?.call(sent, total); }, ); // 保留你原本的后续处理逻辑 }
第二步:在AlertDialog的StatefulBuilder里维护进度并更新UI
在StatefulBuilder的builder内部声明进度变量,调用uploadFile时传入回调,用setState触发UI更新:
return StatefulBuilder( builder: (context, setState) { // 初始化上传进度为0 int _uploadProgress = 0; return AlertDialog( title: const Text('确认文件上传'), content: Container( child: Column( mainAxisSize: MainAxisSize.min, // 避免Column撑满弹窗高度 children: [ // 用进度条展示更直观,也可以保留原Text显示数值 LinearProgressIndicator(value: _uploadProgress / 100), const SizedBox(height: 8), Text('已上传:$_uploadProgress%'), ], ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context, false), child: const Text('取消'), ), FFButtonWidget( onPressed: () async { await TheClass().uploadFile( widget.folderID, imagePath, onProgress: (sent, total) { if (total > 0) { setState(() { // 计算百分比,避免total为0时的除零错误 _uploadProgress = (sent / total * 100).toInt(); }); } }, ); Navigator.pop(context, true); }, child: const Text('上传'), ), ], ); }, );
关键注意事项
- 给Column加上
mainAxisSize: MainAxisSize.min,避免弹窗被不必要地拉长 - 增加
total > 0的判断,防止上传初期total未初始化导致的异常 - 如果需要展示原始字节数,直接用
sent和total即可,不用转换为百分比
内容的提问来源于stack exchange,提问作者somethingstrang
相关产品推荐
相关产品推荐

