J'utilise builtvalue pour ma classe PODO
Voici ma réponse json
part of serializers;
Serializers _$serializers = (new Serializers().toBuilder()
..add(SpecialisationModelFirstScreen.serializer))
.build();
J'ai créé une valeur construite pour cela
Voici les classes
library specialisation_model_first_screen;
import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
part 'specialisation_model_first_screen.g.dart';
abstract class SpecialisationModelFirstScreen
implements
Built<SpecialisationModelFirstScreen,
SpecialisationModelFirstScreenBuilder> {
SpecialisationModelFirstScreen._();
factory SpecialisationModelFirstScreen(
[updates(SpecialisationModelFirstScreenBuilder b)]) =
_$SpecialisationModelFirstScreen;
@nullable
@BuiltValueField(wireName: 'status')
int get status;
@nullable
@BuiltValueField(wireName: 'msg')
String get msg;
@nullable
@BuiltValueField(wireName: 'allotmentMasterID')
String get allotmentMasterID;
@nullable
@BuiltValueField(wireName: 'allotmentInfoID')
String get allotmentInfoID;
@nullable
@BuiltValueField(wireName: 'category')
BuiltList<Category> get category;
static Serializer<SpecialisationModelFirstScreen> get serializer =>
_$specialisationModelFirstScreenSerializer;
}
abstract class Category implements Built<Category, CategoryBuilder> {
Category._();
factory Category([updates(CategoryBuilder b)]) = _$Category;
@nullable
@BuiltValueField(wireName: 'categoryID')
String get categoryID;
@nullable
@BuiltValueField(wireName: 'categoryName')
String get categoryName;
@nullable
@BuiltValueField(wireName: 'selectedCount')
String get selectedCount;
@nullable
@BuiltValueField(wireName: 'status')
int get status;
static Serializer<Category> get serializer => _$categorySerializer;
}
library serializers;
import 'package:built_value/serializer.dart';
part 'package:dice_clutter/models/serializers/serializers.g.dart';
@SerializersFor(const [SpecialisationModelFirstScreen])
Serializers serializers = _$serializers;
Serializers standardSerializers = (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
Voici mes serializers.g.dart file
{
"status": 1,
"msg": "Success",
"allotmentMasterID": "1",
"allotmentInfoID": "1",
"category": [
{
"categoryID": "1",
"categoryName": "Major",
"selectedCount": "0",
"status": 1
},
{
"categoryID": "2",
"categoryName": "Mandatory",
"selectedCount": "0",
"status": 0
},
{
"categoryID": "3",
"categoryName": "Minor",
"selectedCount": "0",
"status": 0
}
]
}
Lorsque je fais une demande api , j'obtiens la réponse correctement mais l'erreur suivante est générée
a échoué en raison de: Mauvais état: aucune usine de construction pour BuiltList . Correction en ajoutant un, voir SerializersBuilder.addBuilderFactory. ceci est un bogue dans la bibliothèque build value elle-même ou est-ce que je fais quelque chose de mal?
Dans certains cas - et je ne comprends pas entièrement les raisons spécifiques - mes objets ne se désérialisent pas avec StandartJsonPlugin.
3 Réponses :
basé sur JSON et sérialisation - Flutter et votre code,
il vous manque de Json,
en utilisant JSON to Dart
voir la fonction fromJson
class Autogenerated {
int status;
String msg;
String allotmentMasterID;
String allotmentInfoID;
List<Category> category;
Autogenerated(
{this.status,
this.msg,
this.allotmentMasterID,
this.allotmentInfoID,
this.category});
Autogenerated.fromJson(Map<String, dynamic> json) {
status = json['status'];
msg = json['msg'];
allotmentMasterID = json['allotmentMasterID'];
allotmentInfoID = json['allotmentInfoID'];
if (json['category'] != null) {
category = new List<Category>();
json['category'].forEach((v) {
category.add(new Category.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['status'] = this.status;
data['msg'] = this.msg;
data['allotmentMasterID'] = this.allotmentMasterID;
data['allotmentInfoID'] = this.allotmentInfoID;
if (this.category != null) {
data['category'] = this.category.map((v) => v.toJson()).toList();
}
return data;
}
}
class Category {
String categoryID;
String categoryName;
String selectedCount;
int status;
Category(
{this.categoryID, this.categoryName, this.selectedCount, this.status});
Category.fromJson(Map<String, dynamic> json) {
categoryID = json['categoryID'];
categoryName = json['categoryName'];
selectedCount = json['selectedCount'];
status = json['status'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['categoryID'] = this.categoryID;
data['categoryName'] = this.categoryName;
data['selectedCount'] = this.selectedCount;
data['status'] = this.status;
return data;
}
}
Cette partie, je suppose, est facultative car je n'ai pas écrit pour mon autre Api Response et elles fonctionnent bien pour moi. Même dans le spectacle ennuyeux, ils n'ont pas inclus la partie json
@Nudge oui, pas sûr 🤷♂️ si c'est nécessaire, mais BuiltList
Vous devez ajouter la classe Category à la liste des classes qui peuvent être sérialisées:
@SerializersFor(const [ SpecialisationModelFirstScreen, Category, <-- Category available for serialization ])
puis régénérer vos classes built_value .
Pour plus de détails, consultez cette réponse
avez-vous régénéré vos classes après avoir effectué ce changement?
J'ai dû éditer mon fichier serializers.g.dart comme suit
Serializers _$serializers = (new Serializers().toBuilder()
..add(SpecialisationModelFirstScreen.serializer)
..add(Category.serializer)
..addBuilderFactory(
const FullType(
BuiltList, const [const FullType(Category)]),
() => new ListBuilder<Category>())
)
.build();
Merci à Tensor Programming Vidéo sur Youtube
Il y a un bug dans la bibliothèque builtvalue car elle n'est pas capable de générer correctement serializers.g.dart dans certains cas. J'espère que cela sera résolu à l'avenir
Vous ne devez pas et ne devez pas modifier les fichiers générés. Voir la réponse de @ jordan-davies. La manière correcte de résoudre ce problème est que vous devez ajouter votre classe à l'annotation @SerializersFor , voir aussi: stackoverflow.com/a/47826184/85472
Je dois également ajouter que si vous devez appeler ..addBuilfFactory () comme vous le faites pour une liste construite, vous devez le faire dans votre propre code où vous avez vos sérialiseurs, par exemple voir built_values own tests: github.com/google/built_value. dart / blob / master / built_value / t est /…