[Flutter]shared_preferences基本用法以及可视化管理存储的key和value类型

本文介绍了Flutter中的shared_preferences插件,如何使用它进行数据的存储、读取和删除,以及如何通过封装管理键值对,包括可视化key和value类型,提升开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shared_preferences 是一个Flutter插件,它提供了一种简单的方式来在应用程序中存储和获取持久化的键值对数据。它可以用于存储应用程序的配置信息、用户偏好设置、登录状态等。

使用 shared_preferences 插件,你可以在应用程序中轻松地保存和读取数据,而无需处理底层的持久化细节。它基于平台的本地存储机制,例如Android中的SharedPreferences和iOS中的NSUserDefaults。

shared_preferences基本用法

以下是使用 shared_preferences 插件的基本操作:

1.添加依赖

在你的Flutter项目的 pubspec.yaml 文件中添加 shared_preferences 依赖。

dependencies:
  shared_preferences: ^2.2.2

2.导入插件

在需要使用 shared_preferences 的文件中导入插件。

import 'package:shared_preferences/shared_preferences.dart';

3.存储数据

使用 SharedPreferences.getInstance() 方法获取 SharedPreferences 实例,并使用 setXxx() 方法存储数据。

SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('username', 'John');
prefs.setInt('age', 25);

4.读取数据

使用 SharedPreferences.getInstance() 方法获取 SharedPreferences 实例,并使用 getXxx() 方法读取数据。

SharedPreferences prefs = await SharedPreferences.getInstance();
String username = prefs.getString('username');
int age = prefs.getInt('age');

5.删除数据

使用 SharedPreferences.getInstance() 方法获取 SharedPreferences 实例,并使用 remove() 方法删除指定键的数据。

SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove('username');

通过使用 shared_preferences 插件,你可以方便地在Flutter应用程序中存储和获取持久化的数据。请注意,这些数据是应用程序私有的,只能在当前设备上访问。

可视化管理shared_preferences中的key和value类型

看了上面shared_preferences的基本用法,我们会发现,直接使用时会导致定义的key特别分散。开发者无法一目了然的查看,现在shared_preferences中定义了哪些key,对应的value又是什么类型。

1.使用

await SharedPreferencesManager.instance.set(SharedPreferencesKey.didGuide, true);

bool? res = await SharedPreferencesManager.instance.get(SharedPreferencesKey.didGuide);

2.封装SharedPreferencesManager(不设置默认值)

import 'package:shared_preferences/shared_preferences.dart';
import 'package:app_teleprompter/support/extension/object_extension.dart';

/// 管理SharedPreferences的键和值。
class SharedPreferencesManager {
  // 单例对象
  static final SharedPreferencesManager _instance = SharedPreferencesManager._internal();
  // SharedPreferences的实例
  late final Future<SharedPreferences> _prefsFuture;

  // 私有构造函数,用于创建类的单例实例
  SharedPreferencesManager._internal() {
    _prefsFuture = _init();
  }

  // 异步初始化,确保在使用SharedPreferences之前已完成初始化
  Future<SharedPreferences> _init() async {
    return SharedPreferences.getInstance();
  }

  // 提供一个getter来获取单例对象
  static SharedPreferencesManager get instance => _instance;

  // 使用泛型方法来获取键对应的值。
  // 根据泛型参数T的类型,决定使用哪个SharedPreferences的getter方法。
  Future<T?> get<T>(SharedPreferencesKey key) async {
    final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
    String keyString = key.toString();
    // 尝试获取值,如果不存在则返回null
    Object? value;
    if (T == String) {
      value = prefs.getString(keyString) as T?;
    } else if (T == bool) {
      value = prefs.getBool(keyString) as T?;
    } else if (T == int) {
      value = prefs.getInt(keyString) as T?;
    } else if (T == double) {
      value = prefs.getDouble(keyString) as T?;
    } else if (T == List) {
      // 特别注意:我们假设List类型指的是List<String>
      value = prefs.getStringList(keyString) as T?;
    } else {
      // 如果类型不支持,则抛出异常
      //throw Exception('Unsupported type');
    }
    // 如果找不到值,则返回null,否则返回值
    return value as T?;
  }

