前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter中的本地存储

Flutter中的本地存储

作者头像
flyou
发布于 2019-08-06 09:09:41
发布于 2019-08-06 09:09:41
5.2K00
代码可运行
举报
文章被收录于专栏:flutter开发者flutter开发者
运行总次数:0
代码可运行

上期回顾

在上一篇文章中我们学习了在Dart中的异步操作,你以为我没事啊还特地给你们专门写一篇文章啊,当然是有用的啊。

想必大家都知道所有的文件操作都是耗时的,那么肯定都是要在异步下进行的,不然的话那就真的要让用户死等啊,所以异步操作在文件的存储过程中显得异常的重要。

好吧,还是回归今天的主题,我们还是来看下Flutter中的本地存储吧

Flutter本地存储


Android、Ios类似,Flutter也支持Preferences(Shared Preferences and NSUserDefaults) 、文件、和Sqlite3。

只不过要想使用这个功能需要引入官方仓库的相应插件,那么我们就分别来看下这三种存储方式的使用方法。

Preferences存储


Flutter中本身并不支持Preferences存储,需要借助于第三发的组件来实现。 打开 https://github.com/flutter/plugins 或者 https://pub.dartlang.org/flutter 可以在上面找到需要官方和第三方提供的其他组件,我们使用的shared_preferences就是其中的一个,打开shared_preferences插件对象的页面即可看到插件相关的信息

现在我们需要在项目里面引入shared_preferences插件

第三发插件的引用

  1. 打开项目的pubspec.yaml配置我文件在dependencies:节点下新增如下配置 shared_preferences: “^0.4.1”
  2. 点击开发工具提示的packages get按钮或者在命令行输入flutter packages get来同步第三方插件
  3. 在自己的Dart文件中引入插件即可正常使用了 import ‘package:shared_preferences/shared_preferences.dart’;

下面还是举个例子来说明下

实现输入一段字符串进行保存和获取操作

还是直接来看代码:

代码语言:javascript
代码运行次数:0
运行
复制

首先我们创建了一个TextField用来获取用户输入,然后我们再下面定义看了连个按钮,每当当即存储按钮都会触发save() 方法,每当点击获取按钮都会触发get()方法。

接下来我们还是来看下这两个方法里面做了什么吧。

代码语言:javascript
代码运行次数:0
运行
复制

在上面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方法

代码语言:javascript
代码运行次数:0
运行
复制

在get方法中我们同样实例化了一个SharedPreferences对象,并且调用SharedPreferences的getString方法来获取我们存入的对象。

getString(key) key就是我们刚才存入的值,我们通过这个值可以在本地查找到我们存入的对象并返回。

同样的,get方法也是耗时操作,同样需要异步执行,我们使用async和await来使得get方法异步并返回了一个泛型为String的Future对象。

代码语言:javascript
代码运行次数:0
运行
复制

我们使用获得的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中有三个获取文件路径的方法:

  • getTemporaryDirectory()//获取应用缓存目录,等同IOS的NSTemporaryDirectory()和Android的getCacheDir() 方法
  • getApplicationDocumentsDirectory()获取应用文件目录类似于Ios的NSDocumentDirectory和Android上的 AppData目录
  • getExternalStorageDirectory()//这个是存储卡,仅仅在Android平台可以使用

下面我们就以把文件存在应用文件目录举个例子

代码语言:javascript
代码运行次数:0
运行
复制

好吧,原谅我比较懒,界面还是上面的界面,只不过我们把上面的save和get方法变了下。

首先我们先获取存储目录

代码语言:javascript
代码运行次数:0
运行
复制

然后在本地建立文件(不存在这个名字的自动创建并返回,存在则直接返回这个文件对象),名字就叫做 nameFile吧。

代码语言:javascript
代码运行次数:0
运行
复制

然后就是存储输入框内的内容了

代码语言:javascript
代码运行次数:0
运行
复制

我们使用上面获取到的文件直接直接调用writeAsString即可,当然它会把这个文件对象返回给你,你可以存储下这个文件对象在下次使用

最后,我们来读取本地的文件

代码语言:javascript
代码运行次数:0
运行
复制

我们直接调用file的readString方法来获取字符串并返回泛型为String的Future对象

代码语言:javascript
代码运行次数:0
运行
复制

然后我们还是使用上面的代码通过Future的then方法来回去反悔的数据并showSnackBar

好吧,我们还是去看下,这个名字为nameFile.txt文件是否存在。

果不其然,它静静的躺在那里,哈。

最后,我们来看下Flutter中Sqlite的用法

Sqlite


