Flutter 数据持久化
前面的几篇文章主要介绍了flutter里面基本控件的使用(其实我也没细说到底咋用,就是堆出来的一个个小控件分享给大家-。-),本文主要介绍一下flutter中数据持久化的使用,作者也是边学习边码文,和大家共同学习。
首先说学习过程中遇到的第一个场景,就是在做登录页面的时候,会联想到我们实际应用中会需要存储用户输入的用户名和密码,再或者登录成功之后接口返回的一些其他用户信息。在做iOS开发的时候,我们经常把这些轻量级的数据存在NSUserDefault中,其实在flutter中也有对应的SharedPreferences做轻量级的数据存储,下面一起来学习一下。
1.SharedPreferences
shared_preferences是Flutter社区开发的一个本地数据存取插件。我们可以通过pubspec.yaml
文件引入
dependencies:flutter:sdk: flutter# The following adds the Cupertino Icons font to your application.# Use with the CupertinoIcons class for iOS style icons.cupertino_icons: ^0.1.2shared_preferences: ^0.5.3+2
然后执行flutter packages get
在使用的文件中引入
import 'package:shared_preferences/shared_preferences.dart';
这里注意第一次run的时候会报错要去iOS文件目录中pod install 一下
常用的“增,删,改,查”都可以在源码API中找到,下面以登录页面为例,应用一下:
可以看到支持bool,double,int,string,stringList几种数据类型。
首次登录是存储用户名(手机号)和 密码:
_login() async {print('login action');SharedPreferences prefs = await SharedPreferences.getInstance();await prefs.setString('name', _nameController.text);await prefs.setString('pwd', _passwordController.text);_getLoginInfor();}
再次登录的时候获取存在SharedPreferences中的数据:
_getLoginInfor() async {SharedPreferences prefs = await SharedPreferences.getInstance();setState(() {_nameController.text = prefs.getString('name');}); }
当然也有删除的api:
/// Removes an entry from persistent storage.Future<bool> remove(String key) => _setValue(null, key, null);
我们看到支持存储的几种数据格式里并没有var,是不支持自定义类型的,比如我们的userInfoModel,所以这里我们可以把登录成功之后接口返回的json数据以字符串的形式存储,在存储前先不进行model转换。(这里测试用了本地json数据)
_getLoginInforJSON() async {String jsonStr = await DefaultAssetBundle.of(context).loadString("assets/json/login_info.json");Map<String, dynamic> jsonMap = json.decode(jsonStr);UserinfoModel model = UserinfoModel.fromJson(jsonMap);SharedPreferences prefs = await SharedPreferences.getInstance();await prefs.setString('loginInfo', jsonStr);}
还有些我们可能会用到的API
/// Returns true if persistent storage the contains the given [key].bool containsKey(String key) => _preferenceCache.containsKey(key);/// Completes with true once the user preferences for the app has been cleared.Future<bool> clear() async {_preferenceCache.clear();return await _kChannel.invokeMethod<bool>('clear');}
2.文件存储
在使用的文件里添加引用
import 'dart:io';
直接看使用吧,和上面SharedPreferences的使用做同样的功能
_save() async {File file = await _getFile('login.text');file.writeAsString(_nameController.text);}_getString() async {File file = await _getFile('login.text');setState(() {file.readAsString().then((String value) {_nameController.text = value;});});}
这里主要关注一下文件路径的获取
_getFile(String fileName) async {Directory fileDirectory = await getApplicationDocumentsDirectory();String filePath = fileDirectory.path;return new File(filePath + "/" + fileName);}
就是getApplicationDocumentsDirectory();需要导入第三方的插件path_provider,path_provider是基于Directory的一个封装
dependencies:flutter:sdk: flutter# The following adds the Cupertino Icons font to your application.# Use with the CupertinoIcons class for iOS style icons.cupertino_icons: ^0.1.2shared_preferences: ^0.5.3+2# 添加文件依赖path_provider: ^1.1.2
里面只有三个获取路径的API
getTemporaryDirectory()//获取应用缓存目录,等同IOS的NSTemporaryDirectory()
getApplicationDocumentsDirectory()获取应用文件目录类似于Ios的NSDocumentDirectory
getExternalStorageDirectory()//这个是存储卡,仅仅在Android平台可以使用
根据打印的存储路径可以找到我们刚才创建的文件,并查看是否存储成功
创建文件成功
写用户名(手机号)成功
这里补充一下关于目录(Directory)的操作
- 创建指定目录
- 重命名目录
- 删除目录
- 创建临时文件夹
- 获取父目录
- 列出目录的内容
handleDir() async {Directory fileDirectory = await getApplicationDocumentsDirectory();String filePath = fileDirectory.path;//可以用Platform.pathSeparator代替路径中的分隔符"/"//效果和"dir/subdir"一样//如果有子文件夹,需要设置recursive: truevar directory = await new Directory(filePath + "${Platform.pathSeparator}" + 'myfile').create(recursive: true);assert(await directory.exists() == true);//输出绝对路径print("Path: ${directory.absolute.path}");//重命名文件夹directory = await directory.rename(filePath + "${Platform.pathSeparator}" + 'myfileRename');print("Path: ${directory.absolute.path}\n");//创建临时文件夹//参数是文件夹的前缀,后面会自动添加随机字符串//参数可以是空参数var tempDir = await Directory.systemTemp.createTemp('temp_dir');assert(await tempDir.exists() == true);print("Temp Path: ${tempDir.path}");//返回上一级文件夹var parentDir = tempDir.parent;print("Parent Path: ${parentDir.path}");//列出所有文件,不包括链接和子文件夹Stream<FileSystemEntity> entityList =parentDir.list(recursive: false, followLinks: false);await for (FileSystemEntity entity in entityList) {//文件、目录和链接都继承自FileSystemEntity//FileSystemEntity.type静态函数返回值为FileSystemEntityType//FileSystemEntityType有三个常量://Directory、FILE、LINK、NOT_FOUND//FileSystemEntity.isFile .isLink .isDerectory可用于判断类型print(entity.path);}//删除目录await tempDir.delete();assert(await tempDir.exists() == false);}
这里需要注意的是,目录操作也是要基于getApplicationDocumentsDirectory()获取到Documents的路径,或者创建临时文件夹。
除了上述常用的API之外,file.dart中还提供了很多其他的API感兴趣的小伙伴可以点进去查看,下面是一些其他常用方法的示例:
_saveWithInk() async {File file = await _getFile('loginInk.text');var sink = file.openWrite();sink.write(_nameController.text.toString());// Close the IOSink to free system resources.sink.close();}_delete() async {File file = await _getFile('loginInk.text');file.delete();}_getFile(String fileName) async {Directory fileDirectory = await getApplicationDocumentsDirectory();String filePath = fileDirectory.path;print('filepath is $filePath');var file = File(filePath + "/" + fileName);try {bool exists = await file.exists();if (!exists) {return await file.create();} else {return file;}} catch (e) {print(e);}}_save() async {File file = await _getFile('login.text');file.writeAsString(_nameController.text.toString()).then((File file) {// Do something with the file.});file.length().then((len) {print(len);});}
Flutter 数据持久化相关推荐
- Flutter数据持久化
前言 欢迎阅读Flutter系列教程,本文讲解Flutter的数据持久化.主要分三块内容: 1.使用Sqlite 2.读写文件 3.存储键值对 Sqlite的使用 如果你的APP需要经常在本地存储查询 ...
- flutter 数据持久化之sqflite
sqflite: 是一款轻量级的关系型数据库,类似SQLite. 支持iOS和Android.适用于存储数据库 , 表类型的数据. 使用: 添加依赖 dependencies:flutter:sdk: ...
- Android数据持久化:SharePreference
SharePreference:作为Android数据持久化的一种,具有一定的便捷性,适合存储一些体积小的数据. 存储数据方式:键值对的方式,类似于Map: 利用SharePreference.Edi ...
- Android数据持久化:文件存储
数据持久化: 数据可分为瞬时数据和关键数据.保存在内存之中的数据是瞬时数据,而对于一些关键性数据,后期需要持续使用的,应当保存在存储设备中: 持久化保存方式: 文件存储.SharePreference ...
- 仅需6步,教你轻易撕掉app开发框架的神秘面纱(5):数据持久化
遇到的问题 有的时候程序中需要全局皆可访问的变量,比如:用户是否登录,用户个人信息(用户名,地区,生日),或者一些其他信息如:是否是首次登录,是否需要显示新手引导等等. 其中有些数据需要持久化到本地硬 ...
- 数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框 ...
- Java 数据持久化系列之池化技术
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 在上一篇文章Java 数据持久化系列之JDBC中,我们了解到使用 ...
- docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别
前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此 ...
- iOS中几种数据持久化方案总结
概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...
- iOS 数据持久化 -- Core Data (2)
2019独角兽企业重金招聘Python工程师标准>>> 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里, ...
最新文章
- 图论(六)图的两种表示方法
- jQuery:仿MSN网站的tab效果
- 从MapReduce的执行来看如何优化MaxCompute(原ODPS) SQL 1
- 软件企业CMMI认证需要什么条件?
- 背景建模算法比较与ViBe算法论文解读与python代码
- 空间计量经济学 matlab,空间计量经济学基于MATLAB的应用分析
- 7-3 寻找大富翁 (50分)
- iOS6.1/iOS6.0.1完美越狱迟迟不现身 pod2g发推文澄清
- js image对象
- vue2.0 仿蘑菇街
- fatal: unable to access ‘https://github.com/xxxxx/xxx.git/‘: OpenSSL SSL_read: Connection was reset,
- 基于JAVA的工资管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
- Kaggle数据集之电信客户流失数据分析
- o2o现状及未来发展趋势是什么?
- CaffeNet简介
- 蔬菜类别二级计算机,国家标准:蔬菜分类.doc
- 命令行工具 DOT和DOH测试
- sysconfig看不了怎么更新_sysconfig老版本下载-sysconfig稳定版(能看的版本)_5577安卓网...
- c 语言 清华大学郑莉,c 语言程序设计郑莉清华大学答案
- 网管入门需掌握的电脑知识
热门文章
- 应用服务器和数据库服务器有什么区别
- 金融级湖仓一体架构——SequoiaDB巨杉数据库初探
- 用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...
- 分析无线遥控器信号并制作Hack硬件进行攻击
- win10动态壁纸怎么设置_技术贴,安卓手机如何设置类似iPhone的炫酷动态壁纸
- 什么是嵌入式系统?嵌入式系统应该如何学习?
- 非对称TSP问题(asymmetric travelling salesman problem)与对称TSP问题的转换
- 【免费办公软件】万彩办公大师教程丨文件批量解压工具
- 将计算机设置成交换机主机名,分享:如何配置学校机房项目交换机?
- Solr评分整理汇总:深入理解Lucene默认打分算法以及常用的三种评分方法