flutter_downloader的一些问题
flutter_downloader插件的问题
flutter_downloader插件的下载地址
flutter_downloader的open方法不能再下载完成后打开
解决方法:由于下载太快,某些通知没有完成,所以实际上并没完成收尾工作,所以打不开。只需要Sleep 1s就可以了
这是监听的代码
void initState() {
super.initState();
IsolateNameServer.registerPortWithName(
_port.sendPort, 'downloader_send_port');
_port.listen((dynamic data) async {
DownloadTaskStatus status = data[1];
if (status == DownloadTaskStatus.complete) {
//程序休眠1s,保证下载事项处理完成
sleep(Duration(seconds: 1));
await PermissionUtil.getPermission(Permission.storage);
Fluttertoast.showToast(msg: '下载成功,保存在${await Paths.downloadPath()}');
FlutterDownloader.open(taskId: data[0]);
} else if (status == DownloadTaskStatus.failed) {
Fluttertoast.showToast(msg: '下载失败');
}
});
}
这是回调,记住一定要是静态函数
static void downloadCallback(
String id, DownloadTaskStatus status, int progress) {
final SendPort send =
IsolateNameServer.lookupPortByName('downloader_send_port');
send.send([id, status, progress]);
}
别忘了释放
@override
void dispose() {
super.dispose();
IsolateNameServer.removePortNameMapping('downloader_send_port');
}
flutter_downloader下载完成之后默认打开的应用选择不正确
这个问题困扰了我一段时间,我以为flutter_downloader是通过打表来做到解析用什么应用来打开的,但是查看源码发现不是。
通过源码TaskDao类,可以看到这个mimetype是从数据库取得的
而数据库内容则是在TaskDao类的updateTask方法中存入的
追踪下去,发现调用updateTask的时候的传参是contentType
而contentType的来源是通过http请求的回复确定的
所以只需要后端把content-Type的值改成所需要打开的内容的值就可以了
附录
下面列出几种常用的content-type
种类 | 后缀 | content-type |
---|---|---|
word文档 | doc/docx | application/msword |
excel文档 | xls/xlsx | application/vnd.ms-excel |
ppt演示文稿 | ppt/pptx | application/vnd.ms-powerpoint |
压缩文件 | zip/rar/gzip | application/x-gzip |
安装包 | apk | application/vnd.android.package-archive |
图片 | png/jpg/jpeg/gif/… | image/* |
视频 | mp4/rmvb/… | video/* |
文本 | txt/… | text/plain |
文本 | chm | application/x-chm |