Flutter中的SharedPreferences:优雅的持久化解决方案

时间:2025-01-19 00:22 分类:C++教程

在Flutter开发中,持久化数据是应用功能的重要组成部分。其中,SharedPreferences是一个轻量级的存储解决方案,适用于存储少量的键值对数据。本文将介绍如何优雅地使用SharedPreferences,并通过实际代码示例展示其简单的封装和使用方法。

一、初始化与同步处理

在使用SharedPreferences之前,首先需要进行初始化。初始化后,可以使用同步方法来存储和获取数据。以下是一个简单的封装示例:

class SpHelper {
  static SpHelper? _instance;
  static late SharedPreferences prefs;
  static final Lock _lock = Lock();

  static Future<SpHelper?> init() async {
    if (_instance == null) {
      await _lock.synchronized(() async {
        if (_instance == null) {
          var singleton = SpHelper();
          await singleton._init();
          _instance = singleton;
        }
      });
    }
    return _instance!;
  }

  Future<void> _init() async {
    prefs = await SharedPreferences.getInstance();
  }

  static Future<void> putStorage(String key, value) async {
    if (value is String) {
      prefs.setString(key, value);
    } else if (value is int) {
      prefs.setInt(key, value as int);
    } else if (value is double) {
      prefs.setDouble(key, value);
    } else if (value is bool) {
      prefs.setBool(key, value);
    } else if (value is List<String>) {
      prefs.setStringList(key, value.cast<String>());
    }
  }

  static T getStorage<T>(String key, [T? replace]) {
    if (prefs == null) return replace!;
    return prefs.get(key) ?? replace;
  }

  // 其他方法如 putString, getString, putInt, getInt, putBool, getBool, getStringList 等
}

在应用初始化时,需要调用SpHelper.init()来进行初始化:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SpHelper.init();
  runApp(MainApp(key: appKey),);
}

二、简化存取操作

为了进一步简化对SharedPreferences的存取操作,可以创建一个属性代理类SpProperty,并通过定义一个共享的存取方法来封装这些操作。

class SpProperty<T> {
  final String key;
  final T defaultValue;

  const SpProperty(this.key, this.defaultValue);

  T get value {
    switch (T) {
      case String:
        return SpHelper.getString(key, defaultValue as String) as T;
      case int:
        return SpHelper.getInt(key, defaultValue as int) as T;
      case bool:
        return SpHelper.getBool(key, defaultValue as bool) as T;
      case List<String>:
        return SpHelper.getStringList(key) as T;
      default:
        return SpHelper.getStorage(key, defaultValue) as T;
    }
  }

  Future<void> setValue(T value) async {
    switch (T) {
      case String:
        await SpHelper.putString(key, value as String);
        break;
      case int:
        await SpHelper.putInt(key, value as int);
        break;
      case bool:
        await SpHelper.putBool(key, value as bool);
        break;
      case List<String>:
        await SpHelper.putStringList(key, value as List<String>);
        break;
      default:
        await SpHelper.putStorage(key, value);
    }
  }
}

class SettingPrefer {
  static const themeModeInt = SpProperty<int>("AppThemeMode", 2);
  static const useTest = SpProperty<bool>("use_test", false);
}

最后,可以通过简单的调用SettingPrefer.themeModeInt.setValue(1)来设置值,并通过SettingPrefer.themeModeInt.value来获取值。

三、总结与展望

通过上述方法,我们可以在Flutter应用中优雅地使用SharedPreferences进行数据持久化。这种方法不仅简化了代码,还提高了代码的可维护性和可读性。当然,这只是一个简单的示例,实际开发中可能需要根据具体需求进行更多的封装和扩展。

希望本文能为大家在Flutter开发中提供一些有用的参考和启示。如果有更简单、更实用的方案,欢迎在评论区分享!

声明:

1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。

2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。

3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。

4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 0人参与,0条评论
查看更多

Copyright 2005-2024 yuanmayuan.com 源码园 版权所有 备案信息

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告