我正在使用hive进行本地缓存。
在这个应用程序中,我有一个名为user的配置单元对象。
class UserModel extends HiveObject implements Copyable<UserModel> {
UserModel({
required this.id,
required this.name,
});
@HiveField(0)
String id;
@HiveField(1)
String name;
factory UserModel.fromJson(Map<String,dynamic> json) => UserModel(
id: json['id'],
name: json['name']
);
}
class UserModelAdapter extends TypeAdapter<UserModel> {
@override
final typeId = 1;
@override
UserModel read(BinaryReader reader) {
var numOfFields = reader.readByte();
var fields = <int, dynamic>{
for (var i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return UserModel(
id: fields[0] as String,
name: fields[1] as String,
);
}
@override
void write (BinaryWriter writer, UserModel obj){
writer
..writeByte(2)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.name)
}
}
}
字符串
上面的用户模型是应用程序的一部分,现在已经上线了,它的工作和预期的一样。
class UserModel extends HiveObject implements Copyable<UserModel> {
UserModel({
required this.id,
required this.name,
required this.favourite
});
@HiveField(0)
String id;
@HiveField(1)
String name;
@HiveField(2)
List<String> favourite
factory UserModel.fromJson(Map<String,dynamic> json) => UserModel(
id: json['id'],
name: json['name'],
favourite : List<String>.from(
json["favourite"] ?? [].map((x) => x))
);
}
class UserModelAdapter extends TypeAdapter<UserModel> {
@override
final typeId = 1;
@override
UserModel read(BinaryReader reader) {
var numOfFields = reader.readByte();
var fields = <int, dynamic>{
for (var i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return UserModel(
id: fields[0] as String,
name: fields[1] as String,
favourite: fields[2] as List<String>
);
}
@override
void write (BinaryWriter writer, UserModel obj){
writer
..writeByte(3)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.name)
..writeByte(2)
..write(obj.favourite)
}
}
}
型
然而,在通过添加新字段更新如上所示的用户对象后,新版本的应用程序会因类型适配器抛出错误而中断。如何确保添加新字段不会中断应用程序?
1条答案
按热度按时间c9qzyr3d1#
我不确定这对你是否有用,但是对于这个问题的新手来说,
hive_generator
版本1.1.0和更高版本允许你传递一个命名参数defaultValue
到你的@HiveField
注解。因此,对于新创建的字段,可以给予如下所示的默认值:
字符串
如果
20
从该高速缓存中为空,则这将someNewField
作为第一值。自定义适配器
或者,作为第二种选择,您可以始终为您的Hive模型创建自定义适配器。这有点复杂和繁琐,但如果您来到这里寻求答案,您可能需要这种解决方案。如果字段的类型发生变化(出于某种原因),这种方法也很有用。
假设这是你的Hive模型:
型
这是生成的
some_model.g.dart
文件:型
如果你想将
someNewField
添加到这个类中,你可以像下面这样自定义类和适配器:剩下要做的就是将
CustomSomeModelAdapter
注册到hive:型