You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter APK打包后使用flutter_pdfview加载PDF完成时崩溃求助

解决flutter_pdfview打包release APK后PDF下载完成崩溃的问题

我之前也碰到过几乎一模一样的情况——调试模式下只弹出资源释放的警告但应用正常跑,release包却直接崩溃。结合你的代码来看,大概率是文件操作不完整或者资源未正确释放导致的,给你几个针对性的解决方案:

1. 修复文件写入的异步漏洞

你的代码里file.writeAsBytes(value)没加await,这会导致文件还没完全写入磁盘,就把路径传给了PDFView。调试模式下代码执行速度慢,可能刚好赶得上文件写完,但release模式下编译器做了优化,执行更快,PDFView读取不完整的文件直接就崩了。

修改这部分代码:

await FirebaseStorage()
    .ref()
    .child(widget.name)
    .getData(50000000)
    .then((value) async {
  // 加上await确保文件写入完成再返回路径
  await file.writeAsBytes(value);
}).catchError((onError) {
  Fluttertoast.showToast(msg: onError.toString());
});

2. 替换getDatagetFile,避免内存过载

getData是一次性把整个PDF加载到内存里,对于接近50MB的文件来说,release模式下内存管理更严格,容易触发OOM或者资源释放异常。改用getFile直接下载到本地文件,稳定性会高很多:

重写loaddata方法:

Future<String> loaddata() async {
  var dir = await getTemporaryDirectory();
  File file = File('${dir.path}/${widget.name}');
  
  // 提前判断文件是否存在,避免重复下载
  if (await file.exists()) {
    return file.path;
  }

  try {
    // 用writeToFile直接把文件下载到目标路径
    await FirebaseStorage.instance
        .ref()
        .child(widget.name)
        .writeToFile(file);
  } catch (onError) {
    Fluttertoast.showToast(msg: onError.toString());
    return ''; // 下载失败返回空路径,后续可以做错误处理
  }
  return file.path;
}

3. 手动释放PDFView资源

调试模式下Flutter会帮我们兜底一些资源回收,但release模式下必须手动确保PDFView的资源被释放。你可以添加一个控制器实例,在页面销毁时调用dispose:

_PdfViewerPageState里添加变量:

PDFViewController? _pdfViewController;

然后在PDFView的回调里赋值:

PDFView(
  filePath: localfile,
  fitEachPage: true,
  onViewCreated: (controller) {
    _pdfViewController = controller;
  },
  onPageChanged: (t, c) {
    setState(() {
      current = t + 1;
      total = c;
    });
  },
)

最后重写dispose方法:

@override
void dispose() {
  _pdfViewController?.dispose();
  super.dispose();
}

4. 更新flutter_pdfview到最新稳定版

有些旧版本的flutter_pdfview在release模式下有已知的资源泄漏bug,你可以在pubspec.yaml里更新到当前最新稳定版:

flutter_pdfview: ^1.3.2 # 替换为你查看到的最新稳定版本号

验证步骤

做完以上修改后,先在调试模式下确认PDF加载正常,然后用flutter build apk --release打包测试,应该就能解决崩溃问题了。

内容的提问来源于stack exchange,提问作者Deepak sharma

火山引擎 最新活动