Flutter - Map<String, dynamic> 到 Map<String, MyObject>

Posted

技术标签:

【中文标题】Flutter - Map<String, dynamic> 到 Map<String, MyObject>【英文标题】:Flutter - Map<String, dynamic> to Map<String, MyObject> 【发布时间】:2021-02-11 00:22:26 【问题描述】:

我有一个像这样的 Json


  "marDelPlata" : 
    "business" : 
      "b03":...,
      "b11":...,
      "b92":...,
      "b141":...,
      ...
  

然后我有一个类,它有一个获取 json 并将其解码为地图的方法

class Server 
  Future<Map<String, dynamic>> getDataJSON(String location) async 
    String data = await rootBundle.loadString("assets/test_data/data.json");
    Map dataMap = json.decode(data);
    return dataMap[location];
  

还有一个函数,它应该获取 map 并将其映射到 Map,但这不起作用。

  final Server _server = Server();

  Future<Map<String, Business>> getAllBusiness() async 
    Map<String, dynamic> map1 = await _server.getDataJSON('marDelPlata');
    Map<String, dynamic> map2 = map1['business'];
    // The next line is not working:
    Map<String, Business> map3 = map2.map((key, value) => MapEntry(key, Business.fromMap(value)));
    return map3;
  

我收到此错误:“TypeError: elements is not iterable”

这是从地图创建业务类的代码

  factory Business.fromMap(Map<String, dynamic> map) 
    if (map == null) return null;
    return Business(
      name: map['name'],
      location: BusinessLocation.fromMap(map['location']),
      sectionList: List<Section>.from(map['sectionList']?.map((x) => Section.fromMap(x))),
    );
  

附加数据:我最近将我的项目迁移到 FlutterWeb 而不是应用程序。当我的项目是一个应用程序时,我得到的错误是:“InternalLinkedHashMap' 不是“Map”类型的子类型。不知道迁移有没有事。

希望你能帮我解决这个问题,谢谢。

【问题讨论】:

我建议你使用debug断点或者使用print语句,在失败的代码行之前查看map2的内容是什么。这应该让您更好地了解您需要如何处理其内容。我不清楚您的 map2.map 语句要达到什么目的。 @GrahamD 如果你打印 map2 你会得到: "b03":..., "b11":..., "b92":..., " b141":..., ... @GrahamD map2 只是一个 map,但我希望函数返回一个 Map。这就是为什么我必须使用 Business.fromMap(*这里是 map2 的动态部分)将 map2 的“动态”部分(Wich 也是一个地图)转换为业务对象。我希望现在更清楚了 这样很好。根据答案,没有异步问题。您在地图中拥有所有业务。你想对这些企业做什么,提取其中一个,提取每个地图的内容,什么? 所以我们缺少您的业务类定义的代码,特别是它的 fromMap 方法。 【参考方案1】:

好吧,您有一个异步函数调用,然后是使用异步调用中的日期的代码。由于它是异步的,因此无法保证调用何时结束。

所以你可以想象map1['business']在分配给map2时可能是空的。 Map&lt;String, dynamic&gt; map2 = map1['business'];

然后你迭代 map2 而不保证它实际上有数据。尝试将依赖于_server.getDataJSON('marDelPlata') 的代码放入.then() 语句中。

.then() 语句只会在它所附加的函数调用完成后执行代码。

【讨论】:

以上是关于Flutter - Map<String, dynamic> 到 Map<String, MyObject>的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 上向 List<Map<String, String>> 输入第三个字符串?

如何过滤 List<Map<String, dynamic>> 以在 Flutter 中获取值?

Flutter - 参数类型“Object”不能分配给参数类型“Map<String, dynamic>”

Flutter 中的 Json 解析:List<dynamic> 不是 'Map<String,dynamic>' 类型的子类型

Flutter 在 ListView 返回类型 String 中显示嵌套 json 不是类型转换中类型“Map<String, dynamic>”的子类型

如何过滤 List<List<Map<String, dynamic>>> 以在 Flutter 中获取值?