Flutter本地存储保存对象/列表的最优方法及示例实现
嘿,我来帮你搞定Flutter里这类列表的本地存储与读取问题!你提到的那种[{one: 1, two: 2}, {one: 1, two: 2}]结构的列表,其实有几种更规范专业的实现方式,我给你逐个拆解清楚:
虽然你觉得直接编码解码不够“专业”,但用标准的JSON序列化流程来处理会非常规范,而且不需要额外引入第三方库,适合轻量数据场景:
- 存储步骤:把列表序列化为JSON字符串,利用SharedPreferences的字符串存储能力
import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; Future<void> saveMyList() async { final prefs = await SharedPreferences.getInstance(); final _myList = [{"one": 1, "two": 2}, {"one": 1, "two": 2}]; // 将列表转为JSON字符串 final jsonString = jsonEncode(_myList); await prefs.setString('saved_my_list', jsonString); } - 读取步骤:读取字符串后反序列化为原列表结构
小贴士:如果你的列表里是自定义业务对象,推荐用Future<List<Map<String, dynamic>>> loadMyList() async { final prefs = await SharedPreferences.getInstance(); final jsonString = prefs.getString('saved_my_list'); if (jsonString != null) { // 反序列化并转换为指定类型的列表 final decodedList = jsonDecode(jsonString) as List<dynamic>; return decodedList.cast<Map<String, dynamic>>(); } // 无数据时返回空列表 return []; }json_serializable包自动生成序列化代码,避免手动写JSON转换的错误,更严谨可靠。
方法2:Hive(高性能的NoSQL本地存储)
如果想要更“专业”的本地存储方案,Hive是Flutter生态里的热门选择——它支持直接存储列表、Map甚至自定义对象,无需JSON转换,性能远超SharedPreferences:
- 第一步:添加依赖
在pubspec.yaml中加入:dependencies: hive: ^2.2.3 hive_flutter: ^1.1.0 dev_dependencies: hive_generator: ^1.1.5 build_runner: ^2.1.11 - 第二步:初始化Hive
在main.dart的入口处完成初始化:import 'package:hive_flutter/hive_flutter.dart'; void main() async { await Hive.initFlutter(); // 打开一个名为"app_storage"的存储盒子(类似数据库表) await Hive.openBox('app_storage'); runApp(const MyApp()); } - 第三步:存储与读取列表
如果需要存储自定义对象,只需让对象继承import 'package:hive/hive.dart'; // 存储列表 void saveListToHive() { final storageBox = Hive.box('app_storage'); final _myList = [{"one": 1, "two": 2}, {"one": 1, "two": 2}]; storageBox.put('my_list', _myList); } // 读取列表 List<Map<String, dynamic>> loadListFromHive() { final storageBox = Hive.box('app_storage'); // 直接读取并转换类型,无数据时返回空列表 return storageBox.get('my_list', defaultValue: []).cast<Map<String, dynamic>>(); }HiveObject并生成适配器,就能直接存储,完全不用处理JSON转换,非常省心。
方法3:Isar(新一代类型安全本地数据库)
Isar是近年兴起的Flutter本地数据库,支持跨平台、类型安全查询,也能轻松处理列表存储,适合复杂数据场景:
- 第一步:添加依赖
dependencies: isar: ^3.1.0+1 isar_flutter_libs: ^3.1.0+1 dev_dependencies: isar_generator: ^3.1.0+1 build_runner: ^2.4.4 - 第二步:初始化Isar
import 'package:isar/isar.dart'; import 'package:path_provider/path_provider.dart'; void main() async { final appDir = await getApplicationDocumentsDirectory(); final isar = await Isar.open( [], // 若有自定义对象,在此添加对应的适配器 directory: appDir.path, ); runApp(const MyApp()); } - 第三步:存储与读取列表
Isar主打面向对象存储,对于基础类型列表,我们可以通过存储JSON字符串的方式实现:
如果是自定义对象,Isar的类型安全查询会让数据操作更清晰,适合中大型项目使用。import 'dart:convert'; import 'package:isar/isar.dart'; // 先定义一个用于存储字符串的实体 @Collection() class StoredString { Id id = Isar.autoIncrement; late String key; late String value; } // 存储列表 Future<void> saveListToIsar() async { final isar = Isar.getInstance()!; final _myList = [{"one": 1, "two": 2}, {"one": 1, "two": 2}]; final jsonString = jsonEncode(_myList); await isar.writeTxn(() async { await isar.storedStrings.put(StoredString() ..key = 'my_list' ..value = jsonString); }); } // 读取列表 Future<List<Map<String, dynamic>>> loadListFromIsar() async { final isar = Isar.getInstance()!; final storedItem = await isar.storedStrings.filter() .keyEqualTo('my_list') .findFirst(); if (storedItem != null) { final decodedList = jsonDecode(storedItem.value) as List<dynamic>; return decodedList.cast<Map<String, dynamic>>(); } return []; }
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

