Android 上的 Flutter path_provider 错误,而 iOS 上运行完美

Flutter path_provider error on Android, while on iOS works perfectly

我在我的 Flutter 应用程序中使用 [flutter_pdfview][1] 包,以显示从互联网下载的 PDF 文件。我使用 path_provider 包下载文件并将其存储在设备中。

当 运行 在 iOS 上运行应用程序时,这两个包都工作得很好,但是当我 运行 它在 Android 上时(在 Android 模拟器中VSCode) path_provider 似乎无法加载文件。

在控制台中我收到此错误消息:

[onError, {error: java.io.FileNotFoundException: No content provider: thisIsMyFilePath}]

我正在这样下载和保存文件:

Future<File> getFileFromUrl(String url, {name}) async {
    var fileName;

    if (name != null) {
      fileName = name;
    }

    try {
      var data = await http.get(url);
      var bytes = data.bodyBytes;
      var dir = await getApplicationDocumentsDirectory();
      File file = File("${dir.path}/" + fileName + ".pdf");
      print(dir.path);
      File urlFile = await file.writeAsBytes(bytes);
      return urlFile;
    } catch (e) {
      throw Exception("Error opening url file");
    }
}

有人知道这里的 Android-only 错误是什么吗?也许我需要在我不知道的清单中添加一些东西?

非常感谢! [1]: https://pub.dev/packages/flutter_pdfview

编辑:Alberto Miola 回答

var data = await http.get(url);
      var bytes = data.bodyBytes;
      var dir = await getApplicationDocumentsDirectory();
      final name = p.join(dir.path, fileName + ".pdf");//From Alberto Miola's answer
      File file = File(name);
      print(dir.path);
      File urlFile = await file.writeAsBytes(bytes);
      return urlFile;
    } catch (e) {
      throw Exception("Error opening url file");

使用文件系统时,安全的跨平台解决方案涉及使用 path_provider(如您所用)和 path.

import 'package:path/path.dart' as p;

导入后,您可以使用连接安全地“链接”路径,这样您的代码将变为:

final name = p.join(dir.path, filename + ".pdf");
final file = File(name);

基本上 join 决定如何正确创建底层文件的路径 OS,您应该依赖它而不是手动编写斜线。另外,请确保您拥有清单文件的写入和读取权限。

我发现了这个错误。问题是文件名是用非英文字母写的。似乎该包在 Android 上读取纯英文字符。我已将其更改为静态字符串,它似乎工作正常