Dart - тип 'String' не является подтипом типа 'Iterable <dynamic>' - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь разобрать локальный файл JSON в dart и отобразить его значения.

user. json

[
    {
        "id": 1,
        "name": "Greg",
        "imageUrl": "assets/images/greg.jpg"
    },
    {
        "id": 2,
        "name": "James",
        "imageUrl": "assets/images/james.jpg"
    }
]

Вот мои чаты. json

[
    {
        "sender": "james",
        "time": "5:30 PM",
        "text": "Hey, how's it going? What did you do today?",
        "isLiked": false,
        "unread": true
    },
    {
        "sender": "olivia",
        "time": "4:30 PM",
        "text": "Hey, how's it going? What did you do today?",
        "isLiked": true,
        "unread": false
    }
]

Вот мой класс сообщений

class Message {
  final User sender;
  final String time;
  final String text;
  final bool isLiked;
  final bool unread;

  Message({
    this.sender,
    this.time,
    this.text,
    this.isLiked,
    this.unread,
  });

  factory Message.fromJson(Map<String, dynamic> parsedJson){
    return Message(
      sender: User.fromJson(parsedJson['sender']),
      time : parsedJson['time'],
      text : parsedJson ['text'],
      isLiked : parsedJson['isLiked'],
      unread : parsedJson ['unread'],      
    );
  }

  static List<User> parseUsers(usersJson) {
    List<User> usersList = new List<User>.from(usersJson);
    return usersList;
  }
}

Вот мой класс пользователя

class User {
  final int id;
  final String name;
  final String imageUrl;

  User({
    this.id,
    this.name,
    this.imageUrl,
  });

  factory User.fromJson(Map<String, dynamic> parsedJson){
    return User(
      id: parsedJson['id'],
      name : parsedJson['name'],
      imageUrl : parsedJson ['imageUrl']
    );
  }

}

Вот мой latest_chat.dart (это StatefulWidget)

List<Message> _messages = List<Message>();

  Future<String> _loadChatsAsset() async {
    return await rootBundle.loadString('assets/json/chats.json');
  }

  Future<List<Message>> loadChats() async {
    String jsonString = await _loadChatsAsset();
    var messages = List<Message>();
    final messagesJson = json.decode(jsonString);
    for (var messageJson in messagesJson){
      messages.add(Message.fromJson(messageJson));
    }
    return messages;
  }

  @override
  void initState() {
    loadChats().then((value) {
      setState(() {
        _messages.addAll(value);
      });
    });
    super.initState();
  }

Чтобы напечатать что-нибудь из моего JSON, я обычно делаю _messages [index]. sender.name или _messages [index] .text et c ...

Вышеупомянутый метод синтаксического анализа работал без вложенных объектов (только для пользователя). С вложенными объектами (пользователь внутри сообщения) я не могу определить источник следующей ошибки.

тип 'String' не является подтипом типа 'Iterable'

Это происходит на этом строка кода

Список usersList = new List.from (users Json);

Я не уверен, что мне не хватает. Можете ли вы помочь? Заранее спасибо

1 Ответ

1 голос
/ 27 апреля 2020

Как видно из вашего json, вы получаете просто строку как отправителя, но когда вы создаете объект сообщения, классу пользователя требуются три аргумента.

Это означает, что как отправитель в json там должен быть пользовательский объект.

{
   "id" : 1
    "name" : "Viren"
    "imageUrl" : 'someurl'
}

Ваш json и ваши выходные данные не совпадают.

Более того, ваша следующая строка также неверна.

  sender: parseUsers(parsedJson['sender']),

Изменить на это.

 sender: User.fromJson(parsedJson['sender'])

Обновление:

Ваш json должен быть таким, как показано ниже.

[
    {
        "sender": {
            "id": 1,
            "name": "Greg",
            "imageUrl": "assets/images/greg.jpg"
        },
        "time": "5:30 PM",
        "text": "Hey, how's it going? What did you do today?",
        "isLiked": false,
        "unread": true
    },
    {
        "sender": {
            "id": 2,
            "name": "James",
            "imageUrl": "assets/images/james.jpg"
        },
        "time": "4:30 PM",
        "text": "Hey, how's it going? What did you do today?",
        "isLiked": true,
        "unread": false
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...