Флаттер(Дротик) — Как читать из списка в списке?

#json #list #flutter #dart

Вопрос:

Итак, у меня есть данные в этом формате:

 List users = [
  {
   "id": "p1",
   "name": "John Doe",
   "age": "44",
   "imageUrl": [
   {
    "assets/images/anastasia-vityukova-unsplash-blackandwhiteimage.png",
    "assets/images/anastasia-vityukova-unsplash.png",
  }
 ],
 "profession": "Financial Consultant"
 },

{
 "id": "p2",
 "name": "John Doe2",
 "age": "42",
 "imageUrl": [
  {
    "assets/images/good-faces-hiba-unsplash-blackandwhiteimage.png",
    "assets/images/good-faces-hiba-unsplash.jpg",
  }
 ],
 "profession": "Financial Consultant"
 },
];
 

Как мне прочитать изображения?

             decoration: BoxDecoration(
          image: DecorationImage(
              image: AssetImage(lstUsers[index]["imageUrl"][0]),
              fit: BoxFit.cover),
        ),
 

введите описание изображения здесь

Комментарии:

1. попробуйте использовать List<Map<String,String>> вместо List

Ответ №1:

Вы можете видеть, что массив ImageUrl структурирован следующим образом:

 "imageUrl": [
  {
    "assets/images/good-faces-hiba-unsplash-blackandwhiteimage.png",
    "assets/images/good-faces-hiba-unsplash.jpg",
  }
],
 

Первый элемент в массиве ImageUrl-это не строка, а набор (потому что он окружен фигурными скобками).
Если вы хотите получить доступ к первому активу в списке ImageUrl, удалите фигурные скобки и сделайте ImageUrl таким:

 "imageUrl": [
    "assets/images/good-faces-hiba-unsplash-blackandwhiteimage.png",
    "assets/images/good-faces-hiba-unsplash.jpg",
],


// Now when you use that it will return a String
lstUsers[index]["imageUrl"][0];
 

Если вы хотите сохранить структуру списка таким же образом, и вы все еще хотите получить доступ к первому ImageUrl, вы можете использовать следующий синтаксис:

 lstUsers[index]["imageUrl"][0].first;
 

Ответ №2:

Как говорится в ошибке, Dart рассматривает это поле как набор {} или, более конкретно, как a LinkedHashSet . Набор не реализует [] оператор, но вы можете получить доступ к его элементам с помощью метода elementAt .

 lstUsers[0]["imageUrl"][0].elementAt(1)
 

До тех пор, пока lstUsers[0]["imageUrl"][0] вы не выберете первый элемент внутри массива, но обратите внимание, что массив состоит не просто из строк, а из одного набора со строками внутри него.

 [{    "assets/images/anastasia-vityukova-unsplash-blackandwhiteimage.png",
    "assets/images/anastasia-vityukova-unsplash.png",  }]
 

Это причина, по которой вам нужно будет использовать .elementAt() для доступа к строкам.
Я бы рекомендовал, если это в ваших силах, отбросить {} все строки, чтобы к ним было легче получить доступ.
Или еще лучше создать классы, которые управляют сериализацией и десериализацией JSON. Хорошее место для начала-quicktype.