如何借助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:
- 在
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注解:
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; } }
- 运行命令生成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
相关产品推荐
相关产品推荐

