flutter_downloader下載完成后獲取下載任務(wù)失敗問題

flutter_downloader 我們用來下載照片,需求是下載后要保存到相冊 在下載進度回調(diào)中需要獲取相關(guān)的任務(wù) 拿到下載圖片的路徑,即可保存資源到相冊
問題代碼:


initDownLoad() async {
    if (!FlutterDownloader.initialized) {
      await FlutterDownloader.initialize(
          debug: BaseConfig.isDebug, ignoreSsl: true);
    }

    if (!_isInitialized) {
      await FlutterDownloader.registerCallback(downloadCallback);
    }
    _isInitialized = true;
  }
@pragma('vm:entry-point')
  static void downloadCallback(
      String id, DownloadTaskStatus status, int progress) async {
if (status.value == DownloadTaskStatus.complete.value &&
            progress == 100) {
    final list = await FlutterDownloader.loadTasksWithRawQuery(
          query: 'SELECT * FROM task WHERE task_id = \"$id\"');
      if (list != null && list.isNotEmpty) {
        return list.first.savedDir + '/' + (list.first.filename ?? '');
      }
}
  }

下載完成后 使用FlutterDownloader.loadTasksWithRawQuery獲取相應(yīng)的下載任務(wù),來獲取下載資源路徑,但是明明已經(jīng)初始化了下載器,但是調(diào)用該方法會觸發(fā)assert(_initialized, 'plugin flutter_downloader is not initialized');
在該回調(diào)方法外部調(diào)用FlutterDownloader.loadTasksWithRawQuery就么有該問題,沒找到具體的原因

解決:
看插件介紹是在回調(diào)方法中使用IsolateNameServer,同步下載進度,進行更改,代碼為

@pragma('vm:entry-point')
  static void downloadCallback(
      String id, DownloadTaskStatus status, int progress) async {
    final SendPort? send =
        IsolateNameServer.lookupPortByName('downloader_send_port');
    send?.send([id, status.value, progress]);
  }

  initDownLoad() async {
    if (!FlutterDownloader.initialized) {
      await FlutterDownloader.initialize(
          debug: BaseConfig.isDebug, ignoreSsl: true);
    }

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

        sysDownloadProgress(id, progress, status.value);
        if (status.value == DownloadTaskStatus.complete.value &&
            progress == 100) {
          print('=========status: ${status.value}');

          String path = await AlbumDownloadManager().handleOriginPath(id);
          if (path.length > 0) {
            studySaveImage(bytesList: File(path).readAsBytesSync());
          }
        }
      });

      await FlutterDownloader.registerCallback(downloadCallback);
    }
    _isInitialized = true;
  }

更改后竟可以獲取路徑了,網(wǎng)上相關(guān)的資料比較少,在這里記錄一下,有遇到相關(guān)問題的,同時找到原因的,希望不吝賜教

補充:

原因其實在callback方法的說明中已經(jīng)給出
Your UI is rendered on the main isolate, while download events come from a
background isolate (in other words, code in [callback] is run in the
background isolate), so you have to handle the communication between two
isolates.
意思是下載進度和UI刷新分屬于兩個不同的isolates,兩個isolates的內(nèi)存是不共享的,所以出現(xiàn)了開始的 在下載回調(diào)中獲取任務(wù)提示下載器沒有初始化,我們需要處理兩個isolates的通信,所以修改后問題解決,具體的可參考這兩篇文章
isolates
FlutterEngine
歡迎評論 + 私信

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容