作者:Kuky_xs
博客:https://www.jianshu.com/p/97c2dbcac3af
Flutter系列又继续来了~
还记得上次讲到哪里么?忘记的来看一下:Flutter 入门指北之状态管理,BLoC
上节讲了状态管理,但是当 App重启后,数据就都丢失了,这样就比较尴尬了,什么都要重来,所以这节我们来讲下数据持久化。数据持久化主要有如下方式
文件读写
shared_preferences存储
数据库存储
持久化的实现都需要通过三方插件来实现,接着会慢慢介绍三种实现方式
文件读写/ IO 操作
文件读写需要 path_provider插件,写这篇文章的时候,最新版本是 0.5.0+1,小伙伴们可以根据官网最新的版本进行替换,导入后我们就可以来看下如何实现文件的读写了。path_provider的源码比较简单,这边就不单独拎出来说了,可以自行查看。path_provider用于获取手机的存储文件位置,一共有三个方法
getTemporaryDirectory临时目录,在 Android 中对应的方法为 getCacheDir,而在 iOS 中对应为 NSCachesDirectory,可以通过系统检测并清除
getApplicationDocumentsDirectory缓存目录,在 Android 中对应为 AppData文件夹,在 iOS 中对应为 NSDocumentsDirectory,只有当 App 被删除才能被删除
getExternalStorageDirectory外部存储目录,只有在 Android 中有效,在 iOS 调用会抛出 UnsupportedError异常,不过 Android 在写入前记得先申请权限哟,否则也是不行滴。
读写文件操作需要通过 Dart的 IO操作完成,这边小伙伴们可以自己看文档 File class,接着我们就直接通过例子来看文件实现数据持久化。先看下效果吧,最终重启 App 后,数据也能正常读取显示,说明数据被保存下来了
看下实现的代码,因为会涉及到多种方式,所以这边我把视图抽取出来实现
Widget _fileIoPart() {
return Card(
margin: const EdgeInsets.all(8.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0))),
child: Column(children: [
Padding(
padding: const EdgeInsets.all(12.0),
child: Text('File IO', style: TextStyle(fontSize: 20.0, color: Theme.of(context).primaryColor)),
),// RadioList 是单选按钮部件,通过选择不同的情况,创建不同目录的文件
RadioListTile(
value: _radioText[0],
title: Text(_radioText[0]),
subtitle: Text(_radioDescriptions[0]),
groupValue: _currentValue,
onChanged: ((value) {
setState(() => _currentValue = value);
})),
RadioListTile(
value: _radioText[1],