和SharedPreferences和文件操作操作一样,Flutter内部并没有提供对sqlite的支持,但是官方给我们提供了第三方的支持库哦。

同样的方法,我们需要在pubspec.yaml文件中引入

sqflite: >=0.8.5

然后调用flutter packages get

最后在自己的Dart文件中引入

import ‘package:sqflite/sqflite.dart’;

即可在Flutter使用Sqlite

同样的,我慢还是先贴代码:

代码语言:javascript
代码运行次数:0
运行
复制

首先,我们需要获取一下我们数据库存储的目录,数据库名字为name.db

代码语言:javascript
代码运行次数:0
运行
复制

然后建立库和数据表,并返回泛型为Database的Future对象(我们这里是使用的失去了语句建立的数据表操作,大家可以根据自己需要定制相应的ORM映射库)

我们建立了一个表名为user 主键为id,一个Text类型name的数据表。

代码语言:javascript
代码运行次数:0
运行
复制

接着,我们拿着这个Database对象就可以存储数据了 这里我们在事务里执行sql语句

代码语言:javascript
代码运行次数:0
运行
复制

然后,我们点击获取按钮,获取数据

代码语言:javascript
代码运行次数:0
运行
复制

这里我们的查询操作直接返回了一个List

最后,我们在点击事件触发获取到相应值并处理

代码语言:javascript
代码运行次数:0
运行
复制

好吧,下面来看下效果

我们在来看下应用目录下有没有这个数据库文件吧

可以看到数据库文件已经在应用目录下了,数据库文件我就不拿出来看了哈

其实,今天提到的本地存储操作都是比较简单,大家可以在下面多多试一试相应的操作,因为在以后的应用开发过程中会用的很多的。^笔芯^

小结


  • 可以在https://pub.dartlang.org/flutter获取第三发插件
  • 在pubspec.yaml引入或者更新第三发插件
  • SharedPreferences、文件、数据库操作都是命耗时操作,需要异步执行

试一试


今天的我们对SharedPreferences、文件、数据库获取的Future对象都是通过async和await获得的,那么大家在下面尝试把今天获取Future的方式改为 Future api方式去获取并完成今天的例子。

点击左下角阅读原文,体验更佳阅读效果