  // 使用泛型方法设置值
  Future<bool> set<T>(SharedPreferencesKey key, T value) async {
    final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
    String keyString = key.toString();
    if (value is String) {
      return prefs.setString(keyString, value);
    } else if (value is bool) {
      return prefs.setBool(keyString, value);
    } else if (value is int) {
      return prefs.setInt(keyString, value);
    } else if (value is double) {
      return prefs.setDouble(keyString, value);
    } else if (value is List<String>) {
      return prefs.setStringList(keyString, value);
    } else {
      //throw Exception('Unsupported type');
      return false;
    }
  }
}

// MARK: 自定义方法
extension PrintHelperExtension on SharedPreferencesManager {}

/// 定义一个枚举,包含所有keys和它们对应的类型
enum SharedPreferencesKey {
  didGuide(bool), // 引导状态的键,与布尔类型关联
  isSubscribeValid(bool), // 订阅是否有效
  themeMode(String);

  // 存储枚举值关联的类型
  final Type type;
  // 枚举构造函数
  const SharedPreferencesKey(this.type);
}

3.封装SharedPreferencesManager(设置默认值)

import 'package:shared_preferences/shared_preferences.dart';

/// 管理SharedPreferences的键和值。
class SharedPreferencesManager {
  // 单例对象
  static final SharedPreferencesManager _instance = SharedPreferencesManager._internal();
  // SharedPreferences的实例
  late final Future<SharedPreferences> _prefsFuture;

  // 私有构造函数,用于创建类的单例实例
  SharedPreferencesManager._internal() {
    _prefsFuture = _init();
  }

  // 异步初始化,确保在使用SharedPreferences之前已完成初始化
  Future<SharedPreferences> _init() async {
    return await SharedPreferences.getInstance();
  }

  // 提供一个getter来获取单例对象
  static SharedPreferencesManager get instance => _instance;

  // 使用泛型方法来获取键对应的值。
  // 根据泛型参数T的类型,决定使用哪个SharedPreferences的getter方法。
  Future<T> get<T>(SharedPreferencesKey key) async {
    final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
    String keyString = key.toString();
    // 尝试获取值,如果不存在则返回null
    Object? value;
    if (T == String) {
      value = prefs.getString(keyString) ?? defaultValues[key] as T;
    } else if (T == bool) {
      value = prefs.getBool(keyString) ?? defaultValues[key] as T;
    } else if (T == int) {
      value = prefs.getInt(keyString) ?? defaultValues[key] as T;
    } else if (T == double) {
      value = prefs.getDouble(keyString) ?? defaultValues[key] as T;
    } else if (T == List) {
      // 特别注意:我们假设List类型指的是List<String>
      value = prefs.getStringList(keyString) ?? defaultValues[key] as T;
    } else {
      // 如果类型不支持,则抛出异常
      //throw Exception('Unsupported type');
    }
    // 如果找不到值,则返回null,否则返回值
    return value as T;
  }

  // 使用泛型方法设置值
  Future<bool> set<T>(SharedPreferencesKey key, T value) async {
    final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
    String keyString = key.toString();
    if (value is String) {
      return prefs.setString(keyString, value);
    } else if (value is bool) {
      return prefs.setBool(keyString, value);
    } else if (value is int) {
      return prefs.setInt(keyString, value);
    } else if (value is double) {
      return prefs.setDouble(keyString, value);
    } else if (value is List<String>) {
      return prefs.setStringList(keyString, value);
    } else {
      //throw Exception('Unsupported type');
      return false;
    }
  }

  // 这里定义所有默认值
  // 默认值一定要包含完整,要为每个key对应一个默认值
  static final Map<SharedPreferencesKey, Object> defaultValues = {
    SharedPreferencesKey.didGuide: false,
    SharedPreferencesKey.isSubscribeValid: false,
    SharedPreferencesKey.fontSizeProgress: 0.45,
    SharedPreferencesKey.fontColorHex: '#FFFFFFFF',
    SharedPreferencesKey.backgroundColorHex: '#7F000000',
  };
}

/// 定义一个枚举,包含所有keys和它们对应的类型
enum SharedPreferencesKey {
  // 引导状态的键,与布尔类型关联
  didGuide(bool),
  // 订阅是否有效
  isSubscribeValid(bool),

  // 设置-字体大小进度(0~1乘以最大字体)
  fontSizeProgress(double),
  // 设置-字体颜色
  fontColorHex(String),
  // 设置-字体背景色
  backgroundColorHex(String);

  // 存储枚举值关联的类型
  final Type type;
  // 枚举构造函数
  const SharedPreferencesKey(this.type);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值