Анализ объекта в dart (необработанное исключение: тип ‘_InternalLinkedHashMap’ не является подтипом типа ‘Map’)

#json #list #flutter #dart #google-cloud-firestore

#json #Список #трепетание #dart #google-cloud-firestore

Вопрос:

Когда я пытаюсь преобразовать json в объект, появляется эта ошибка:

 Unhandled Exception: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'
  

Это происходит только тогда, когда я пытаюсь преобразовать List тип объектов и Chat объект,
вот класс и функция fromJson для объекта.
Я не знаю, что не так с преобразованием.

 class Project {
  String projectID;
  String projectName;
  String image;
  String joiningLink;
  bool isJoiningLinkEnabled;
  String pinnedMessage;
  Chat chat;
  List<Event> event;
  List<Member> members;
  List<String> membersIDs;
  List<Task> task;

  Project(
      {this.projectID,
        this.projectName,
        this.image,
        this.joiningLink,
        this.isJoiningLinkEnabled,
        this.pinnedMessage,
        this.chat,
        this.event,
        this.members,
        this.membersIDs,
        this.task});

  // Exception shows here
  Project.fromJson(Map<String, dynamic> json) {
    projectID = json['projectID'];
    projectName = json['projectName'];
    image = json['image'];
    joiningLink = json['joiningLink'];
    isJoiningLinkEnabled = json['isJoiningLinkEnabled'];
    pinnedMessage = json['pinnedMessage'];
    if (json['event'] != null) {
      event = new List<Event>();
      json['event'].forEach((v) {
        event.add(new Event.fromJson(v));
      });
    }
    chat = json['chat'] != null ? new Chat.fromJson(json['chat']) : null;
    if (json['members'] != null) {
      members = new List<Member>();
      json['members'].forEach((v) {
        members.add(new Member.fromJson(v));
      });
    }
    membersIDs = List.of(json['membersIDs'].cast<String>());
    if (json['Task'] != null) {
      task = new List<Task>();
      json['Task'].forEach((v) {
        task.add(new Task.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['projectID'] = this.projectID;
    data['projectName'] = this.projectName;
    data['image'] = this.image;
    data['joiningLink'] = this.joiningLink;
    data['isJoiningLinkEnabled'] = this.isJoiningLinkEnabled;
    data['pinnedMessage'] = this.pinnedMessage;
    if (this.chat != null) {
      data['chat'] = this.chat.toJson();
    }
    if (this.event != null) {
      data['event'] = this.event.map((v) => v.toJson()).toList();
    }
    if (this.members != null) {
      data['members'] = this.members.map((v) => v.toJson()).toList();
    }
    data['membersIDs'] = this.membersIDs;
    if (this.task != null) {
      data['Task'] = this.task.map((v) => v.toJson()).toList();
    }
    return data;
  }
}
  

Ответ №1:

кажется, что декодер ( json.decoder возможно) декодирует все объекты на карте, но чат декодируется таким образом, что он не может интерпретировать ключ String , поэтому он использует a <dynamic, dynamic> , вы могли бы попытаться создать карту, преобразующую динамику в строку, и передать ее в качестве аргумента Chat.fromJson() (который, я полагаю, он принимаеткарта <Строка, динамический> в качестве аргумента, и именно поэтому она выдает ошибку)

 chat = json['chat'] != null ? new Chat.fromJson(Map<String,dynamic>.from(json['chat'])) : null;