在某些時(shí)候可能需要下載或保存文件到手機(jī)本地,這時(shí)候使用文件讀寫(xiě)接口可以實(shí)現(xiàn)。
在 Flutter 里實(shí)現(xiàn)文件讀寫(xiě),需要使用 path_provider
和 dart 的 io 模塊。path_provider 負(fù)責(zé)查找 iOS/Android 的目錄文件,IO 模塊負(fù)責(zé)對(duì)文件進(jìn)行讀寫(xiě)。
首先安裝依賴(lài):
dependencies:
path_provider: ^0.4.1
通常來(lái)說(shuō)會(huì)有以下幾個(gè)步驟:
- 找到正確的本地路徑。
- 創(chuàng)建對(duì)文件位置的引用。
- 將數(shù)據(jù)寫(xiě)入文件。
- 從文件中讀取數(shù)據(jù)。
本地路徑
path_provider
插件提供了一種平臺(tái)不可知的方式來(lái)訪(fǎng)問(wèn)設(shè)備文件系統(tǒng)上的常用位置。 該插件當(dāng)前支持訪(fǎng)問(wèn)兩個(gè)系統(tǒng)文件位置:
- 臨時(shí)目錄: 一個(gè)臨時(shí)目錄(緩存),系統(tǒng)可以隨時(shí)清除。 在 iOS 上,這對(duì)應(yīng)于 NSTemporaryDirectory() 返回的值。 在 Android 上,這是 getCacheDir() 回的值。
- 文檔目錄:應(yīng)用程序的目錄,用于存儲(chǔ)只有它可以訪(fǎng)問(wèn)的文件。 只有當(dāng)應(yīng)用程序被刪除時(shí),系統(tǒng)才會(huì)清除目錄。 在 iOS 上,這對(duì)應(yīng)于 NSDocumentDirectory。 在 Android 上這是 AppData 目錄。
接下來(lái)使用 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('臨時(shí)目錄: ' + tempPath);
print('文檔目錄: ' + appDocPath);
}
catch(err) {
print(err);
}
}
// 臨時(shí)目錄: /data/user/0/com.example.myapp/cache
// 文檔目錄: /data/user/0/com.example.myapp/app_flutter
文件位置引用
一旦我們知道在哪里存儲(chǔ)文件,我們需要?jiǎng)?chuàng)建一個(gè)文件的完整位置的引用。 我們可以使用 dart:io 庫(kù)中的 File 類(lèi)來(lái)實(shí)現(xiàn)此目的。
localFile(path) async {
return new File('$path/counter.json');
}
讀寫(xiě)文件
在對(duì)文件引用之后,就可以對(duì)文件進(jìn)行讀寫(xiě)操作了。
// 讀取 json 數(shù)據(jù)
readJSON() async {
try {
final file = await localFile(await localPath());
String str = await file.readAsString();
return json.decode(str);
}
catch (err) {
print(err);
}
}
// 寫(xiě)入 json 數(shù)據(jù)
writeJSON(obj) {
try {
final file = await localFile(await localPath());
return file.writeAsString(encode(obj));
}
catch (err) {
print(err);
}
}