_TypeError ( 'List <dynamic>'유형은 'Map <String, dynamic> 유형의 하위 유형이 아닙니다.

Nov 13 2020

Flutter에서이 오류를 해결하는 데 도움이 필요하십니까? 다른 화면에서이 콜백의 인스턴스를 사용하는 방법도 있습니까?

이것은 내 message.json 데이터 모델입니다.

[
    {
        "title": "Title 1",
        "body": "Lorem ipsum dolor sit amet. "
    },
    {
        "title": "Title 1",
        "body": "Lorem ipsum dolor sit amet. "
    },
]

내 message_model.dart

class MessagesList {
  final List<Message> messages;

  MessagesList(this.messages);

  factory MessagesList.fromJson(List<dynamic> parsedJson) {
    List<Message> messages = List<Message>();
    messages = parsedJson.map((e) => Message.fromJson(e)).toList();

    return MessagesList(messages);
  }
}

class Message {
  final String title;
  final String body;

  Message(this.title, this.body);

  factory Message.fromJson(Map<String, dynamic> json) {
    return Message(
      json['title'].toString(),
      json['body'].toString(),
    );
  }
}

이것은 내 message_services.dart입니다.

loadMessage 함수 (3 행-fromJson 메소드)의 _TypeError ( 'List'유형은 'Map <String, dynamic>'유형의 하위 유형이 아닙니다.) 왜?

Future<String> _loadMessageAsset() async {
  return await rootBundle.loadString("./data/message.json");
}

Future loadMessage() async {
  String jsonMessage = await _loadMessageAsset();
  final jsonResponse = jsonDecode(jsonMessage);
  Message message = Message.fromJson(jsonResponse);

  print("Message -- " + message.title);

}

답변

hasankaraman Nov 13 2020 at 21:17

messagejson은 json 객체가 아닌 JSON 배열을 반환하므로 List가 Map이 아닙니다.

 Future loadMessage() async {
   String jsonMessage = await _loadMessageAsset();
  Iterable jsonResponse = json.decode(jsonMessage);
   List<Message > Message = List<Message >.from(jsonResponse ).map((Map model)=> 
   Message .fromJson(model)).toList();
  print("Message -- " + message[0].title);

}
hasankaraman Nov 17 2020 at 16:17

모델에서 목록을 회전하는 방법이 잘못되었습니다. 수정할 수 있습니다. 주의 깊게 보면 이해할 수있을 것입니다.

  MessagesList  MessagesList FromJson(String str) => MessagesList 
  .fromJson(json.decode(str));

  String MessagesList ToJson(MessagesList  data) => json.encode(data.toJson());

 class MessagesList  {

  List<Message> flyForData;


   MessagesList ({

     this.messages,

      });
      ////////////this wrong
  factory MessagesList .fromJson(Map<String, dynamic> json) => MessagesList (
  
       messages: List<Message>.from(
          json["messages"].map((x) => Message.fromJson(x))),
    
       ); ////////////this wrong

   Map<String, dynamic> toJson() => {
 
       "messages": List<dynamic>.from(messages.map((x) => x.toJson())),
  
     };
  }

 class Message {
   final String title;
   final String body;
  Message({
   this.title, this.body
   });

  factory Message.fromJson(Map<String, dynamic> json) => Message(
       json['title'].toString(),
     json['body'].toString(),
     );

    Map<String, dynamic> toJson() => {
       "title": title,
       "body": body,
     };
  }