Flutter 本地存储SharedPreferences技巧

在使用Flutter的SharedPreferences进行本地存储时,如何高效地存储和读取复杂数据结构(如List或Map)?我发现直接存储对象会报错,是否有推荐的序列化方法?另外,SharedPreferences的异步操作会导致页面初始化时数据未加载完成,有什么最佳实践能确保数据在Widget构建前就准备好?不同版本间的数据兼容性问题又该如何处理?

3 回复

在Flutter中使用SharedPreferences进行本地存储非常简单且高效。首先确保在pubspec.yaml中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.6

保存数据时,通过await调用相关方法即可:

import 'package:shared_preferences/shared_preferences.dart';

Future<void> saveData(String key, String value) async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setString(key, value);
}

读取数据也很方便:

Future<String?> readData(String key) async {
  final prefs = await SharedPreferences.getInstance();
  return prefs.getString(key);
}

一些技巧:

  1. 使用默认值防止空值:如prefs.getString(key) ?? "default_value"
  2. 批量读写:通过setInt, setBool等支持多种类型。
  3. 注意线程安全:SharedPreferences是线程安全的,但需确保异步操作完成后再访问。
  4. 清理数据:可调用remove()clear()清除特定键或全部数据。

示例完整代码:

final prefs = await SharedPreferences.getInstance();
await prefs.setString('name', '张三');
final name = prefs.getString('name') ?? '未知';
print(name); // 输出:张三

更多关于Flutter 本地存储SharedPreferences技巧的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


作为屌丝程序员,分享个Flutter本地存储的小技巧:SharedPreferences是轻量级的键值存储方案。首先,记得导入包shared_preferences: ^2.0.6。使用时先调用await SharedPreferences.getInstance()获取实例,然后用setString, setInt, setBool等方法存数据,用getString, getInt, getBool取数据,别忘了默认值哦!比如prefs.getString('name', defaultValue: 'Guest')

记得操作前加await,存完最好检查下是否成功。另外,避免频繁读写,这会影响性能。还有,不要存敏感信息,它不安全。实在要存,考虑加密后再存。这个小工具虽简单,但在配置文件、主题设置啥的场景超好用,快去试试吧!

Flutter中使用SharedPreferences进行本地存储的几个实用技巧:

  1. 初始化封装 建议封装初始化代码以避免重复调用:
Future<SharedPreferences> getPrefs() async {
  return await SharedPreferences.getInstance();
}
  1. 类型安全操作 使用类型明确的读写方法:
// 写入
prefs.setInt('counter', 10);
prefs.setString('name', 'Flutter');
prefs.setBool('isDarkMode', true);

// 读取
int count = prefs.getInt('counter') ?? 0;
  1. 批量操作 使用commit()进行批量写入:
await prefs.setInt('counter', 10)
  .then((_) => prefs.setString('name', 'Flutter'))
  .then((_) => prefs.setBool('isDarkMode', true));
  1. 安全删除 删除数据前先检查是否存在:
if(prefs.containsKey('key')) {
  await prefs.remove('key');
}
  1. 复杂数据存储 存储JSON数据:
// 写入
prefs.setString('user', jsonEncode(user.toJson()));

// 读取
Map userMap = jsonDecode(prefs.getString('user') ?? '{}');

注意事项:

  • SharedPreferences不适合存储大量数据
  • iOS最大支持约1MB数据
  • Android默认存储在XML文件中
  • 考虑使用hive或sqflite处理更复杂的数据
回到顶部