Почему я не могу сослаться на ключ в другом ключе объекта? - PullRequest
2 голосов
/ 18 февраля 2020

Почему я не могу сослаться на ключ в объекте, который уже помещен в ключ другого объекта при отображении так:

var object = {
  "allStudents": [
    {
      "name": "John",
      "hobbies": {
        "sport": "Football",
        "music": "Piano"
      } ,
    },
    {
      "name": "Julyo",
      "hobbies": {
        "sport": "Vollyball",
        "music": "Guitar"
      } ,
    },
  ],
};

class Student {
  String name;
  dynamic hobbies;
  Student({this.name, this.hobbies});
}

class Hobbies {
  String sport;
  String music;
  Hobbies({this.sport, this.music});
}

List<Student> studentsList = [];

void getStudentsList () {
  studentsList = object["allStudents"].map((stu)=>
  Student(
    name: stu["name"] ,
    hobbies: Hobbies(
      sport: stu['hobbies']['sport'] ,
        music:stu['hobbies']['music'],
    ) ,
  )
  ).toList();
}

все работает очень хорошо, пока я не добавлю второй оператор ['sport'] или ['musi c'] , поскольку IDE постоянно говорит мне:

Оператор '[]' не определен для класса «Объект». Попробуйте определить оператор '[]'.

см. Скриншот: не может ссылаться на значение ключа в ключе другого объекта

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Это потому, что ваш var object имеет тип Map<String,Object>, и когда вы получаете доступ к использованию первого [] , вы получаете Object в качестве возврата, скоро объект не будет картой или итеративным, второй [] не может быть применен. Вы должны явно указать, что ваш object имеет тип Map<String, dynamic>, как в примере ниже:

Map<String, dynamic> object = {
  "allStudents": [
    {
      "name": "John",
      "hobbies": {"sport": "Football", "music": "Piano"},
    },
    {
      "name": "Julyo",
      "hobbies": {"sport": "Vollyball", "music": "Guitar"},
    },
  ],
};

и измените ваш код синтаксического анализа на явное сопоставление для работы с second []:

void getStudentsList() {
    final test = (object["allStudents"] as List)
        .map<Student>(
          (stu) => Student(
            name: stu["name"],
            hobbies: Hobbies(
              sport: stu['hobbies']['sport'],
              music: stu['hobbies']['music'],
            ),
          ),
        )
        .toList();

    print(test);
  }

Теперь это работает!

Примечание: Dynami c может быть любым возможным типом значения, отличным от типа Object, для получения дополнительной информации см. Обсуждение В чем разница между Dynami c а объект в дротике?

1 голос
/ 18 февраля 2020

Дарт не знает, на что похожа ваша структура, поэтому вы должны сообщить об этом, предоставив приведение.

void getStudentsList () {
  studentsList = (object["allStudents"] as List<Map<String,dynamic>>)
      .map((stu)=>
  Student(
    name: stu["name"] ,
    hobbies: Hobbies(
      sport: stu['hobbies']['sport'] ,
        music:stu['hobbies']['music'],
    ) ,
  )
  ).toList();
}

Я попробовал это на этом проекте dartPad, и это сработало .. https://dartpad.dev/b338f2a46bcb361de5e05c5ea6b8c74f

...