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

FlutterDownloader安卓端无法重新下载已删除的同名文件

FlutterDownloader安卓端删除同名文件后重下失败问题解决

问题详情

使用FlutterDownloader下载文件的代码:

await FlutterDownloader.enqueue(
          url: Uri.parse(url).toString(),
          savedDir: fullPath,
          fileName: actualFileName,
          showNotification: true,
          openFileFromNotification: true,
          saveInPublicStorage: true);

安卓设备上,手动删除已下载的文件后,再次下载同名文件必然失败,iOS端无此问题。

复现步骤

  • 调用FlutterDownloader.enqueue()下载目标文件
  • 打开系统文件管理器,删除该文件
  • 再次调用FlutterDownloader.enqueue()下载同名文件

错误日志

D/DownloadWorker(12373): Update notification: {notificationId: 8, title: GOA-1924573-2180476 (2).pdf, status: FAILED, progress: -1}
W/System.err(12373): java.lang.NullPointerException
W/System.err(12373): at vn.hunghd.flutterdownloader.DownloadWorker.downloadFile(DownloadWorker.kt:385)
W/System.err(12373): at vn.hunghd.flutterdownloader.DownloadWorker.doWork(DownloadWorker.kt:206)
W/System.err(12373): at androidx.work.Worker$1.run(Worker.java:86)
W/System.err(12373): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err(12373): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err(12373): at java.lang.Thread.run(Thread.java:919)
I/WM-WorkerWrapper(12373): Worker result FAILURE for Work [ id=4ef9a1d3-ff16-467f-b797-5fb7d3a981b5, tags={ flutter_download_task, vn.hunghd.flutterdownloader.DownloadWorker } ]

解决方案

1. 清理旧任务记录再下载

安卓端FlutterDownloader会保留已完成任务的本地记录,手动删除文件后这些记录未同步清除,导致重下时触发空指针异常。下载前先查询并删除同名文件的旧任务:

// 查询已完成的同名文件任务
final oldTasks = await FlutterDownloader.loadTasksWithRawQuery(
  query: "SELECT * FROM task WHERE status=3 AND file_name='$actualFileName' AND saved_dir='$fullPath'"
);

// 删除旧任务记录
for (final task in oldTasks) {
  await FlutterDownloader.remove(taskId: task.taskId, shouldDeleteContent: false);
}

// 执行下载
await FlutterDownloader.enqueue(
  url: Uri.parse(url).toString(),
  savedDir: fullPath,
  fileName: actualFileName,
  showNotification: true,
  openFileFromNotification: true,
  saveInPublicStorage: true
);

2. 提前创建空文件

手动删除文件后,FlutterDownloader可能无法正确初始化文件句柄,提前创建空文件可规避空指针问题:

final targetFile = File('$fullPath/$actualFileName');
if (!await targetFile.exists()) {
  await targetFile.create(recursive: true);
}

// 执行下载
await FlutterDownloader.enqueue(...);

3. 更新至最新版本

旧版FlutterDownloader存在该已知bug,更新到最新稳定版大概率已修复此问题:

dependencies:
  flutter_downloader: ^latest_version

4. 调整存储路径权限

若使用公共存储路径,安卓的文件访问限制可能导致文件删除后仍有残留引用,可尝试切换到应用私有存储路径,或检查并配置好文件访问权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:57:30