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

如何在Flutter的Hive中存储并检索Rest API返回的对象数据?

实现方案:将API数据存入Hive并检索关联节点

完全可以把这类结构的数据存入Hive并实现目标检索,下面是具体操作步骤:

1. 搭建Hive基础环境

  • 在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:
    void main() async {
      await Hive.initFlutter();
      await Hive.openBox('delivery_data');
      runApp(MyApp());
    }
    

2. 数据存储方案

根据你的需求,提供两种存储方式供选择:

方式一:直接存储原始Map(快速实现)

无需定义数据类,直接将API返回的Map存入Hive:

// 假设apiResponse是从Rest API获取到的Map<String, dynamic>
final box = Hive.box('delivery_data');
await box.put('delivery_info', apiResponse);

方式二:使用Hive自定义对象(强类型更安全)

先创建对应的数据类并生成适配器:

  1. 定义数据类:
import 'package:hive/hive.dart';

part 'delivery_models.g.dart';

@HiveType(typeId: 0)
class DeliveryAddress {
  @HiveField(0)
  String deliveryAddressNo;

  @HiveField(1)
  bool isMain;

  @HiveField(2)
  List<PointOfService> pointsOfService;

  DeliveryAddress({
    required this.deliveryAddressNo,
    required this.isMain,
    required this.pointsOfService,
  });
}

@HiveType(typeId: 1)
class PointOfService {
  @HiveField(0)
  String posNo;
  // 根据你的数据结构补充其他字段

  PointOfService({required this.posNo});
}
  1. 运行命令生成适配器:
flutter packages pub run build_runner build
  1. 注册适配器并存入解析后的数据:
// 在main函数初始化时注册适配器
Hive.registerAdapter(DeliveryAddressAdapter());
Hive.registerAdapter(PointOfServiceAdapter());

// 解析API数据为自定义对象
List<DeliveryAddress> addressList = (apiResponse['deliveryAddress'] as List)
    .map((item) => DeliveryAddress(
          deliveryAddressNo: item['deliveryAddressNo'],
          isMain: item['isMain'],
          pointsOfService: (item['pointsOfService'] as List)
              .map((pos) => PointOfService(posNo: pos['posNo']))
              .toList(),
        ))
    .toList();

// 存入Hive
final box = Hive.box('delivery_data');
await box.put('address_list', addressList);

3. 检索主地址关联的服务节点

针对方式一(原始Map存储):

final box = Hive.box('delivery_data');
Map<String, dynamic> data = box.get('delivery_info');

// 找到标记为main的地址
var mainAddress = (data['deliveryAddress'] as List)
    .firstWhere((addr) => addr['isMain'] == true);

// 获取对应的服务节点列表
List<dynamic> mainPosList = mainAddress['pointsOfService'];

针对方式二(自定义对象存储):

final box = Hive.box('delivery_data');
List<DeliveryAddress> addressList = box.get('address_list');

// 找到主地址
DeliveryAddress mainAddress = addressList.firstWhere((addr) => addr.isMain);

// 获取对应的服务节点列表
List<PointOfService> mainPosList = mainAddress.pointsOfService;

优化建议

如果数据量较大,建议将每个deliveryAddress单独存入Hive(用deliveryAddressNo作为key),同时单独存储主地址的编号,这样检索效率更高:

// 存储单个地址
await box.put(address.deliveryAddressNo, address);
// 记录主地址编号
await box.put('main_address_no', mainAddress.deliveryAddressNo);

// 后续检索主地址服务节点
DeliveryAddress mainAddr = box.get(box.get('main_address_no'));
List<PointOfService> mainPosList = mainAddr.pointsOfService;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:40:50