Flutter持久化儲存之檔案儲存

Flutter程式設計指南發表於2019-03-06

前言

本篇將給大家分享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相關技術文章開啟微信掃描二維碼關注微信公眾號獲取。

Flutter持久化儲存之檔案儲存

相關文章