перебрать карту, содержащую список карт с каждым для - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно извлекать данные из API, когда я получаю данные, необходимые для их итерации по ним

проблема в том, что этот API структурирован так:

{
  "events": [
    {
      "image_url": "sun.jpg", 
      "name_ar": "sun",
      "name_en": "sun"
    }, 
    {
      "image_url": "sun.jpg", 
      "name_ar": "sun",
      "name_en": "sun"
    }, 
    ......
  ]
}

список карт внутрикарта

это мой код, так как forEach только дает мне ключ, а значение, которое ключ мне не нужен .. Мне остается только значение, мне нужен какой-то индекс


class Events with ChangeNotifier{
List<Event> _eventsList = [];
List<Event> get eventsList {
    return [..._eventsList];
  }
Future<void> fetchEvents(http.Client client) async {
    try {
      //fetch api
      final response =  await client.get(globals.apiUrl + '/events/');
      // json.decode
      final extractedData = json.decode(response.body) as Map<String, dynamic>;
      final List<Event> loadedEvents = [];
      //store events into a List<Event>
      extractedData.forEach((key,eventData) {
        print(key);//evnts
        print(eventData);//this gives the list of maps
        loadedEvents.add(Event(
          name_en: eventData[0]['name_en'],
          name_ar: eventData[0]['name_ar'],
          image_url: eventData[0]['image_url'],
        ));
      });
      _eventsList = loadedEvents;
      //for the provider
      notifyListeners();
    } catch (error) {
      throw (error);
    }
  }
}


//Event class 
class Event with ChangeNotifier {
  final String image_url;
  final String name_ar;
  final String name_en;

  Event({this.image_url, this.name_ar, this.name_en});
}


конечно, это приводит только к первому элементу события

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Нет необходимости повторять цикл, просто используйте https://app.quicktype.io/, чтобы сгенерировать класс модели для вашего ответа и используйте, как показано ниже

// To parse this JSON data, do
//
//     final eventsResponse = eventsResponseFromJson(jsonString);

import 'dart:convert';

EventsResponse eventsResponseFromJson(String str) => EventsResponse.fromJson(json.decode(str));

String eventsResponseToJson(EventsResponse data) => json.encode(data.toJson());

class EventsResponse {
    List<Event> events;

    EventsResponse({
        this.events,
    });

    factory EventsResponse.fromJson(Map<String, dynamic> json) => EventsResponse(
    events: json["events"] == null ? null : List<Event>.from(json["events"].map((x) => Event.fromJson(x))),
    );

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

class Event {
    String imageUrl;
    String nameAr;
    String nameEn;

    Event({
        this.imageUrl,
        this.nameAr,
        this.nameEn,
    });

    factory Event.fromJson(Map<String, dynamic> json) => Event(
        imageUrl: json["image_url"] == null ? null : json["image_url"],
        nameAr: json["name_ar"] == null ? null : json["name_ar"],
        nameEn: json["name_en"] == null ? null : json["name_en"],
    );

    Map<String, dynamic> toJson() => {
        "image_url": imageUrl == null ? null : imageUrl,
        "name_ar": nameAr == null ? null : nameAr,
        "name_en": nameEn == null ? null : nameEn,
    };
}

и замените ваш вызов API ниже

Future<void> fetchEvents(http.Client client) async {
    try {
      //fetch api
      final response =  await client.get(globals.apiUrl + '/events/');
      final List<Event> loadedEvents = new List();
      //store events into a List<Event>
      EventsResponse eventResponse = eventsResponseFromJson(response.body);
      loadedEvents.addAll(eventResponse.events);
      //for the provider
      notifyListeners();
    } catch (error) {
      throw (error);
    }
}
0 голосов
/ 25 сентября 2019

Вы можете явно извлечь значение 'events' из карты, а затем выполнить итерации по событиям в этом списке.Вам нужно будет разыграть as List, чтобы увидеть как List<dynamic>, а затем вызвать .cast<Map<String, dynamic>>(), чтобы увидеть List<Map<String, dynamic>>;

final extractedData = jsonDecode(response.body) as Map<String, dynamic>;
final encodedEvents = (extractedData['events'] as List).cast<Map<String, dynamic>>();
final loadedEvents = [
  for(final event in encodedEvents)
    Event(
      name_en: event['name_en'],
      name_ar: event['name_ar'],
      image_url: eventData[0]['image_url'],
    ),
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...