在上一篇文章中我们学习了在Dart中的异步操作,你以为我没事啊还特地给你们专门写一篇文章啊,当然是有用的啊。
想必大家都知道所有的文件操作都是耗时的,那么肯定都是要在异步下进行的,不然的话那就真的要让用户死等啊,所以异步操作在文件的存储过程中显得异常的重要。
好吧,还是回归今天的主题,我们还是来看下Flutter中的本地存储吧
和Android、Ios类似,Flutter也支持Preferences(Shared Preferences and NSUserDefaults) 、文件、和Sqlite3。
只不过要想使用这个功能需要引入官方仓库的相应插件,那么我们就分别来看下这三种存储方式的使用方法。
Flutter中本身并不支持Preferences存储,需要借助于第三发的组件来实现。 打开 https://github.com/flutter/plugins 或者 https://pub.dartlang.org/flutter 可以在上面找到需要官方和第三方提供的其他组件,我们使用的shared_preferences就是其中的一个,打开shared_preferences插件对象的页面即可看到插件相关的信息
现在我们需要在项目里面引入shared_preferences插件
下面还是举个例子来说明下
实现输入一段字符串进行保存和获取操作
还是直接来看代码:
首先我们创建了一个TextField用来获取用户输入,然后我们再下面定义看了连个按钮,每当当即存储按钮都会触发save() 方法,每当点击获取按钮都会触发get()方法。
接下来我们还是来看下这两个方法里面做了什么吧。
在上面save方法中我们可以看到我们给它加上了async和await关键字,因为SharedPreferences的存贮也是一个轻量级的耗时操作,所以我们也是需要在异步中进行的。
我们使用SharedPreferences.getInstance()方法来实例化SharedPreferences对象,使用它的setString方法来存储用户输入的字符串。
setString(key, value) 其中key就是你存贮的名称,value就是你存储的值
当然,SharedPreferences里有很多存储其他对象的方法比如:
prefs.setBool(key, value) prefs.setDouble(key, value) prefs.setInt(key, value) prefs.setStringList(key, value)
接下来来看下get方法
在get方法中我们同样实例化了一个SharedPreferences对象,并且调用SharedPreferences的getString方法来获取我们存入的对象。
getString(key) key就是我们刚才存入的值,我们通过这个值可以在本地查找到我们存入的对象并返回。
同样的,get方法也是耗时操作,同样需要异步执行,我们使用async和await来使得get方法异步并返回了一个泛型为String的Future对象。
我们使用获得的Future对象调用then()方法,当get方法执行完后就会自动触发then()方法里面的操作弹出showSnackBar。
好吧,咱们还是去android目录下看下这个SharedPreferences文件在不在吧
嗯,其实也不难吧,接下来,来看下文件操作吧。
和SharedPreferences操作一样,Flutter内部并没有提供对本地文件的支持,但是官方给我们提供了第三方的支持库哦。
同样的方法,我们需要在pubspec.yaml文件中引入
path_provider: ^0.4.0
然后调用flutter packages get
最后在自己的Dart文件中引入
import ‘package:path_provider/path_provider.dart’;
即可使用Flutter中的文件存储
在path_provider中有三个获取文件路径的方法:
下面我们就以把文件存在应用文件目录举个例子
好吧,原谅我比较懒,界面还是上面的界面,只不过我们把上面的save和get方法变了下。
首先我们先获取存储目录
然后在本地建立文件(不存在这个名字的自动创建并返回,存在则直接返回这个文件对象),名字就叫做 nameFile吧。
然后就是存储输入框内的内容了
我们使用上面获取到的文件直接直接调用writeAsString即可,当然它会把这个文件对象返回给你,你可以存储下这个文件对象在下次使用
最后,我们来读取本地的文件
我们直接调用file的readString方法来获取字符串并返回泛型为String的Future对象
然后我们还是使用上面的代码通过Future的then方法来回去反悔的数据并showSnackBar
好吧,我们还是去看下,这个名字为nameFile.txt文件是否存在。
果不其然,它静静的躺在那里,哈。
最后,我们来看下Flutter中Sqlite的用法
和SharedPreferences和文件操作操作一样,Flutter内部并没有提供对sqlite的支持,但是官方给我们提供了第三方的支持库哦。
同样的方法,我们需要在pubspec.yaml文件中引入
sqflite: >=0.8.5
然后调用flutter packages get
最后在自己的Dart文件中引入
import ‘package:sqflite/sqflite.dart’;
即可在Flutter使用Sqlite
同样的,我慢还是先贴代码:
首先,我们需要获取一下我们数据库存储的目录,数据库名字为name.db
然后建立库和数据表,并返回泛型为Database的Future对象(我们这里是使用的失去了语句建立的数据表操作,大家可以根据自己需要定制相应的ORM映射库)
我们建立了一个表名为user 主键为id,一个Text类型name的数据表。
接着,我们拿着这个Database对象就可以存储数据了 这里我们在事务里执行sql语句
然后,我们点击获取按钮,获取数据
这里我们的查询操作直接返回了一个List
最后,我们在点击事件触发获取到相应值并处理
好吧,下面来看下效果
我们在来看下应用目录下有没有这个数据库文件吧
可以看到数据库文件已经在应用目录下了,数据库文件我就不拿出来看了哈
其实,今天提到的本地存储操作都是比较简单,大家可以在下面多多试一试相应的操作,因为在以后的应用开发过程中会用的很多的。^笔芯^
今天的我们对SharedPreferences、文件、数据库获取的Future对象都是通过async和await获得的,那么大家在下面尝试把今天获取Future的方式改为 Future api方式去获取并完成今天的例子。
点击左下角阅读原文,体验更佳阅读效果
我怀疑这个是个坏掉的二维码,分享到朋友圈试试?
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有