Current structure
I have two classes named Student and Schoolclass.
Student extends Schoolclass so that the class Student can use the parameters gradeLevel and teacher.
Student class:
@annotation.XmlRootElement(name: 'Student')
@annotation.XmlSerializable()
class Student extends Schoolclass {
@annotation.XmlAttribute(name: 'name')
String name;
Student({
required this.name,
required int gradeLevel,
required String teacher,
}) : super(gradeLevel: gradeLevel, teacher: teacher,);
factory Student.fromXmlElement(XmlElement element) =>
_$StudentFromXmlElement(element);
@override
String toString() {
return 'Student{name: $name, gradeLevel: $gradeLevel, teacher: $teacher}';
}
void buildXmlChildren(
XmlBuilder builder, {
Map<String, String> namespaces = const {},
}) =>
_$StudentBuildXmlChildren(
this,
builder,
namespaces: namespaces,
);
void buildXmlElement(
XmlBuilder builder, {
Map<String, String> namespaces = const {},
}) =>
_$StudentBuildXmlElement(
this,
builder,
namespaces: namespaces,
);
List<XmlAttribute> toXmlAttributes({
Map<String, String?> namespaces = const {},
}) =>
_$StudentToXmlAttributes(
this,
namespaces: namespaces,
);
List<XmlNode> toXmlChildren({
Map<String, String?> namespaces = const {},
}) =>
_$StudentToXmlChildren(
this,
namespaces: namespaces,
);
XmlElement toXmlElement({
Map<String, String?> namespaces = const {},
}) =>
_$StudentToXmlElement(
this,
namespaces: namespaces,
);
}
Schoolclass class:
@annotation.XmlRootElement(name: 'Schoolclass')
@annotation.XmlSerializable()
abstract class Schoolclass {
@annotation.XmlAttribute(name: 'gradeLevel')
int gradeLevel;
@annotation.XmlAttribute(name: 'teacher')
String teacher;
Schoolclass ({
required this.gradeLevel,
required this.teacher,
});
factory Schoolclass.fromXmlElement(XmlElement element) =>
_$SchoolclassFromXmlElement(element);
@override
String toString() {
return 'Schoolclass{gradeLevel: $gradeLevel, teacher: $teacher}';
}
void buildXmlChildren(
XmlBuilder builder, {
Map<String, String> namespaces = const {},
}) =>
_$SchoolclassBuildXmlChildren(
this,
builder,
namespaces: namespaces,
);
void buildXmlElement(
XmlBuilder builder, {
Map<String, String> namespaces = const {},
}) =>
_$SchoolclassBuildXmlElement(
this,
builder,
namespaces: namespaces,
);
List<XmlAttribute> toXmlAttributes({
Map<String, String?> namespaces = const {},
}) =>
_$SchoolclassToXmlAttributes(
this,
namespaces: namespaces,
);
List<XmlNode> toXmlChildren({
Map<String, String?> namespaces = const {},
}) =>
_$SchoolclassToXmlChildren(
this,
namespaces: namespaces,
);
XmlElement toXmlElement({
Map<String, String?> namespaces = const {},
}) =>
_$SchoolclassToXmlElement(
this,
namespaces: namespaces,
);
}
Current output
When generating the serializer with flutter packages pub run build_runner build, I get the following output:
void _$StudentBuildXmlChildren(Student instance, XmlBuilder builder,
{Map<String, String> namespaces = const {}}) {
final name = instance.name;
final nameSerialized = name;
builder.attribute('name', nameSerialized);
}
void _$StudentBuildXmlElement(Student instance, XmlBuilder builder,
{Map<String, String> namespaces = const {}}) {
builder.element('Student', namespaces: namespaces, nest: () {
instance.buildXmlChildren(builder, namespaces: namespaces);
});
}
Student _$StudentFromXmlElement(XmlElement element) {
final name = element.getAttribute('name')!;
return Student(name: name);
}
List<XmlAttribute> _$StudentToXmlAttributes(Student instance,
{Map<String, String?> namespaces = const {}}) {
final attributes = <XmlAttribute>[];
final name = instance.name;
final nameSerialized = name;
final nameConstructed = XmlAttribute(XmlName('name'), nameSerialized);
attributes.add(nameConstructed);
return attributes;
}
List<XmlNode> _$StudentToXmlChildren(Student instance,
{Map<String, String?> namespaces = const {}}) {
final children = <XmlNode>[];
return children;
}
XmlElement _$StudentToXmlElement(Student instance,
{Map<String, String?> namespaces = const {}}) {
return XmlElement(
XmlName('Student'),
[
...namespaces.toXmlAttributes(),
...instance.toXmlAttributes(namespaces: namespaces)
],
instance.toXmlChildren(namespaces: namespaces));
}
void _$SchoolclassBuildXmlChildren(Schoolclass instance, XmlBuilder builder,
{Map<String, String> namespaces = const {}}) {
final gradeLevel = instance.gradeLevel;
final gradeLevelSerialized = gradeLevel.toString();
builder.attribute('gradeLevel', gradeLevelSerialized);
final teacher = instance.teacher;
final teacherSerialized = teacher;
builder.attribute('teacher', teacherSerialized);
}
void _$SchoolclassBuildXmlElement(Schoolclass instance, XmlBuilder builder,
{Map<String, String> namespaces = const {}}) {
builder.element('Schoolclass', namespaces: namespaces, nest: () {
instance.buildXmlChildren(builder, namespaces: namespaces);
});
}
Schoolclass _$SchoolclassFromXmlElement(XmlElement element) {
final gradeLevel = element.getAttribute('gradeLevel')!;
final teacher = element.getAttribute('teacher')!;
return Schoolclass(gradeLevel: int.parse(gradeLevel), teacher: teacher);
}
List<XmlAttribute> _$SchoolclassToXmlAttributes(Schoolclass instance,
{Map<String, String?> namespaces = const {}}) {
final attributes = <XmlAttribute>[];
final gradeLevel = instance.gradeLevel;
final gradeLevelSerialized = gradeLevel.toString();
final gradeLevelConstructed =
XmlAttribute(XmlName('gradeLevel'), gradeLevelSerialized);
attributes.add(gradeLevelConstructed);
final teacher = instance.teacher;
final teacherSerialized = teacher;
final teacherConstructed =
XmlAttribute(XmlName('teacher'), teacherSerialized);
attributes.add(teacherConstructed);
return attributes;
}
List<XmlNode> _$SchoolclassToXmlChildren(Schoolclass instance,
{Map<String, String?> namespaces = const {}}) {
final children = <XmlNode>[];
return children;
}
XmlElement _$SchoolclassToXmlElement(Schoolclass instance,
{Map<String, String?> namespaces = const {}}) {
return XmlElement(
XmlName('Schoolclass'),
[
...namespaces.toXmlAttributes(),
...instance.toXmlAttributes(namespaces: namespaces)
],
instance.toXmlChildren(namespaces: namespaces));
}
Expected behavior
The function _$StudentFromXmlElement() does not feature the parameters of the extended class and because the parameters are required by the constructor the function will not work.
Student _$StudentFromXmlElement(XmlElement element) {
final name = element.getAttribute('name')!;
return Student(name: name);
}
Question
How can polymorphism be achieved with dart-xml-serializable?