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

Posted

技术标签:

【中文标题】使用 Flutter Downloader 插件,下载应用关闭后【英文标题】:Using Flutter Downloader plugin, after download app closes 【发布时间】:2021-07-17 14:42:56 【问题描述】:

**我使用 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,
    );
  

这是我的控制台错误:

I/flutter (15913): Fatal: could not find callback
F/libc    (15913): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 15956 (1.raster), pid 15913 (le.order_system)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'motorola/chef/chef_sprout:10/QPTS30.61-18-16-8/03acd:user/release-keys'
Revision: 'pvt'
ABI: 'arm64'
Timestamp: 2021-04-23 16:39:38+0530
pid: 15913, tid: 15956, name: 1.raster  >>> com.example.order_system <<<
uid: 10870
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
Cause: null pointer dereference
    x0  000000741e5a6478  x1  00000074841cfa00  x2  0000000000000001  x3  0000000000000000
    x4  0000000000000000  x5  00000000ffffffff  x6  00000000ffffffff  x7  0000000b96c6a75c
    x8  0000000080000081  x9  658adf78f7e836ee  x10 0000000000000000  x11 0000000000000000
    x12 0000000000000001  x13 000000747b19fe80  x14 0000007489a0a280  x15 0000000000000000
    x16 000000747b19b050  x17 0000007515c9787c  x18 000000741d05e000  x19 000000741e5a6478
    x20 00000074841cfa00  x21 0000000000000001  x22 0000000000000000  x23 00000074843db380
    x24 000000741e5a7020  x25 000000741e5a7020  x26 0000000000000000  x27 0000000000000001
    x28 0000000000000043  x29 000000741e5a6450
    sp  000000741e5a6420  lr  000000747b013f84  pc  000000747b01c378
backtrace:
      #00 pc 00000000001d8378  /vendor/lib64/egl/libGLESv2_adreno.so (BuildId: 22cc95e0051ae85072c405eeeeeb312d)
      #01 pc 00000000001cff80  /vendor/lib64/egl/libGLESv2_adreno.so (BuildId: 22cc95e0051ae85072c405eeeeeb312d)
      #02 pc 00000000000207b0  /system/lib64/libEGL.so (android::eglSwapBuffersWithDamageKHRImpl(void*, void*, int*, int)+316) (BuildId: 248ba7f2d80e7bb9952a20e1c3493c86)
      #03 pc 000000000001d0a8  /system/lib64/libEGL.so (eglSwapBuffers+80) (BuildId: 248ba7f2d80e7bb9952a20e1c3493c86)
      #04 pc 00000000012ec528  /data/app/com.example.order_system-8XYsushVsEZPOltQ3k8npA==/lib/arm64/libflutter.so (BuildId: e14966237eb013b063fed6484195268f7398b594)
Lost connection to device.

【问题讨论】:

你在使用任何api吗? 是的,但是我认为它不影响因为文件下载成功然后关闭应用程序。 我认为您已经更改了堆栈跟踪。之前的错误是由于糟糕的 api 造成的。你现在拥有的是Fatal signal 11 (SIGSEGV)。当应用程序访问其地址空间之外的内存时,就会发生这种情况。请查看***.com/questions/17840521/… 了解更多信息。 【参考方案1】:

也许已经晚了,但它可能会帮助其他人。最近我遇到了这个错误,我解决了它。您的 UI 在 Main 隔离中呈现,您的下载事件来自后台隔离。因为回调中的代码是在后台isolate运行的,所以你必须处理两个isolate之间的通信。通常,需要进行通信以在主 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');
    
  

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

注意:我在我的应用程序中使用了可靠的 null 安全性,因此我在这行代码中使用了 null 感知运算符:

final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port')!;

【讨论】:

以上是关于使用 Flutter Downloader 插件,下载应用关闭后的主要内容,如果未能解决你的问题,请参考以下文章

修改Flutter app图标

Flutetr flutter_downloader 1.3.1

如何使用cordova插件中downloader

下载开始后立即在 Android 上出现 Flutter_downloader HardCrash

nativescript:如何在使用Downloader插件时添加扩展名

谷歌插件Image downloader开发之popup