使用flutter_pdfview包遇FileNotFoundException权限问题求解决方案
解决方案
方案一:直接加载Asset中的PDF(推荐,无需文件复制)
flutter_pdfview支持直接通过asset路径加载文件,无需复制到本地目录,彻底规避权限问题。修改代码如下:
// 直接使用asset路径,无需复制文件 final pdfPath = 'assets/pdf/read_book.pdf'; @override Widget build(BuildContext context) { return PDFView( filePath: pdfPath, // 可添加其他配置:enableSwipe: true, pageSnap: true等 ); }
注意:必须在pubspec.yaml中正确声明asset路径,否则无法加载:
flutter: assets: - assets/pdf/read_book.pdf
方案二:修复本地文件复制逻辑
如果业务必须复制到本地目录,完善代码逻辑确保目录存在并捕获具体异常:
var pdfPath=''; @override void initState() { super.initState(); fromAsset('assets/pdf/read_book.pdf', 'book.pdf').then((f) { setState(() { pdfPath = f.path; }); }).catchError((e) { print('文件复制失败:$e'); // 打印具体错误便于排查 }); } Future<File> fromAsset(String asset, String filename) async { try { var dir = await getApplicationDocumentsDirectory(); // 确保目录存在(系统通常已创建,此为冗余保障) await dir.create(recursive: true); File file = File("${dir.path}/$filename"); // 文件已存在时直接返回,避免重复写入 if (await file.exists()) { return file; } var data = await rootBundle.load(asset); var bytes = data.buffer.asUint8List(); await file.writeAsBytes(bytes, flush: true); return file; } catch (e) { throw Exception('文件复制错误:$e'); // 抛出具体错误信息 } }
针对Android 13+设备:应用私有目录无需额外权限,若targetSdkVersion为33及以上,检查是否错误申请了不必要的存储权限,或是否有其他安全策略影响文件写入。
内容的提问来源于stack exchange,提问作者Dilo
相关产品推荐
相关产品推荐

