前面的几篇文章主要介绍了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 数据持久化相关推荐

  1. Flutter数据持久化

    前言 欢迎阅读Flutter系列教程,本文讲解Flutter的数据持久化.主要分三块内容: 1.使用Sqlite 2.读写文件 3.存储键值对 Sqlite的使用 如果你的APP需要经常在本地存储查询 ...

  2. flutter 数据持久化之sqflite

    sqflite: 是一款轻量级的关系型数据库,类似SQLite. 支持iOS和Android.适用于存储数据库 , 表类型的数据. 使用: 添加依赖 dependencies:flutter:sdk: ...

  3. Android数据持久化:SharePreference

    SharePreference:作为Android数据持久化的一种,具有一定的便捷性,适合存储一些体积小的数据. 存储数据方式:键值对的方式,类似于Map: 利用SharePreference.Edi ...

  4. Android数据持久化:文件存储

    数据持久化: 数据可分为瞬时数据和关键数据.保存在内存之中的数据是瞬时数据,而对于一些关键性数据,后期需要持续使用的,应当保存在存储设备中: 持久化保存方式: 文件存储.SharePreference ...

  5. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(5):数据持久化

    遇到的问题 有的时候程序中需要全局皆可访问的变量,比如:用户是否登录,用户个人信息(用户名,地区,生日),或者一些其他信息如:是否是首次登录,是否需要显示新手引导等等. 其中有些数据需要持久化到本地硬 ...

  6. 数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框 ...

  7. Java 数据持久化系列之池化技术

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 在上一篇文章Java 数据持久化系列之JDBC中,我们了解到使用 ...

  8. docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别

    前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此 ...

  9. iOS中几种数据持久化方案总结

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  10. iOS 数据持久化 -- Core Data (2)

    2019独角兽企业重金招聘Python工程师标准>>> 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里, ...

最新文章

  1. 图论(六)图的两种表示方法
  2. jQuery:仿MSN网站的tab效果
  3. 从MapReduce的执行来看如何优化MaxCompute(原ODPS) SQL 1
  4. 软件企业CMMI认证需要什么条件?
  5. 背景建模算法比较与ViBe算法论文解读与python代码
  6. 空间计量经济学 matlab,空间计量经济学基于MATLAB的应用分析
  7. 7-3 寻找大富翁 (50分)
  8. iOS6.1/iOS6.0.1完美越狱迟迟不现身 pod2g发推文澄清
  9. js image对象
  10. vue2.0 仿蘑菇街
  11. fatal: unable to access ‘https://github.com/xxxxx/xxx.git/‘: OpenSSL SSL_read: Connection was reset,
  12. 基于JAVA的工资管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  13. Kaggle数据集之电信客户流失数据分析
  14. o2o现状及未来发展趋势是什么?
  15. CaffeNet简介
  16. 蔬菜类别二级计算机,国家标准:蔬菜分类.doc
  17. 命令行工具 DOT和DOH测试
  18. sysconfig看不了怎么更新_sysconfig老版本下载-sysconfig稳定版(能看的版本)_5577安卓网...
  19. c 语言 清华大学郑莉,c 语言程序设计郑莉清华大学答案
  20. 网管入门需掌握的电脑知识

热门文章

  1. 应用服务器和数据库服务器有什么区别
  2. 金融级湖仓一体架构——SequoiaDB巨杉数据库初探
  3. 用户下订单之后15分钟支付实现_用户提交订单,30分钟后没付款取消订单功能分析...
  4. 分析无线遥控器信号并制作Hack硬件进行攻击
  5. win10动态壁纸怎么设置_技术贴,安卓手机如何设置类似iPhone的炫酷动态壁纸
  6. 什么是嵌入式系统?嵌入式系统应该如何学习?
  7. 非对称TSP问题(asymmetric travelling salesman problem)与对称TSP问题的转换
  8. 【免费办公软件】万彩办公大师教程丨文件批量解压工具
  9. 将计算机设置成交换机主机名,分享:如何配置学校机房项目交换机?
  10. Solr评分整理汇总:深入理解Lucene默认打分算法以及常用的三种评分方法