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);
  }

 

flutter_downloader是一个用于在Flutter应用程序中进行文件下载的插件。它提供了一种简单而强大的方式来管理和监控文件下载任务。 使用flutter_downloader,你可以轻松地添加文件下载功能到你的Flutter应用程序中。它支持多个平台,包括Android和iOS,并且提供了一组易于使用的API来管理下载任务。 要使用flutter_downloader,首先需要在你的Flutter项目中添加依赖。在pubspec.yaml文件中,添加以下内容: ``` dependencies: flutter_downloader: ^1.6.0 ``` 然后运行`flutter pub get`命令来获取依赖。 接下来,在你的代码中导入flutter_downloader包,并使用它来创建和管理下载任务。你可以使用`FlutterDownloader.enqueue`方法来创建一个下载任务,并传递下载链接、保存路径等参数。你还可以使用`FlutterDownloader.open`方法来打开已下载的文件。 以下是一个简单的示例代码,演示了如何使用flutter_downloader进行文件下载: ```dart import 'package:flutter/material.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('File Downloader'), ), body: Center( child: RaisedButton( child: Text('Download File'), onPressed: () { _startDownload(); }, ), ), ), ); } void _startDownload() async { String url = 'https://example.com/file.pdf'; String savedDir = '/storage/emulated/0/Download'; await FlutterDownloader.enqueue( url: url, savedDir: savedDir, showNotification: true, openFileFromNotification: true, ); } } ``` 这是一个简单的示例,当用户点击按钮时,会触发文件下载任务。下载的文件将保存在指定的目录中,并且会显示下载通知。用户可以通过通知来打开已下载的文件。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值