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

Flutter Downloader:如何通过task_id获取任务详情(文件名)并在下载完成后执行指定操作

解决FlutterDownloader回调中通过taskId获取文件名的问题

我来给你两个实用的解决方案,帮你搞定这个问题:

方案一:入队时关联taskId和文件名(最简单高效)

既然你在入队的时候已经明确知道文件名,直接把taskId和文件名存在一个映射表里就可以了,回调里拿到taskId就能直接取到文件名,完全不用查询数据库,效率拉满。

代码示例:

  1. 先定义一个存储映射的变量(可以是全局变量,也可以放在你的下载管理类中):
final Map<String, String> _taskIdToFileName = {};
  1. 入队下载任务时,把taskId和文件名关联起来:
FlutterDownloader.registerCallback(DummyClass.callback);
final taskId = await FlutterDownloader.enqueue(
  url: 'url-to-download',
  savedDir: saveDir,
  fileName: file_name,
  showNotification: false,
  openFileFromNotification: false,
);
// 存起来,注意处理taskId为null的边界情况
if (taskId != null) {
  _taskIdToFileName[taskId] = file_name;
}
  1. 在回调函数中获取文件名并执行后续操作:
static void callback(String taskId, DownloadTaskStatus status, int progress) {
  final fileName = _taskIdToFileName[taskId];
  if (fileName != null && status == DownloadTaskStatus.complete) {
    // 这里执行你需要的后续操作,比如文件解压、内容解析、上传等
    print('下载完成,文件名:$fileName');
  }
}

方案二:通过FlutterDownloader的数据库查询获取文件名

如果你之前用loadTasks或loadTasksWithRawQuery没成功,大概率是参数传递出错了。FlutterDownloader会把所有任务详情存在本地数据库里,包括文件名,只要正确查询就能拿到。

方法A:使用loadTasks过滤taskId

static void callback(String taskId, DownloadTaskStatus status, int progress) async {
  // 只在任务完成时查询,避免频繁操作数据库
  if (status == DownloadTaskStatus.complete) {
    final tasks = await FlutterDownloader.loadTasks(withTaskId: taskId);
    if (tasks != null && tasks.isNotEmpty) {
      final downloadTask = tasks.first;
      final fileName = downloadTask.filename;
      // 执行后续操作
      print('通过数据库查询到文件名:$fileName');
    }
  }
}

方法B:使用loadTasksWithRawQuery执行SQL查询

如果需要更灵活的查询逻辑,可以直接写SQL语句:

static void callback(String taskId, DownloadTaskStatus status, int progress) async {
  if (status == DownloadTaskStatus.complete) {
    final tasks = await FlutterDownloader.loadTasksWithRawQuery(
      query: 'SELECT filename FROM task WHERE task_id = ?',
      parameters: [taskId],
    );
    if (tasks != null && tasks.isNotEmpty) {
      final fileName = tasks.first.filename;
      // 执行你的自定义操作
    }
  }
}

小提醒

  • 方案一虽然简单,但如果APP重启后,之前存储的映射表会清空,这时候如果还有未完成的任务,回调里就拿不到文件名了。这种场景下建议用方案二。
  • 确保你的FlutterDownloader是最新版本,旧版本可能存在API参数不一致的问题。

内容的提问来源于stack exchange,提问作者Shiv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:07:52