flutter 本地存储数据(shared_preferences)

Posted @Jerry-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter 本地存储数据(shared_preferences)相关的知识,希望对你有一定的参考价值。

一、shared_preferences 本地存储插件简介

  1. shared_preferences 是 Flutter 提供的 本地数据存取 插件 ;
  2. 在不同的平台 , 基于不同的机制开发 , 如 android 平台中基于 SharedPreferences 开发 , ios 平台中基于 NSUserDefaults 开发 ;
  3. 访问本地文件是耗时操作 , 因此访问 shared_preferences 存储是一个 异步操作 ;
  4. 为简单数据封装平台特定的持久存储(iOS和macOS上的NSUserDefaults, Android上的SharedPreferences,等等)。数据可能会异步持久化到磁盘,并且不能保证写入返回后会持久化到磁盘,所以这个插件不能用于存储关键数据。

实现:

添加插件依赖:

dependencies:

  shared_preferences: 2.0.15 #本地存储插件

简单示例:

import 'package:shared_preferences/shared_preferences.dart';
/**
 * 存储数据到本地
 */
enum StoreKeys 
  token,

enum StoreName
  name,

enum StorePassword
  password,


class Store 
  // static StoreKeys storeKeys;
  final SharedPreferences _store;
  static Future<Store> getInstance() async 
    SharedPreferences preferences = await SharedPreferences.getInstance();
    return Store._internal(preferences);
  

  Store._internal(this._store);

  /**
   * 保存token
   */
  getString(StoreKeys key) async 
    return _store.get(key.toString());
  

  setString(StoreKeys key, String value) async 
    return _store.setString(key.toString(), value);
  

/**
 * 保存用户名
 */
    getNameString(StoreName key) async 
    return _store.get(key.toString());
  

  setNameString(StoreName key, String value) async 
    return _store.setString(key.toString(), value);
  

  /**
   * 保存密码
   */

    getpasswordString(StorePassword key) async 
    return _store.get(key.toString());
  

  setPasswordString(StorePassword key, String value) async 
    return _store.setString(key.toString(), value);
  

   remove(StoreKeys key) async 
    return _store.remove(key.toString());
  

调用方法:

             String name = 'admin'; //测试数据
              String password = '123456'; //测试数据
              Store store = await Store.getInstance(); //初始化

              await store.setNameString(StoreName.name, name); //调用写入方法
              String testName = await store.getNameString(StoreName.name);//获取对应数据
              print("获取的用户名 $testName");

              await store.setPasswordString(StorePassword.password, password);//调用写入方法
              String testPassword =
                  await store.getpasswordString(StorePassword.password);//获取对应数据
              print("获取的密码 $testPassword");

基本使用

支持数据类型

int,  double,  bool,  String , List<String>

写入数据 

var user = await SharedPreferences.getInstance(); //初始化
user .setString("name", "张三");
user .setInt("age", 22);
user .setBool("sex", true);
user .setDouble("height", 177.7);
user .setStringList("address", <String>["石家庄", "长安区"]);

 读取数据 

var user = await SharedPreferences.getInstance(); //初始化
String? name = user .getString("name");
int? age = user .getInt("age");
bool? sex = user .getBool("sex");
double? height = user .getDouble("height");
List<String>? address = user .getStringList("address");

 

删除数据 

 删除一个数据

var user= await SharedPreferences.getInstance(); //初始化
user.remove("name");
 

删除全部数据 

var user = await SharedPreferences.getInstance(); //初始化
user.clear();
 

 获取所有key


var user = await SharedPreferences.getInstance();
var keys = user.getKeys();
 

key是否存在


var user = await SharedPreferences.getInstance();
var b = user.containsKey("name"); 

Flutter 并将数据保存到本地存储

【中文标题】Flutter 并将数据保存到本地存储【英文标题】:Flutter and saving data to local storage 【发布时间】:2018-11-17 12:34:39 【问题描述】:

    您可以写入本地资产文件吗?我已经设法从本地 json 文件中检索信息,但想知道您是否可以写入该文件?如果是的话怎么办?

    写入本地首选项会更好还是对于大量数据来说这太小了?

    如果您正在读取/写入本地文件,您将如何使用模拟器进行测试?我收到无法访问文件的错误消息。

【问题讨论】:

***.com/questions/41369633/… 【参考方案1】:

您可以写入应用程序私有沙盒目录中的本地文件(iOS 上为NSDocumentsDirectory,Android 上为AppData),但不能写入应用程序本身捆绑的文件(这并不意味着您不能但是,在应用程序中打包读/写文件:如果要写入预打包文件,则必须首先将其复制到文档目录并将新副本用作“可写”版本)。除了解决安全问题之外,这还可以确保原始 app bundle 保持完整,并且可以在不影响任何用户数据的情况下进行更新/替换。

查看Flutter cookbook entry here,了解有关写入本地存储的更多详细信息。

有关写入本地首选项(应为较小的数据位保留)的优缺点的讨论,请查看this question and its answers。

【讨论】:

这适用于存储单个值,但我如何将列表写入文件而不是单个值?我想保存许多不同的列表,然后更改和更新特定的列表项。我对将列表保存到文件然后从文件返回列表的过程感到困惑。你会在字符串的末尾使用 \n ,然后使用 read as lines 吗? 食谱中的示例确实使用了单个整数作为示例,但是您可以将任何字符串写入(和读取)该文件或从该文件中读取。然后,使用序列化器/反序列化器(例如,this one),您可以将几乎任何对象或数组(即“map”)转换为 JSON 字符串,然后可以保存和/或稍后检索。公平地说,以各种格式存储/检索数据的多种方法的讨论远远超出了单个问题的范围。

以上是关于flutter 本地存储数据(shared_preferences)的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 并将数据保存到本地存储

Flutter本地存储远程数据的最佳策略

flutter 本地存储数据(shared_preferences)

在本地管理 Flutter 应用和 Flutter Web 数据

如何在flutter中保护本地存储的数据

04_数据存储