Flutter开发之数据存储-2-文件存储(33)

2023-11-08

数据存储部分在移动开发中是非常重要的部分,无论是一些轻量级的数据(如用户信息、APP配置信息等)还是把需要长期存储的数据写入本地文件或者Sqlite3。都离不开数据存储,上一篇SharedPreferences的使用,今天就练习一下文件存储-写入本地文件。

文件存储

这三种存储方式Flutter本身都没有内置,不过好在官方提供了第三方库,操作文件同样我们也需要像SharedPreferences一样,需要在pubspec.yaml引入。在 Flutter 里实现文件读写,需要使用 path_providerdart 的 io 模块。path_provider 负责查找 iOS/Android 的目录文件,IO 模块负责对文件进行读写。

官方文档:https://pub.dev/packages/path_provider#-installing-tab-

# 文件存储依赖库
path_provider: ^1.1.2

然后命令行执行flutter packages get 完成后如下:
在这里插入图片描述

数据存取示例

测试的地方导入

import 'package:path_provider/path_provider.dart';
import 'dart:io';

整个操作演示逻辑跟SharedPreferences一样,关于文件存储的三个获取文件路径的方法我这里说明一下。

path_provider中有三个获取文件路径的方法:

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

来看下操作文件的效果图:

在这里插入图片描述

借用了SharedPreferences存储的逻辑,只是把存储的代码放在了file.text中,代码里有详尽的注释,我就不多做解释说明了,读者可自行尝试对比跟SharedPreferences的差别

样例代码

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';

class FileSaveTest extends StatefulWidget {
  FileSaveTest({Key key, this.title}) : super(key: key);
  final String title;
  @override
  createState() => new _FileSaveTestState();
}

class _FileSaveTestState extends State<FileSaveTest> {
  var _textFieldController = new TextEditingController();
  var _storageString = '';
  final STORAGE_KEY_FILE = 'storage_key';

  /**
   * 利用文件存储数据
   */
  saveString() async {
    final file = await getFile('file.text');
    //写入字符串
    file.writeAsString(_textFieldController.value.text.toString());
  }

  /**
   * 获取存在文件中的数据
   */
  Future getString() async {
    final file = await getFile('file.text');
    var filePath  = file.path;
    setState(() {
      file.readAsString().then((String value) {
        _storageString = value +'\n文件存储路径:'+filePath;
      });
    });
  }

  /**
   * 初始化文件路径
   */
  Future<File> getFile(String fileName) async {
    //获取应用文件目录类似于Ios的NSDocumentDirectory和Android上的 AppData目录
    final fileDirectory = await getApplicationDocumentsDirectory();

    //获取存储路径
    final filePath = fileDirectory.path;

    //或者file对象(操作文件记得导入import 'dart:io')
    return new File(filePath + "/"+fileName);
  }


  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('文件存储'),
      ),

      body: new Column(
        children: <Widget>[
          SizedBox(height: 5,),
          Text("文件存储", textAlign: TextAlign.center,style: TextStyle(fontSize: 24,color: Colors.deepOrange),),

          Container(
            padding: EdgeInsets.all(10),
            height: 58,
            child: TextField(
              controller: _textFieldController,
              style: TextStyle(fontSize: 28),
            ),
          ),


          MaterialButton(
            onPressed: saveString,
            child: new Text("存储",style: TextStyle(color: Colors.white,fontSize: 22),),
            color: Colors.lightBlueAccent,
          ),
          MaterialButton(
            onPressed: getString,
            child: new Text("获取",style: TextStyle(color: Colors.white,fontSize: 22),),
            color: Colors.lightGreen,
          ),

          SizedBox(height: 15,),
          Container(
            padding: EdgeInsets.all(8),
            height: 180,
            child: Text('存储的值为:$_storageString',style: TextStyle(fontSize: 22,color: Colors.deepOrange)
            ),
          ),

        ],
      ),

    );
  }
}

部分摘自

