Это потому, что ваш 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 а объект в дротике?