【问题标题】:Error in converting JSON to Model : type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'String'将 JSON 转换为模型时出错:类型 '_InternalLinkedHashMap<dynamic, dynamic>' 不是类型 'String' 的子类型
【发布时间】:2021-03-04 08:49:14
【问题描述】:

在我的 Flutter 代码中,我得到以下 JSON 输入

{chat_mode: supplier, 
 last_message: Hello World, 
  members: {one: {name: yohan, photo: https://com/google.jpg, uid: qwer}, 
  two: {name: gayan, photo: https://ih1.u1.jpg, uid: abcd}}}

实际上这是来自 Firebase 数据库的数据。如果我导出数据库,它看起来像这样

"chat_room" : {
    "-MMbVLc0ucT4rck8zWGB" : {
      "chat_mode" : "supplier",
      "last_message" : "Hello World",
      "members" : {
        "one" : {
          "name" : "yohan",
          "photo" : "https://img-authors.flaticon.com/google.jpg",
          "uid" : "qwer"
        },
        "two" : {
          "name" : "gayan",
          "photo" : "https://ih1.redbubble.net/image.1057254628.1918/flat,750x,075,f-pad,750x1000,f8f8f8.u1.jpg",
          "uid" : "abcd"
        }
      }
    },
    "-MMbbviIhWjtXh5mwspG" : {
      "chat_mode" : "supplier",
      "last_message" : "Hello World",
      "members" : {
        "one" : {
          "name" : "yohan",
          "photo" : "https://img-authors.flaticon.com/google.jpg",
          "uid" : "K9ioYyiEUQVVNjx0owwsaZJzPph2"
        },
        "two" : {
          "name" : "gayan",
          "photo" : "https://ih1.redbubble.net/image.1057254628.1918/flat,750x,075,f-pad,750x1000,f8f8f8.u1.jpg",
          "uid" : "K9ioYyiEUQVVNjx0owwsaZJzPph2abcd"
        }
      }
    }
  }

我正在使用Models,所以上面的结构是由他们生成并保存在数据库中的。以下是型号

ChatRoomModel

import 'chat_member_model.dart';

class ChatRoomModel {
    ChatRoomModel({
        this.chatMode,
        this.lastMessage,
        this.members,
        this.timestamp,
    });

    String chatMode;
    String lastMessage;
    Map<String, Member> members;
    int timestamp;

    factory ChatRoomModel.fromJson(Map<String, dynamic> json) => ChatRoomModel(
        chatMode: json["chat_mode"],
        lastMessage: json["last_message"],
        members: Map.from(json["members"]).map((k, v) => MapEntry<String, Member>(k, Member.fromJson(v))),
        timestamp: json["timestamp"],
    );

    Map<String, dynamic> toJson() => {
        "chat_mode": chatMode,
        "last_message": lastMessage,
        "members": Map.from(members).map((k, v) => MapEntry<String, dynamic>(k, v.toJson())),
        "timestamp": timestamp,
    };
}

会员

class Member {
    Member({
        this.name,
        this.photo,
        this.uid
    });

    String name;
    String photo;
    String uid;

    factory Member.fromJson(Map<String, dynamic> json) => Member(
        name: json["name"],
        photo: json["photo"],
        uid: json["uid"],
    );

    Map<String, dynamic> toJson() => {
        "name": name,
        "photo": photo,
        "uid": uid,
    };
}

为了从服务器读取传入的 JSON,我使用 DataSnapshot 并尝试将其转换为模型。下面是代码。

import 'dart:convert' as convert;

print(snapshot.value);
print("HERE WE GO!!");
ChatRoomModel chatRoomModel = ChatRoomModel.fromJson(convert.json.decode(snapshot.value));

很遗憾,这会触发以下错误,我无法执行转换。

flutter: {chat_mode: supplier, last_message: Hello World, members: {one: {name: yohan, photo: https://img-authors.flaticon.com/google.jpg, uid: qwer}, two: {name: gayan, photo: https://ih1.redbubble.net/image.1057254628.1918/flat,750x,075,f-pad,750x1000,f8f8f8.u1.jpg, uid: abcd}}}
flutter: HERE WE GO!!
[VERBOSE-2:ui_dart_state.cc(177)] Unhandled Exception: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'String'

我该如何解决这个问题?

编辑

我也试过了,还是不行

ChatRoomModel chatRoomModel = ChatRoomModel.fromJson(snapshot.value);

我收到此错误

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

【问题讨论】:

    标签: android ios json flutter dart


    【解决方案1】:

    这是因为snapshot.valueMap 类型,而convert.json.decode 方法所需的参数类型是String 类型。

    所以,当你调用convert.json.decode(snapshot.Value)时,会报错类型

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

    你可以试着这样称呼它:

    ChatRoomModel chatRoomModel = ChatRoomModel.fromJson(Map<String, dynamic>.from(snapshot.value));
    

    【讨论】:

    • 同样的错误E/flutter (12969): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type '_InternalLinkedHashMap&lt;dynamic, dynamic&gt;' is not a subtype of type 'Map&lt;String, dynamic&gt;'
    • 使用Map.castFrom,这发生在哪一行?您可能必须在声明 Map parameter,chatrrom, member 的任何地方使用它
    猜你喜欢
    • 2019-08-28
    • 2020-03-03
    • 2021-04-03
    • 2018-12-14
    • 1970-01-01
    • 2021-10-23
    • 2019-09-19
    • 2019-03-14
    • 2021-06-17
    相关资源
    最近更新 更多