You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:45:19