Flutter/Dart 如何对来自 json 的地图列表进行分组

Flutter/Dart how to groupBy list of maps from json

这个问题几乎与回答的问题相同,区别在于我的数据是json,来自API称呼。这导致了下面代码底部显示的错误。我尝试了各种类型转换和变量类型的组合,但都没有成功。

        import 'dart:convert';
        import "package:collection/collection.dart";
        
        void main(List<String> args) {
          var data1 = [
            {"title": 'Avengers', "release_date": '10/01/2019'},
            {"title": 'Creed', "release_date": '10/01/2019'},
            {"title": 'Jumanji', "release_date": '30/10/2019'},
          ];
           //without these two lines, the code executes with no problems
          var data2 = jsonEncode(data1);
          var data3 = jsonDecode(data2);
        
          try {
            var newMap = groupBy(data3, (Map obj) => obj['release_date']);
            print(newMap);
          } catch (err) {
            print(err);
          }
    
    **type 'List<dynamic>' is not a subtype of type 'Iterable<Map<dynamic, dynamic>>'**




  [1]: 

data1的static和运行时间类型是List<Map<String, String>>,这是从字面量的内容推断出来的。

data3 的 运行 时间类型是 List<dynamic>,因为那是 jsonDecode 创建的。静态类型只是 dynamic.

您不能将 List<dynamic> 传递给期望 Iterable<Map> 的对象,这是您的 groupBy 所期望的(仅从 (Map obj) => ... 函数推断,因为另一个参数的类型为 dynamic),以及出现错误的原因。

您可以将 data3 键入为 List data3 = jsonDecode(...);。这可能会强制类型推断猜测 dynamic 作为 groupBy 的类型参数。然后你会得到一个 (Map obj) => ... 不接受 dynamic 的错误。

无论有无上述,您都可以通过跳过类型检查将 (Map obj) 更改为 (dynamic obj),这应该使代码成为 运行。或者你可以做 (dynamic obj) => (obj as Map)["release_date"] 在查找之前进行转换。

您可以将 data3 键入 List,然后通过执行 data3.cast<Map>().groupBy((Map obj) => ...) 将其转换为 List<Map>。 (您也可以使用 groupBy 作为扩展方法,我建议这样做,但只有当接收器 data3 具有非 dynamic 类型时才有效。)