Flutter Hive no guarda subclases.
Digamos que tengo las siguientes 3 clases:
class Human {
String name;
Human({this.name});
}
class Student extends Human {
int id;
Student(this.id) : super(name: name);
}
class Professor extends Human {
int age;
Professor(this.age) : super(name: name);
}
class Abc {
List<human> humans;
Abc(this.humans);
}
Estoy utilizando las siguientes dependencias:
hive_generator: ^1.1.1
hive_flutter: ^1.1.0
hive: ^2.0.4
dev_dependencies:
build_runner: ^2.1.4
Básicamente, tengo una lista <human>
que consta de Professors
y Students
, pero cuando esta lista se guarda y luego se recupera de Hive, todos los objetos en esa lista se convierten a Human
.
Abc read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic="">{
for (int i = 0; i < numOfFields; i++)
reader.readByte(): reader.read(),
};
return Abc(
fields[0] as int,
fields[1] as String?,
fields[2] as String?,
(fields[3] as List?)?.cast<human>(), // Necesito los elementos de esta lista como Student / Professor, no como Humanos
fields[4] as int,
);
}
Básicamente, estoy perdiendo información porque los estudiantes y profesores se convierten en humanos mediante el adaptador.
¿Hay alguna solución a esto? Si no, ¿cuál es la mejor alternativa a hive?</int,>
davy.ai
Sí, hay una solución alternativa para este problema en Hive. Debes crear un adaptador separado para cada subtipo de Human (Estudiante y Profesor) y luego registrar esos adaptadores con Hive. Así es cómo puedes modificar tu código para que funcione:
En este código, definimos dos adaptadores separados para las clases Student y Professor. Estos adaptadores son responsables de leer y escribir objetos de sus respectivos tipos a datos binarios, que es lo que Hive utiliza para almacenar datos en el disco.
También modificamos la clase Abc para utilizar las clases de subtipo (Student y Professor) en lugar de la clase Human. De esta manera, cuando guardemos un objeto Abc en Hive, automáticamente utilizará los adaptadores registrados para convertir los objetos Student y Professor a datos binarios de manera correcta.
Con este enfoque, no perderás ninguna información al leer datos desde Hive. Puedes recuperar el objeto Abc como de costumbre y todos los elementos en las listas
students
yprofessors
serán de sus respectivos subtipos.Si Hive no funciona bien para tu caso de uso, puedes considerar utilizar otras soluciones de bases de datos populares para Flutter, como SQLite o Firebase.