Необработанное исключение: setState () вызывается после dispose () после обратного нажатия при загрузке файла в флаттере - PullRequest
0 голосов
/ 29 января 2020

Я использую плагин dio для загрузки файла во флаттере и показываю ход загрузки в виджетах, в то время как выполняю обратную загрузку с текущего экрана загрузки, получая ниже исключения

Unhandled Exception: setState() called after dispose(): _FileDownloadCardState#537ff(lifecycle state: defunct, not mounted)

Это мой код с некоторым файлом проверка

Future<void> downloadFile(OfflineMapFile offlineMapFile) async {
    if(offlineMapFile.isDownloading) {
      return;
    }
    Directory fileDir;
    try {
      offlineMapFile.isDownloading = true;
      Dio dio = Dio();
      Directory dir = await UAAppContext.getInstance().appDir;
      //todo: need to test on ios
      fileDir = await new Directory(dir.path + offlineMapFile.fileStoragePath).create();
      await dio.download(
          offlineMapFile.fileUrl, "${fileDir.path}/${offlineMapFile.fileName}",
          onReceiveProgress: (received, total) {
            if (total != -1) {
              print("Rec: $received , Total: $total");
              debugPrint("Directory path : " +
                  offlineMapFile.fileStoragePath +
                  "/" +
                  offlineMapFile.fileName);
              setState(() {
                offlineMapFile.isDownloading = true;
                offlineMapFile.isDownloaded = false;
                downloadProgressString = ((received / total) * 100).toStringAsFixed(0) + "%";
              });
            }
          });
    } catch (e) {
      print(e);
      setState(() {
        offlineMapFile.isDownloading = false;
        offlineMapFile.isDownloaded = false;});

    } finally {
      // TODO Check whether the files are downloaded or not! Validation
      // And set state accordingly.
      setState(() {
        //TODO change boolean as per the file Validation
        offlineMapFile.isDownloading = false;
        offlineMapFile.isDownloaded = true;
        downloadProgressString = "Completed";

        if(offlineMapFile.fileName.contains(".zip") && fileDir != null){
          CommonUtils.unzipFile(fileDir.path +"/"+ offlineMapFile.fileName, fileDir.path + "/Offline/");
        }

      });
      print("Download completed");
    }
  }

1 Ответ

1 голос
/ 29 января 2020

Вы вызываете setState на неустановленном виджете, для решения этого вам просто нужно добавить это условие

if(mounted) {
  setState(//....
}
...