我在我的 Flutter 应用程序中使用 [flutter_pdfview
][1] 包,以显示从互联网下载的 PDF 文件。我使用 path_provider
包下载文件并将其存储在设备中。
在 iOS 上运行应用程序时,这两个包都工作得很好,但是当我在 Android 上运行它时(在 VSCode 中的 Android 模拟器中),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 错误是什么?也许我需要向 list 中添加一些我不知道的东西?
非常感谢! [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;
导入后,您可以使用 join 安全地“链接”路径,这样您的代码将变为:
final name = p.join(dir.path, filename + ".pdf");
final file = File(name);
基本上 join
决定了如何在底层操作系统上正确创建文件路径,您应该依赖它而不是手动编写斜线。此外,请确保您拥有 list 文件的写入和读取权限。
关于java - Android 上的 Flutter path_provider 错误,而在 iOS 上运行完美,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62502472/