使用 Flutter Downloader 插件,下载应用程序关闭后

Har*_*eja 5 download-manager android-download-manager flutter flutter-dependencies flutter-packages

**我使用 Flutter Downloader Package 完成下载一些文件后,我的应用程序自动关闭并断开与 android studio 的连接。任何人都可以帮助我找到解决方案。

    final status = await Permission.storage.request();
            if (status.isGranted) {
              await downloadPDF();
            } 

downloadPDF() async {
    final externalDir = await getExternalStorageDirectory();
    taskId = await FlutterDownloader.enqueue(
      url: pdfURL,
      savedDir: externalDir.path,
      fileName: "Flamingo Order Details",
      showNotification: true,
      openFileFromNotification: true,
    );
  }
Run Code Online (Sandbox Code Playgroud)

这是我的控制台错误:

    final status = await Permission.storage.request();
            if (status.isGranted) {
              await downloadPDF();
            } 

downloadPDF() async {
    final externalDir = await getExternalStorageDirectory();
    taskId = await FlutterDownloader.enqueue(
      url: pdfURL,
      savedDir: externalDir.path,
      fileName: "Flamingo Order Details",
      showNotification: true,
      openFileFromNotification: true,
    );
  }
Run Code Online (Sandbox Code Playgroud)

Del*_*ain 5

也许晚了,但它可能会帮助其他人。最近我遇到了这个错误并解决了它。您的 UI 正在主隔离中呈现,而您的下载事件来自后台隔离。因为回调中的代码是在后台隔离运行的,所以你必须处理两个隔离之间的通信。通常,需要进行通信以在主 UI 中显示下载进度。实现以下代码来处理通信:

import 'dart:isolate';
import 'dart:ui'; // You need to import these 2 libraries besides another libraries to work with this code

ReceivePort _port = ReceivePort();

@override
  void initState() {
    super.initState();

    IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port');
    _port.listen((dynamic data) {
      String id = data[0];
      DownloadTaskStatus status = data[1];
      int progress = data[2];
      setState((){ });
    });

    FlutterDownloader.registerCallback(downloadCallback);
  }

@override
  void dispose() {
    IsolateNameServer.removePortNameMapping('downloader_send_port');
    super.dispose();
  }

  static void downloadCallback(String id, DownloadTaskStatus status, int progress) {
    final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port')!;
    send.send([id, status, progress]);
  }


void _download(String url) async {
    final status = await Permission.storage.request();

    if(status.isGranted) {
      final externalDir = await getExternalStorageDirectory();

      final id = await FlutterDownloader.enqueue(
          url: url,
          savedDir: externalDir!.path,
        showNotification: true,
        openFileFromNotification: true,
      );
    } else {
      print('Permission Denied');
    }
  }
Run Code Online (Sandbox Code Playgroud)

在您的按钮中调用 _download(url) 函数,您就可以开始了。

注意:我在我的应用程序中使用了声音空安全,因此我在这行代码中使用了空感知运算符:

final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port')!;
Run Code Online (Sandbox Code Playgroud)