在 Flutter 中创建列表映射

Aug*_*ski 3 dictionary dart flutter

将应用程序从 Swift 移植到 Flutter。在我的应用程序中,我有一个类,MyClass,并且正在处理大约 250 个实例的列表。在不同的时候,我需要根据特定属性对对象进行分组。

在 Swift 中,我能够像这样创建对象的分组列表:

var groupedList = Dictionary<String, Array<MyClass>>()
Run Code Online (Sandbox Code Playgroud)

然后我就可以遍历我的对象列表,并根据需要将项目分配给正确的数组。我认为在 Flutter 中制作列表地图可能会这样:

Map groupedList = Map<String, List<MyClass>>();
Run Code Online (Sandbox Code Playgroud)

然后我可以遍历项目,测试属性,为每个唯一值创建一个 Map 条目并将项目附加到正确的列表:

for (var item in listOfObjects) {
  if (!groupedList.containsKey(item.someproperty)) {
    List<MyClass> sublist = [];
    groupedList[item.someproperty] = sublist;
  }
  groupedList[item.someproperty].add(item);
}
Run Code Online (Sandbox Code Playgroud)

然而,我得到的是一个包含所有正确键的映射,但每个列表只包含一个 MyClass 实例,而不是一个实际的 MyClass 列表。

Ric*_*eap 5

使用putIfAbsent. 这给出了您期望的结果:

void main() {
  var groupedList = <String, List<MyClass>>{};
  var listOfObjects = <MyClass>[
    MyClass('Europe', 'France'),
    MyClass('Europe', 'Germany'),
    MyClass('Europe', 'Italy'),
    MyClass('North America', 'USA'),
    MyClass('Asia', 'Japan'),
    MyClass('Asia', 'China'),
  ];

  for (var item in listOfObjects) {
    groupedList.putIfAbsent(item.someProperty, () => <MyClass>[]).add(item);
  }

  print(groupedList);
}

class MyClass {
  String someProperty;
  String someValue;

  MyClass(this.someProperty, this.someValue);

  @override
  String toString() => '$someProperty->$someValue';
}
Run Code Online (Sandbox Code Playgroud)