当前位置: 首页 > 知识库问答 >
问题:

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

景轶
2023-03-14

**我使用Flutter下载器包在完成下载一些文件后,我的应用程序会自动关闭并断开与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.

共有1个答案

应煌
2023-03-14

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

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

final 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)函数,即可开始使用。

名词(noun的缩写)b:我在我的应用程序中使用了健全的空安全,因此我在这行代码中使用了空感知运算符:

final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port')!;
 类似资料:
  • 我已经创建了一个webview,并向其中添加了下载监听器。当我在应用程序中下载文件时,它将文件存储在应用程序包中,而不是公共下载文件夹中。

  • 我将google play游戏添加到我的游戏中,这个游戏已经在谷歌PlayStore上发布了。然后我的一些更新应用程序的用户向我发送了应用程序崩溃的反馈。 我向用户发送了相同的apk,应用程序运行正常。从谷歌playstore下载应用程序时崩溃。 此外,我使用谷歌应用程序签名,所以我有2 finderprint和我添加两个指纹到控制台。 我想再说一次,我的应用程序只对一些用户关闭从谷歌游戏商店下载

  • 需要通过应用程序从web服务器下载文件,但该文件没有加载,下面是我使用的代码: 在清单中,我有以下权限:

  • 我在我的Android应用程序中使用滑翔进行图像加载,以避免任何崩溃,我正在加载带有应用程序上下文的图像。这会对应用程序和内存的性能产生什么影响?

  • 问题内容: 我正在尝试使用asyncTask下载文件,但无法正常工作,没有错误消息或什么都没有,只是不下载文件…我尝试了所有操作,但似乎并没有输入…任何人都知道可以是问题吗?我在手机上测试过,网址也可以。 问题答案: 我只运行了您的代码,它对我来说很好用。该图像已下载到sdcard。 请注意,请确保在AndroidManifest.xml中设置了以下权限: 这是我得到的日志(请注意,我添加了):

  • 问题内容: 我编写了一些代码来下载我所做的网络广播的一集。它获取剧集的URL,并获取保存它的位置。但是,它最多只能下载16MB,然后自动取消。我不完全确定要增加此值需要更改什么值。是否可以,有人可以指出正确的方向吗?谢谢! 下载代码: 问题答案: 快速查看transferFrom的文档: 好。 计数的值1 << 24(来自原始问题)等于16M 我想这就是您的问题的答案:-)