You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:05:15