Flutter 在本机应用程序中打开本地资源(PDF)

2023-12-07

我正在尝试将我的应用程序与 PDF 捆绑在一起,并让用户在本机查看器中打开它。

我努力了:

  • 将 PDF 的数据复制到“临时目录”或“文档目录”(来自 path_provider)并从那里打开
  • 要打开,我使用“url_launcher”打开文件。我尝试过使用这两个文件://...urls 并仅传递本地路径即/.../ etc

这些文件肯定存在,这似乎是一个权限问题,两个平台上两个位置的文件都位于应用程序的沙箱中。

该文件确实存在,并且我可以从 Web URL 打开 PDF。

这是 flutter 可以做的事情吗?


2019 年 12 月 8 日更新

我刚刚收到通知,这个问题有很多观点,但没有好的答案。对于这个项目,我最终尝试了 Cordova、Flutter、React Native,并最终放弃并创建了两个本机应用程序来完成我需要做的事情。他们工作正常,但客户想要进行一系列用户体验更改。

所以最后我将本机方面的代码包装到一个 flutter 插件中,然后在 flutter 中进行 UX。这就是背景故事,这是我一起编写的技术规格:

对于 iOS,github 上有一个在 iOS 11 中使用他们的 PDF 工具包的示例,我在那里做了一些工作,并且存储库中有一堆手动创建的功能,所以我将我想要的 PDF 附加到该项目中,并编写了一个脚本展示它们,然后使用颤振桥发射。

对于 Android,情况大致相同 - 我将文件从应用程序包(不是 flutter 资产)复制到临时目录,然后创建共享链接并使用本机系统查看器启动 pdf。

总而言之,这是一个巨大的东西,但这不是 Flutter 的错,就像我说的,我使用了一堆多平台框架,但没有一个能够以令人满意的方式完成这项工作。我相信更好的开发人员可以想出一个可行的解决方案。

编辑:有人提到要使用 url_launcher 和 open_file 的组合。它们非常适合外部文件,但不适用于捆绑资源。


我不太确定这对您来说是否仍然是一个问题。但由于我想知道同样的事情,所以我试图弄清楚。这是我的结果,但我必须提到,我将文件存储在下载文件夹中:

  1. install 网址启动器 and 简单权限
  2. 将以下行添加到 AndroidManifest.xml 和相应的 iOS 等效项中:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  3. 创建pdf的代码:

    SimplePermissions.requestPermission(Permission.WriteExternalStorage);
    String dir = (await getExternalStorageDirectory()).path + "/download";
    String filename = "$dir/" + title;
    File f = new File(filename);
    f.writeAsBytesSync(data);
    
  4. 打开文件的代码

    var url = 'file://' + f.path;
    if (await canLaunch(url)) {
     await launch(url, forceSafariVC: false, forceWebView: false);
    } else {
      throw 'Could not launch $url';
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter 在本机应用程序中打开本地资源(PDF) 的相关文章

随机推荐