flutter文件下载、安装包flutter_downloader填的坑

用到的插件:

  # 下载插件
  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);
  }

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值