Flutter 提供了三种数据持久化方法,即文件、SharedPreferences 与数据库。
文件
Flutter 提供了两种文件存储的目录,即临时(Temporary)目录与文档(Documents)目录:
临时目录是操作系统可以随时清除的目录,通常被用来存放一些不重要的临时缓存数据。这个目录在 iOS 上对应着 NSTemporaryDirectory 返回的值(网上搜集的信息,对 iOS 不熟悉故不确定对错),而在 Android上则对应着 getCacheDir 返回的值。
文档目录则是只有在删除应用程序时才会被清除的目录,通常被用来存放应用产生的重要数据文件。在 iOS上,这个目录对应着 NSDocumentDirectory (网上搜集的信息,对iOS不熟悉故不确定对错),而在 Android上则对应着 AppData 目录。
如何在Flutter中获取上述两个目录地址呢?这里使用到的是 path_provider库
先在pubspec.yaml中添加依赖,然后点击AndroidStudio右上角的 packages get
dependencies:
path_provider: ^1.6.5
接下来就可以获取到以上两个目录路径了:
// 获取临时目录
Directory tempDir = await getTemporaryDirectory();
String tempPath = tempDir.path;
// 获取文档目录
Directory appDocDir = await getApplicationDocumentsDirectory();
String appDocPath = appDocDir.path;
接下来我们通过示例来看一下效果。
示例
创建文件并写入数据,随后将数据读取出来。由于文件读写一般比较耗时且容易出错,为了保证程序的健壮性,需要异步Futures以及 try catch使用。
首先在文档目录创建文件:
Future get _localFile async {
// 存在文档目录
final directory = await getApplicationDocumentsDirectory();
final path = directory.path;
// 使用绝对路径
return File('$path/content.txt');
}
接着在文件中写入数据:
Future writeContent(String content) async {
// 获取到文件
final file = await _localFile;
// 执行写入
return file.writeAsString(content);
}
最后将上一步写入的数据读取出来:
Future readContent() async {
try {
// 获取到文件
final file = await _localFile;
// 执行读取