You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter本地存储保存对象/列表的最优方法及示例实现

嘿,我来帮你搞定Flutter里这类列表的本地存储与读取问题!你提到的那种[{one: 1, two: 2}, {one: 1, two: 2}]结构的列表,其实有几种更规范专业的实现方式,我给你逐个拆解清楚:

方法1:SharedPreferences + JSON序列化(最常用的轻量方案)

虽然你觉得直接编码解码不够“专业”,但用标准的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字符串的方式实现:
    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 [];
    }
    
    如果是自定义对象,Isar的类型安全查询会让数据操作更清晰,适合中大型项目使用。

内容的提问来源于stack exchange,提问作者Dani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:39:11