在某些时候可能需要下载或保存文件到手机本地,这时候使用文件读写接口可以实现。
在 Flutter 里实现文件读写,需要使用 path_provider
和 dart 的 io 模块。path_provider 负责查找 iOS/Android 的目录文件,IO 模块负责对文件进行读写。
首先安装依赖:
dependencies:
path_provider: ^0.4.1
通常来说会有以下几个步骤:
- 找到正确的本地路径。
- 创建对文件位置的引用。
- 将数据写入文件。
- 从文件中读取数据。
本地路径
path_provider
插件提供了一种平台不可知的方式来访问设备文件系统上的常用位置。 该插件当前支持访问两个系统文件位置:
- 临时目录: 一个临时目录(缓存),系统可以随时清除。 在 iOS 上,这对应于 NSTemporaryDirectory() 返回的值。 在 Android 上,这是 getCacheDir() 回的值。
- 文档目录:应用程序的目录,用于存储只有它可以访问的文件。 只有当应用程序被删除时,系统才会清除目录。 在 iOS 上,这对应于 NSDocumentDirectory。 在 Android 上这是 AppData 目录。
接下来使用 path_provider 查找本地路径。
import 'package:path_provider/path_provider.dart';
localPath() async {
try {
var tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;
var appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;
print('临时目录: ' + tempPath);
print('文档目录: ' + appDocPath);
}
catch(err) {
print(err);
}
}
// 临时目录: /data/user/0/com.example.myapp/cache
// 文档目录: /data/user/0/com.example.myapp/app_flutter
文件位置引用
一旦我们知道在哪里存储文件,我们需要创建一个文件的完整位置的引用。 我们可以使用 dart:io 库中的 File 类来实现此目的。
localFile(path) async {
return new File('$path/counter.json');
}
读写文件
在对文件引用之后,就可以对文件进行读写操作了。
// 读取 json 数据
readJSON() async {
try {
final file = await localFile(await localPath());
String str = await file.readAsString();
return json.decode(str);
}
catch (err) {
print(err);
}
}
// 写入 json 数据
writeJSON(obj) {
try {
final file = await localFile(await localPath());
return file.writeAsString(encode(obj));
}
catch (err) {
print(err);
}
}