【问题标题】:Why I can't refer to a key in an object's another key?为什么我不能引用对象的另一个键中的键?
【发布时间】:2020-06-02 19:22:06
【问题描述】:

为什么我不能在像这样映射时引用一个已经放在另一个对象的键中的对象中的键:

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'] 或 ['music'] 之前,一切都运行良好,因为 IDE 一直告诉我:

没有为“Object”类定义运算符“[]”。 尝试定义运算符'[]'。

看截图: can't refer to a key's value in another object's key

【问题讨论】:

  • 尝试将单引号 ' 更改为双引号 " ?
  • 没用,我不认为引号是问题的一部分。

标签: flutter dart dart-pub


【解决方案1】:

那是因为你的var object 是Map&lt;String,Object&gt; 类型,当你访问第一个 [] 时,你有Object 作为返回,很快 Object 就不是映射或可迭代的了, 第二个 [] 不能应用。您必须明确告知您的 object 是 Map&lt;String, dynamic&gt; 类型,如下例所示:

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

并将您的解析代码更改为显式映射以使用第二个 []:

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);
  }

现在可以了!

注意:动态可以是所有可能的值类型,不同于Object 类型,更多信息请参见讨论What is the difference between dynamic and Object in dart?

【讨论】:

  • 谢谢它现在可以工作,我明白了。我更喜欢将地图类型 (Map) 放在 (as List) 之后,因为这些数据将从 JSON 格式中获取。
【解决方案2】:

Dart 不知道你的结构是什么样的,因此,你必须通过提供一个演员来让它知道。

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

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2022-01-05
    • 2018-05-13
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多