调用ExtractZip解压zip报错:String类型无法赋值给Directory类型如何解决
问题原因
你定义的ExtractZip函数入参要求为Directory类型,而你调用时传入的directoryPath是字符串类型的路径,二者类型不匹配,因此触发该报错。
修复方案
1. 修改传参逻辑
修改extractZipContent函数,直接传入你已经创建完成的Directory实例,而不是字符串路径:
@override Future<bool> extractZipContent() async{ Directory root = await getTemporaryDirectory(); // 基于path_provider获取临时目录 String directoryPath = root.path + '/uth_content'; // 保存创建的Directory实例 Directory destDir = Directory(directoryPath); await destDir.create(recursive: true); // 传入Directory实例而非字符串路径 return await _externalDataSource.ExtractZip(destDir); }
2. 修复现有代码隐藏问题
你当前ExtractZip函数中使用then处理异步解压逻辑,会导致后续的文件夹存在性判断在解压未完成时就提前执行,大概率返回错误的结果,建议调整为await等待解压完成后再执行判断,同时修复异常打印的类型问题、补充缺省返回值:
@override Future<bool> ExtractZip(Directory destination) async{ checkPermission(); Directory appDir = await GetExtStoragePath(); File file = File(appDir.path +"/"+ contentsZipFile); debugPrint("Extracting zip to :" + destination.path); if(file.existsSync()){ try { // 等待解压操作完成再执行后续逻辑 await ZipFile.extractToDirectory(zipFile: file, destinationDir: destination); debugPrint("Extracting done successfully"); }catch(e){ // 异常对象需转字符串再拼接 debugPrint("Error :"+ e.toString()); } //check if exist in destination var destDir = Directory(destination.path + "/" + "uth_data"); if(destDir.existsSync()){ return true; }else{ debugPrint("Extracting done with error"); return false; } } // 补充文件不存在时的默认返回值,避免语法警告 return false; }
内容的提问来源于stack exchange,提问作者arriff
相关产品推荐
相关产品推荐

