用到的插件:
# 下载插件
flutter_downloader: ^1.5.2
# 存储权限
permission_handler: ^6.0.1+1
# 获取存储路径
path_provider: ^2.0.1
# 打开app 网页 打电话等
url_launcher: ^6.0.2
# 打开安装包
open_file: ^3.1.0
遇到的错误:
1、FlutterDownloader.initialize() must be called first
解决:要在程序开始的时候调用FlutterDownloader.initialize
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await FlutterDownloader.initialize(
//表示是否在控制台显示调试信息
debug: true,
);
runApp(MyApp());
}
2、下载完成后完成状态马上状态又变成了失败状态
解决:重新看看文档,按文档写的配置,
3、安卓的下载通知是英文
解决:
主要的方法:
1、注册后台隔离并监听下载过程
bindBackgroundIsolate(DownloadCallback callback) {
ReceivePort _port = ReceivePort();
bool isSuccess =
IsolateNameServer.registerPortWithName(_port.sendPort, port);
if (!isSuccess) {
unbindBackgroundIsolate();
bindBackgroundIsolate(callback);
return;
}
_port.listen((dynamic data) {
// print('下载中心监听 UI Isolate Callback: $data');
callback(data[0], data[1], data[2]);
});
FlutterDownloader.registerCallback(downloadCallback);
}
///下载回调
///
///你的UI在主隔离中呈现,而下载事件来自于后台隔离(换句话说,回调代码在后台隔离中运行),所以你必须处理两个隔离之间的通信
static downloadCallback(String id, DownloadTaskStatus status, int progress) {
final SendPort send = IsolateNameServer.lookupPortByName(port);
send.send([id, status, progress]);
}
2、移除后台隔离
unbindBackgroundIsolate() {
IsolateNameServer.removePortNameMapping(port);
}
3、开始下载
Future startDownload(String link) async {
bool isStorage = await checkPermissionStorage();
if (!isStorage) {
debugPrint('没有存储权限');
return;
}
final tasks = await FlutterDownloader.loadTasks();
if (tasks != null && tasks.length > 0) {
bool hasExisted =
tasks.any((DownloadTask downloadTask) => downloadTask.url == link);
if (hasExisted) {
debugPrint('已经存在');
return;
}
}
await FlutterDownloader.enqueue(
url: link,
savedDir: await findLocalPath(),
showNotification: true,
openFileFromNotification: true,
);
}
4、暂停
Future pauseDownload(String taskId) async {
await FlutterDownloader.pause(taskId: taskId);
}
5、继续下载
Future<String> resumeDownload(String taskId) async {
return await FlutterDownloader.resume(taskId: taskId);
}
6、重新下载
Future<String> retryDownload(String taskId) async {
return await FlutterDownloader.retry(taskId: taskId);
}
注:继续和重新下载会返回一个新的taskId,对应于为继续下载过程而创建的新的后台任务。您应该用这个新的taskId替换原来的taskId(标记为暂停状态),以继续跟踪下载进度
7、删除任务
Future deleteDownload(String taskId) async {
//shouldDeleteContent: true 下载的文件将被删除 默认值为 false
await FlutterDownloader.remove(taskId: taskId, shouldDeleteContent: true);
}
8、获取所有任务
Future<List<DownloadTask>> getAllLoadTasks() async {
return await FlutterDownloader.loadTasks();
}
9、检查是否有存储权限
Future<bool> checkPermissionStorage() async {
var status = await Permission.storage.status;
if (!status.isGranted) {
status = await Permission.storage.request();
if (status.isGranted) {
return true;
}
} else {
return true;
}
return false;
}
10、获取存储路径
Future<String> findLocalPath() async {
final directory = Platform.isAndroid
? await getExternalStorageDirectory()
: await getApplicationSupportDirectory();
String localPath = directory.path + '/Download';
final savedDir = Directory(localPath);
bool hasExisted = await savedDir.exists();
if (!hasExisted) {
savedDir.create();
}
return localPath;
}
11、打开app
Future _openApp(DownloadModel downloadModel) async {
if (await canLaunch(downloadModel.packageName)) {
await launch(downloadModel.packageName);
} else {
await _openApk(downloadModel);
}
}
12、安装包
Future _openApk(DownloadModel downloadModel) async {
String path = downloadModel.savedDir + '/' + downloadModel.filename;
await OpenFile.open(path);
}