1

我正在尝试找出 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;
}

4

0 回答 0