Flutter Downloader:如何通过task_id获取任务详情(文件名)并在下载完成后执行指定操作
解决FlutterDownloader回调中通过taskId获取文件名的问题
我来给你两个实用的解决方案,帮你搞定这个问题:
方案一:入队时关联taskId和文件名(最简单高效)
既然你在入队的时候已经明确知道文件名,直接把taskId和文件名存在一个映射表里就可以了,回调里拿到taskId就能直接取到文件名,完全不用查询数据库,效率拉满。
代码示例:
- 先定义一个存储映射的变量(可以是全局变量,也可以放在你的下载管理类中):
final Map<String, String> _taskIdToFileName = {};
- 入队下载任务时,把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; }
- 在回调函数中获取文件名并执行后续操作:
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
相关产品推荐
相关产品推荐

