我正在尝试找出 Flutter 中的 Hive 包。但是,它向我显示了一个错误。
错误说:“类型'_InternalLinkedHashMap<dynamic,dynamic>'不是'kvPairs'的'Map<dynamic,TOTPModel>'类型的子类型”
我正在使用带有 BLoC 模式的 Hive 包。
这是应用程序的外观:
代码:
manual_input_bloc.dart
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:dart_otp/dart_otp.dart';
import 'package:duckie/models/totp/totp_model.dart';
import 'package:hive/hive.dart';
import 'package:meta/meta.dart';
part 'manual_input_event.dart';
part 'manual_input_state.dart';
class ManualInputBloc extends Bloc<ManualInputEvent, ManualInputState> {
ManualInputBloc() : super(ManualInputInitial());
@override
Stream<ManualInputState> mapEventToState(
ManualInputEvent event,
) async* {
Box box = await Hive.openBox<TOTPModel>('totpmodel');
if (event is GetFormTextEvent) {
if (event.secretKey == null ||
event.issuer == null ||
event.accountName == null) {
yield ManualInputError(
'all-fields-error-title', 'all-fields-error-content');
} else {
try {
final TOTP totp = TOTP(
secret: event.secretKey,
digits: int.parse(event.numberOfDigits),
interval: int.parse(event.timeStep),
);
final String otp = totp.now();
box.putAll({
'otp': otp,
'issuer': event.issuer,
'accountName': event.accountName
});
print(box.get('totpmodel'));
yield ManualInputFinal(
otp,
event.issuer,
event.accountName,
);
} catch (error) {
yield ManualInputError('totp-fail-title', 'totp-fail-content');
print(error.toString());
}
}
}
}
}
totp_model.dart
import 'package:hive/hive.dart';
part 'totp_model.g.dart';
@HiveType(typeId: 0)
class TOTPModel {
@HiveField(0)
String otp;
@HiveField(1)
String issuer;
@HiveField(2)
String accountName;
TOTPModel(this.otp, this.issuer, this.accountName);
}
totp_model.g.dart
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'totp_model.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class TOTPModelAdapter extends TypeAdapter<TOTPModel> {
@override
final int typeId = 0;
@override
TOTPModel read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return TOTPModel(
fields[0] as String,
fields[1] as String,
fields[2] as String,
);
}
@override
void write(BinaryWriter writer, TOTPModel obj) {
writer
..writeByte(3)
..writeByte(0)
..write(obj.otp)
..writeByte(1)
..write(obj.issuer)
..writeByte(2)
..write(obj.accountName);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is TOTPModelAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}