前言
本篇將給大家分享Flutter中的file儲存功能,Flutter SDK本身已經有File相關的api,所以在Flutter中使用file儲存的關鍵是如何獲取手機中儲存的目錄,然後根據目錄路徑來建立不同的file。根據Flutter的特性,我們可以通過自定義channel來獲取平臺端的可儲存資料夾路徑給flutter端,實現起來非常簡單,且這個外掛在pub.dartlang.org上已經存在,外掛名為path_provider,下面我們就通過引入該外掛實現檔案儲存功能。
file儲存使用
引入外掛
在pubspec.yaml檔案中新增path_provider外掛,最新版本為0.4.1,如下:
dependencies:
flutter:
sdk: flutter
#path_provider外掛
path_provider: 0.4.1
複製程式碼
然後命令列執行flutter packages get
即可將外掛下載到本地。
通過檢視外掛中的path_provider.dart程式碼,我們發現它提供了三個方法:
-
getTemporaryDirectory()
獲取臨時目錄
-
getApplicationDocumentsDirectory()
獲取應用文件目錄
-
getExternalStorageDirectory()
獲取外部儲存目錄
其中getExternalStorageDirectory()方法中程式碼有平臺型別的判斷:
Future<Directory> getExternalStorageDirectory() async {
if (Platform.isIOS) //如果是iOS平臺則丟擲不支援的錯誤
throw new UnsupportedError("Functionality not available on iOS");
final String path = await _channel.invokeMethod('getStorageDirectory');
if (path == null) {
return null;
}
return new Directory(path);
}
複製程式碼
由此可以看出iOS平臺沒有外部儲存目錄的概念,所以無法獲取外部儲存目錄路徑,使用時要注意區分。
使用方法
1. 外掛引入到專案後,在使用的dart檔案中匯入path_provider.dart檔案
import 'package:path_provider/path_provider.dart';
複製程式碼
2. 獲取檔案目錄,並根據目錄建立儲存資料的檔案物件,將資料寫入檔案
// 獲取應用文件目錄並建立檔案
Directory documentsDir = await getApplicationDocumentsDirectory();
String documentsPath = documentsDir.path;
File file = new File('$documentsPath/notes');
if(!file.existsSync()) {
file.createSync();
}
writeToFile(context, file, notes);
//將資料內容寫入指定檔案中
void writeToFile(BuildContext context, File file, String notes) async {
File file1 = await file.writeAsString(notes);
if(file1.existsSync()) {
Toast.show(context, '儲存成功');
}
}
複製程式碼
- iOS模擬器中file的路徑為
/Users/.../CoreSimulator/Devices/D44E9E54-2FDD-40B2-A953-3592C1D0BFD8/data/Containers/Data/Application/28644C62-1FFA-422E-8ED6-54AA4E9CBE0C/Documents/notes
複製程式碼
- Android模擬器中file的路徑為
/data/user/0/com.example.demo/app_flutter/notes
複製程式碼
3. 讀取儲存到指定檔案中的資料
void getNotesFromCache() async {
Directory documentsDir = await getApplicationDocumentsDirectory();
String documentsPath = documentsDir.path;
File file = new File('$documentsPath/notes');
if(!file.existsSync()) {
return;
}
String notes = await file.readAsString();
//讀取到資料後設定資料更新UI
setState(() {
...
});
}
複製程式碼
寫在最後
檔案儲存功能在path_provider外掛的基礎上實現起來很簡單,就介紹到這裡,下一篇我們將介紹資料庫儲存外掛sqflite的使用方法,這樣就可以滿足批量資料的持久化儲存需求了。
說明:
文章轉載自對應的“Flutter程式設計指南”微信公眾號,更多Flutter相關技術文章開啟微信掃描二維碼關注微信公眾號獲取。