Home > database >  type is not subtype of type Map<String, dynamic>' in flutter
type is not subtype of type Map<String, dynamic>' in flutter

Time:10-12

I have a data that I pulled from json. I want to receive and process this data in the following format. When I try manually, I get the error with the actual service data while getting the output I want. My manual attempt:

void main(List<String> args) {
  final map = <Map<String, dynamic>>[
    {'MAH_ID': 10, 'MAH_AD': 'AŞAĞI', 'ILCE_ID': 1, 'ILCE_AD': 'SARI'},
    {'MAH_ID': 11, 'MAH_AD': 'YUKARI', 'ILCE_ID': 1, 'ILCE_AD': 'SARI'},
    {'MAH_ID': 12, 'MAH_AD': 'SAĞ', 'ILCE_ID': 1, 'ILCE_AD': 'SARI'},
    {'MAH_ID': 13, 'MAH_AD': 'SOL', 'ILCE_ID': 1, 'ILCE_AD': 'SARI'},
    {'MAH_ID': 14, 'MAH_AD': 'LOW', 'ILCE_ID': 2, 'ILCE_AD': 'KIRMIZI'},
    {'MAH_ID': 15, 'MAH_AD': 'MİD', 'ILCE_ID': 2, 'ILCE_AD': 'KIRMIZI'},
    {'MAH_ID': 16, 'MAH_AD': 'HİGH', 'ILCE_ID': 2, 'ILCE_AD': 'KIRMIZI'},
    {'MAH_ID': 17, 'MAH_AD': 'ULTRAHİGH', 'ILCE_ID': 2, 'ILCE_AD': 'KIRMIZI'}
  ];

  final mappedValues = <Map<String, List<dynamic>>>[];

  for (final element in map) {
    final ilceAd = element['ILCE_AD'];
    final mahAd = element['MAH_AD'];

    final contains =
        mappedValues.where((e) => e.keys.contains(ilceAd)).toList();

    if (contains.isNotEmpty) {
      if (contains.first.isNotEmpty) {
        if (contains.first.containsKey(ilceAd)) {
          contains.first[ilceAd]!.add(mahAd);
        }
      }
    } else {
      mappedValues.add({
        ilceAd as String: [mahAd]
      });
    }
  }

  print(mappedValues);
}

success output {SARI: [AŞAĞI, YUKARI, SAĞ, SOL]}, {KIRMIZI: [LOW, MİD, HİGH, ULTRAHİGH]}]

my model class

import 'dart:convert';

List<Mahalle> mahalleFromJson(String str) =>
    List<Mahalle>.from(json.decode(str).map((x) => Mahalle.fromJson(x)));

String mahalleToJson(List<Mahalle> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Mahalle {
  Mahalle({
    this.mahId,
    this.mahAdi,
    this.mahIdDbb,
    this.ilceId,
    this.ilceAdi,
    this.ilceIdDbb,
  });

  int? mahId;
  String? mahAdi;
  int? mahIdDbb;
  int? ilceId;
  String? ilceAdi;
  int? ilceIdDbb;

  factory Mahalle.fromJson(Map<String, dynamic> json) => Mahalle(
        mahId: json["MAH_ID"],
        mahAdi: json["MAH_ADI"],
        mahIdDbb: json["MAH_ID_DBB"],
        ilceId: json["ILCE_ID"],
        ilceAdi: json["ILCE_ADI"],
        ilceIdDbb: json["ILCE_ID_DBB"],
      );

  Map<String, dynamic> toJson() => {
        "MAH_ID": mahId,
        "MAH_ADI": mahAdi,
        "MAH_ID_DBB": mahIdDbb,
        "ILCE_ID": ilceId,
        "ILCE_ADI": ilceAdi,
        "ILCE_ID_DBB": ilceIdDbb,
      };
}

method where i pull json data

Future getApiData() async {
    try {
      final response = await http.get(url);
      if (response.statusCode == 200) {
        var result =
            mahalleFromJson(response.body).cast<Map<String, dynamic>>();

        final mappedValues = <Map<String, List<dynamic>>>[];

        for (final element in result) {
          final ilceAd = element['ilceAdi'];
          final mahAd = element["mahAdi"];

          final contains = mappedValues
              .where((element) => element.keys.contains(ilceAd))
              .toList();

          if (contains.isNotEmpty) {
            if (contains.first.isNotEmpty) {
              if (contains.first.containsKey(ilceAd)) {
                contains.first[ilceAd]!.add(mahAd);
              }
            }
          } else {
            mappedValues.add({
              ilceAd as String: [mahAd]
            });
          }
        }
        print(mappedValues);
}

the error i got: type 'Mahalle' is not a subtype of type 'Map<String, dynamic>' in type cast

Thanks in advance for your help

CodePudding user response:

element in your for loop is an Mahalle Item, so if you want to access ilceAd or mahAd you should do this:

var result = mahalleFromJson(response.body); //<--- change this

final mappedValues = <Map<String, List<dynamic>>>[];

for (final element in result) {
          final ilceAd = element.ilceAdi; //<--- change this
          final mahAd = element.mahAdi; //<--- change this

          final contains = mappedValues
              .where((element) => element.keys.contains(ilceAd))
              .toList();

          if (contains.isNotEmpty) {
            if (contains.first.isNotEmpty) {
              if (contains.first.containsKey(ilceAd)) {
                contains.first[ilceAd]!.add(mahAd);
              }
            }
          } else {
            mappedValues.add({
              ilceAd as String: [mahAd]
            });
          }
        }
  • Related