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 上读取纯英文字符。我已将其更改为静态字符串,它似乎工作正常
我在我的 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 上读取纯英文字符。我已将其更改为静态字符串,它似乎工作正常