我怀疑这个是个坏掉的二维码,分享到朋友圈试试?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 flutter开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Springboot文件上传大小超出限制,报错MaxUploadSizeExceededException
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (10935680) exceeds the configured maximum (10485760)
chenchenchen
2021/09/06
6K1
springboot 上传文件设置文件大小限制
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (39353107) exceeds the configured maximum (10485760)
全栈程序员站长
2022/09/02
3.2K0
spring boot文件上传失败 SizeLimitExceededException
文件上传失败 前端报错 net::ERR_CONNECTION_RESET 后端报错 org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (xxxxxx) exceeds the configured maximum (xxxxxx) 解决方案 配置文件 application.yml spring: servlet:
路过君
2020/06/19
3K0
springboot上传文件大小限制的配置[通俗易懂]
org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field pic exceeds its maximum permitted size of 1048576 bytes.
全栈程序员站长
2022/09/01
3.7K0
springboot上传文件大小配置
springboot上传文件大小配置有两种方法,一种是直接再配置文件配置,一种是通过添加一个Bean来实现。
全栈程序员站长
2022/08/25
2.3K0
Spring Boot设置上传文件大小
可以使用配置文件配置,也可以使用Bean在启动类中配置 配置文件为application.properties格式: spring.http.multipart.maxFileSize=10Mb spring.http.multipart.maxRequestSize=10Mb 其中,maxFileSize 是单个文件大小,maxRequestSize是设置总上传的数据大小 配置文件为application.yml格式: spring: http: multipart: en
二十三年蝉
2018/05/30
2.2K0
Java Web(SpringBoot 2.x)上传文件夹,完整代码
1、pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifac
程裕强
2019/05/27
2.7K0
springboot文件大小限制
繁枝容易纷纷落,嫩蕊商量细细开。——唐•杜甫 springboot文件大小限制 首先是可以在配置文件中进行配置 spring: servlet: multipart: # 单个文件 max-file-size: 1GB # 一次请求 max-request-size: 1GB 还有,我们也可以在代码中进行配置 @Bean public MultipartConfigElement multipartConfigElement() {
阿超
2022/08/16
2.3K0
springboot配合retrofit上传图片文字 完整教学
请先阅读https://www.cnblogs.com/tylerdonet/p/5722858.html。 为了验证,我特意用fiddler模拟了一次文件上传请求。 请求中要上传的信息有:{"auth": "qq", "openId": "...", "accessToken": "...", "wallpaper": "(图片文件)"}。 以下是请求的header和body的截图:
平凡的学生族
2019/05/25
2.2K0
SpringBoot 2.x版本+MultipartFile设置指定文件上传大小
It is recommended to use the container’s built-in support for multipart uploads rather than introducing an additional dependency such as Apache Commons File Upload.
Arebirth
2020/06/19
4.8K0
文件上传时提示NET:ERR_CONNECTION_RESET
最近闲暇之余写了一个半自动化的项目部署的项目,因为发现之前使用的jenkins太消耗服务器资源了,由于现在又不想升级服务器,就自己写一个半自动化的。其实就是一些java执行我在服务器上面写好的.sh的脚本即可,或者执行一些linux命令
终有链响
2024/07/29
2280
文件上传时提示NET:ERR_CONNECTION_RESET
SpringBoot上传文件出错
Spring Boot项目,今天做了一个与前端对接富文本的上传图片到服务器,返回一段URL给前端,一直运行着,前端一直请求接口一直上传图片做测试的时候,后台报了一个错误
全栈程序员站长
2022/09/06
8370
SpringBoot 简单文件上传实现以及jar包方式运行项目
1. 简单文件上传实现 ---- 1. 部分项目目录结构 1. 配置文件上传路径 2. 添加文件上传配置(此处为SdSpringBootApplication) // 需要将其配置到有@Configuration注解的类中 @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); // 单个文件最大 fact
山海散人
2021/03/03
6450
SpringBoot上传下载
CBeann
2023/12/25
1750
SpringMvc上传文件抛出3次Max
SpringMvc 3.2.18 版本开发的文件上传在Tomcat7 上运行抛出了3个MaxUploadSizeExceededException 异常; 正常情况下 当上传文件大小超过允许的大小时SpirngMvc 会抛出一个MaxUploadSizeExceededException 异常 如下 2018-02-25 23:05:15 WARN http-bio-8080-exec-5 [CommonsMultipartResolver.java:191] Failed to perform multipart cleanup for servlet request org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 100000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (7683904) exceeds the configured maximum (100000) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:160) at org.springframework.web.multipart.commons.CommonsMultipartResolver$1.initializeMultipart(CommonsMultipartResolver.java:131) at org.springframework.web.multipart.support.AbstractMultipartHttpServletRequest.getMultipartFiles(AbstractMultipartHttpServletRequest.java:119) at org.springframework.web.multipart.support.AbstractMultipartHttpServletRequest.getMultiFileMap(AbstractMultipartHttpServletRequest.java:99) at org.springframework.web.multipart.commons.CommonsMultipartResolver.cleanupMultipart(CommonsMultipartResolver.java:188) at org.springframework.web.servlet.DispatcherServlet.cleanupMultipart(DispatcherServlet.java:1071) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:867) at org.springframework.web.servlet.FrameworkServlet.proce***equest(FrameworkServlet.java:951) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:853) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:827) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.
py3study
2020/01/08
5650
spring-boot-route(三)实现多文件上传
Spring Boot默认上传的单个文件大小1MB,一次上传的总文件大小为10MB。
Java旅途
2020/10/21
6490
spring boot 上传附件文件过大时,没法捕捉异常(二)
上篇已经写了spring boot 2 上传附件文件过大时,没法捕捉异常,但在我另外一个项目中,还是不起作用。 另外一个项目用的是spring boot 1.5,用的是tomcat. 解决办法如下:
星痕
2019/05/09
2.7K1
基于SpringMVC的文件上传如何实现
在SpringBoot项目中,上传的文件默认不允许超过1M(也可能是其它值,根据SpringBoot的版本不同可能有差异),如果超出,将导致FileSizeLimitExceededException!如果需要自定义该限制值,需要在配置类中添加:
海拥
2021/08/23
6620
我去,Excel文件导入失败都搞不定么----记一次Excel文件导入失败--is not valid
昨晚8点左右,正准备下班走人,突然,产品小姐姐的在QQ上猛地抖动了我一下。产品小姐姐果然是无事不登三宝殿。线上出了问题!!!!!!!好几个版本没有变动多的文件导入突然不行了。客户催运营,运营催产品,产品催我这个小开发。哎,苦逼的程序员。
码农飞哥
2021/08/18
1.5K0
Swagger-ui在文件上传时报错net::ERR_CONNECTION_RESET
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2K0
推荐阅读
相关推荐
Springboot文件上传大小超出限制,报错MaxUploadSizeExceededException
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档