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

如何借助Student模型将API响应数据存入Hive数据库?

正确将API响应转换为Student模型并存入Hive数据库

核心疑问解答

你应该使用Student.fromJson来解析API响应。因为你的API返回数据结构是外层包含StudentData数组的对象,和Student类的定义完全匹配:Student类中的studentData字段对应API里的StudentData数组,而StudentData是单个学生的详细数据模型,会被Student.fromJson内部自动调用StudentData.fromJson来解析数组中的每一项。

步骤1:为Hive适配自定义模型

Hive默认无法直接存储自定义对象,需要为Student和StudentData生成TypeAdapter:

  1. 在pubspec.yaml中添加依赖:
dependencies:
  hive: ^2.2.3
  hive_flutter: ^1.1.0

dev_dependencies:
  hive_generator: ^1.1.5
  build_runner: ^2.1.11
  1. 修改模型类,添加Hive注解:
import 'package:hive/hive.dart';

// 为Student类注册唯一类型ID
@HiveType(typeId: 0)
class Student {
  @HiveField(0)
  List<StudentData>? studentData;

  Student({this.studentData});

  Student.fromJson(Map<String, dynamic> json) {
    if (json['StudentData'] != null) {
      studentData = <StudentData>[];
      json['StudentData'].forEach((v) {
        studentData!.add(StudentData.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.studentData != null) {
      data['StudentData'] = this.studentData!.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

// 为StudentData类注册唯一类型ID
@HiveType(typeId: 1)
class StudentData {
  @HiveField(0)
  String? formId;
  @HiveField(1)
  String? campusID;
  @HiveField(2)
  String? name;
  // 其余字段依次添加@HiveField注解,索引值按顺序递增即可
  // ...(省略其余字段的注解代码)

  StudentData({/* 原有构造函数参数不变 */});

  StudentData.fromJson(Map<String, dynamic> json) {
    // 原有解析逻辑不变
    formId = json['FormId'];
    campusID = json['CampusID'];
    name = json['Name'];
    // ...其余字段解析代码
  }

  Map<String, dynamic> toJson() {
    // 原有序列化逻辑不变
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['FormId'] = this.formId;
    data['CampusID'] = this.campusID;
    data['Name'] = this.name;
    // ...其余字段序列化代码
    return data;
  }
}
  1. 运行命令生成TypeAdapter:
flutter packages pub run build_runner build

步骤2:修改fetchStudentData方法解析并存储数据

更新数据获取方法,将API响应解析为Student对象后存入Hive:

static Future<void> fetchStudentData() async {
  // 全局初始化建议放在main函数中,避免重复操作
  // await Hive.initFlutter();
  // Hive.registerAdapter(StudentAdapter());
  // Hive.registerAdapter(StudentDataAdapter());

  var box = await Hive.openBox('studentDetails');
  final pref = await SharedPreferences.getInstance();

  try {
    print('try block${pref.getString('token')}');
    final response = await http.get(
      Uri.parse('https:my api url'),
      headers: {
        'Authorization': 'Bearer ${pref.getString('token')}',
      },
    );

    if (response.statusCode == 200) {
      final Map<String, dynamic> data = json.decode(response.body);
      // 用Student.fromJson解析整个API响应
      Student student = Student.fromJson(data);
      // 将Student对象存入Hive
      await box.put('student_model', student);
      
      print('Saved ===${box.get('student_model')}');
    } else {
      throw Exception('Failed to load student data');
    }
  } catch (error) {
    throw Exception('Error: $error');
  }
}

步骤3:从Hive读取Student模型数据

需要读取时直接从Box中取出即可:

Future<Student?> getStudentData() async {
  var box = await Hive.openBox('studentDetails');
  return box.get('student_model') as Student?;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:13:15