3
votes

Échec en raison de: Mauvais état: Aucune usine de générateur pour BuiltList

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.


0 commentaires

3 Réponses :


0
votes

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;
  }
}


2 commentaires

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 est un objet complexe qui ne ressemble pas à une chaîne ou à un nombre, j'utilise généralement formJson,



1
votes

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


1 commentaires

avez-vous régénéré vos classes après avoir effectué ce changement?



2
votes

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


2 commentaires

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 /…