[Flutter入门进阶之旅(十二)Flutter 数据存储](https://blog.csdn.net/xieluoxixi/article/details/8665501

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter开发之数据存储-2-文件存储(33) 的相关文章

  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud
  • 查询联系人 - 有时返回空游标

    我正在尝试查询联系人的显示名称 Override public void onActivityResult int requestCode int resultCode Intent data switch requestCode case
  • RichFaces 应用程序,我应该使用 rich:dataTable 还是 jQGrid,优缺点吗?

    继从here https stackoverflow com questions 3899649 ok to wrap jsf components generated html with own divs using jquery aft
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • ggplot2 的 fortify 函数出错

    我在 ggplot2 中使用 fortify 方法时收到此错误 Error in function classes fdef mtable unable to find an inherited method for function pr
  • 在门户中查看 Azure WebJob 计划?

    我创建了一个简单的 Azure WebJob 并通过 Visual Studio 集成制定了每天运行一次的计划 我已经部署了 WebJob 并看到它列在我在 Azure 上的应用程序中 schema http schemastore org
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima
  • 以 Rails 形式处理 MongoMapper EmbeddedDocument

    首先 我对一般编程和 Rails 都是新手 我选择 Rails 是因为它看起来是一种很容易上手的语言 对于我的项目 我将 MongoMapper 与 Rails 结合使用 我正在尝试以与文档相同的形式处理嵌入文档 我有以下模型 class
  • 根据列中的部分字符串匹配选择数据框行

    我想根据列中字符串的部分匹配从数据框中选择行 例如列 x 包含字符串 hsa 使用sqldf if它有一个like语法 我会做类似的事情 select from lt gt where x like hsa 很遗憾 sqldf不支持该语法
  • 给定文档,选择相关片段

    当我在这里提出问题时 自动搜索返回的问题的工具提示给出了问题的前一点 但其中相当一部分没有给出任何比理解问题更有用的文本 标题 有谁知道如何制作一个过滤器来删除问题中无用的部分 我的第一个想法是修剪仅包含某个列表中的单词的任何前导句子 例如
  • CLion - 命令行程序参数

    当我分配给 运行 调试配置 程序参数 之类的 aaa bbb 然后打印它时 任何人都可以告诉我 JetBrains CLion 有什么问题吗 printf s n argv 1 我刚刚得到 aaa 而它必须是 aaa bbb 因为它们用双引
  • 从 npm 脚本运行时,eslint 不会报告任何错误

    我已经使用 npm init eslint config 安装了带有 typescript 的 eslint 然后将 lint 脚本添加到我的 package json 中 但是当我运行 npm script lint npm run li
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐

  • hibernate无法找到实体类

    找不到持久化类 第一次编写博客 我的博客是用来记录编程出现过的错误 org hibernate UnknownEntityTypeException Unable to locate persister 翻译 未知实体类型异常 找不到持久化
  • TortoiseSVN设置忽略文件和目录文件夹

    参看 https blog csdn net bbj12345678 article details 80949556
  • sql server 查询表是否被哪些存储过程和视图引用

    select name from sysobjects as s inner join syscomments as o on s id o id where text like N 表名
  • GFS 阅读笔记

    这篇博客是我阅读著名的 GFS 论文 The Google File System 所总结的笔记以及自己一些的思考 这篇论文是一篇非常经典的论文 尤其对于想要了解分布式或者刚刚开始研究分布式的人来说 是一篇非常好的读物 它里面提到了许多分布
  • 使用python代码绘制一个会动的爱心

    你可以使用 matplotlib 库来绘制一个会动的爱心 下面是一个简单的代码示例 import matplotlib pyplot as plt import numpy asnp x np linspace np pi np pi 25
  • Apache Beam中的有状态计算

    Beam帮助我们处理流式 乱序 大规模的数据 并且提供了高度的抽象机制Pipeline 统一了流式和批量数据处理 从功能上流处理可以分为无状态 stateless 的和有状态 stateful 两种 在流处理的框架里引入状态管理大大提升了系
  • mysql怎么打开表ddl_MySQL数据表操作(DDL)

    一 创建数据表 语法 create table 表名称 字段 字段类型 约束 字段 字段类型 约束 表选项 约束 primary key not null auto increment等 表选项 数据表的属性 一般包括engine char
  • linux常用命令及解释大全(三)

    目录 前言 一 字符设置和文件格式转换 二 文件系统分析 三 初始化一个文件系统 四 备份 五 光盘 六 网络 总结 前言 本篇文章继续介绍了一部分linux常用命令 包括字符设置和文件格式转换 文件系统分析 初始化一个文件系统 备份 光盘
  • 模板类,模板类函数特例化,模板类特例化

    今天在看某c 框架源码时 发现模板类里的部分函数可以特例化 感觉很神奇便尝试了下 发现很多平时不会注意的c 细节及知识 写下来分享给大家 以便大家遇到相似问题时可以少踩点坑 模板类会出现链接问题 编译不通过 如果模板类 h文件和 cpp文件
  • matlab_一组数据元素随机排列

    如何生成一组数据元素随机排列 随机打乱顺序 产生新的排列 1 使用的matlab函数 randperm 1 语法格式 R randperm n 2 函数功能 将数字1 n进行随机排列 排列结果存储在行向量内 3 EX 输入 randperm
  • 网页端扫码通过公众号实现微信授权登录

    1 参考开发文档 https developers weixin qq com doc offiaccount OA Web Apps Wechat webpage authorization html 0 2 先调起微信授权页面 获取co
  • Java学习心得2——构造函数

    1 什么是构造函数 构造函数顾名思义 就是对象被构造的时候就会被调用的函数 例如当你new一个Cat对象的时候 Cat对象的构造函数就会被调用 public static void main String args Cat c new Ca
  • (如何读写文件)流-------输入流

    流 流是一组有序的数据序列 通过流来读写文件 流从方向分输入 输出流 流从单位份字节 字符流 字节输入流 InputStream 抽象父类 基类 常用方法 read 几个重载方法作用不同 int read 输入流一个字节一个字节的读 返回的
  • U3D中对象的自动销毁

    很多游戏中都会重用同一个游戏对象 比如说Dota 一波兵一波兵的被对方消灭 如果尸体不会自动销毁 恐怕地图中的尸体堆积如山不说 配置再厉害的电脑也架不住 这样游戏的性能太低了 需要自动销毁的情形有 游戏对象已经并且永远消失在视野中了 天空中
  • Java基础篇——集合

    活动地址 CSDN21天学习挑战赛 1 为什么使用集合 集合与数组类似 都是容器 我们为什么不用数组而还要使用集合呢 数组的特点 数组定义完成并启动后 类型确定 长度固定 不适合元素的个数和类型不确定的业务场景 更不适合做需要增删的操作 数
  • 如何在手机上运行c语言,各位前辈这两个程序怎么在手机上运行

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 made by ebhrz include include include include include include include global define int cfd 文件描述符
  • Python mailmerge库

    Python mailmerge库 本文使用环境 win10 python3 7 office2016 第0步 按装mailmerge pip install mailmerge 第1步 引用库 from mailmerge import
  • 测试用例设计(增量测试)

    增量测试 在执行模块测试过程中 我们主要有两点考虑 第一 如何设计一个有效的测试用例集 第二 将模块组装成工作程序的方式 第二点考虑很重要 因为它涉及模块测试用例编写的形式 可能用到的测试工具类型 模块编码和测试的顺序 生成测试用例的成本以
  • Markdown的十个常用标志符号

    Markdown 是一种轻量级的 标记语言 它的优点很多 目前也被越来越多的写作爱好者 撰稿者广泛使用 看到这里请不要被 标记 语言 所迷惑 Markdown 的语法十分简单 常用的标记符号也不超过十个 这种相对于更为复杂的HTML 标记语
  • Flutter开发之数据存储-2-文件存储(33)

    数据存储部分在移动开发中是非常重要的部分 无论是一些轻量级的数据 如用户信息 APP配置信息等 还是把需要长期存储的数据写入本地文件或者Sqlite3 都离不开数据存储 上一篇SharedPreferences的使用 今天就练习一下文件存储