【问题标题】:Dart (Flutter) map<String, String>.map has no toList()Dart (Flutter) map<String, String>.map 没有 toList()
【发布时间】:2020-12-18 09:10:51
【问题描述】:

我有一个映射结构,我想为每个条目创建一个DropdownMenuItem&lt;String&gt;。我尝试做的是像这样调用.map().toList()

var _languages = {
  'en': 'English ????????/????????',
  'fr': 'French ????????',
  'nl': 'Dutch',
  'es': 'Spanish'
};

languages.map((key, value) => DropdownMenuItem(
   value: key,
   child: Text(v)
)).toList();

(如果您在 Windows 上,US/GB 将打印为文本,如果您在任何其他平台上,它将是标志)。现在的问题是双重的:

  1. 根据闭包上下文的要求,返回类型“DropdownMenuItem”不是“MapEntry”。
  2. 没有为“Map”类型定义“toList”方法。

如何从地图中正确创建列表?这不可能是因为地图不是有序集合吗?

【问题讨论】:

    标签: dart


    【解决方案1】:

    Map&lt;K, V&gt;.map 返回 另一个 Map,这不是你想要的。

    您可以改为从Map 创建一个Iterable首先,然后使用Iterable.map,它会返回另一个Iterable

      var menuItems = languages.entries
          .map((mapEntry) =>
              DropdownMenuItem(value: mapEntry.key, child: Text(mapEntry.value)))
          .toList();
    

    或者:

      var menuItems = [
        for (var mapEntry in languages.entries)
          DropdownMenuItem(value: mapEntry.key, child: Text(mapEntry.value)),
      ];
    

    【讨论】:

      【解决方案2】:

      你不能在像你这样的场景中直接调用.map,因为返回的类型是Map&lt;K, V&gt;,意味着是原始但经过转换的回复(如果你需要转换它)。在您的场景中,您需要另一种 ma​​p,即Iterable&lt;dynamic&gt;。要拥有它,您必须经过.entries,它会给你一个Iterable&lt;MapEntry&lt;K, V&gt;&gt;,然后调用那个.map,它会给你一个Iterable&lt;T&gt;,其中返回的T甚至可以是pizza:)。

      这里有一小段代码可以帮助您理解这个概念:

        final Map<String, String> _languages = {
          'en': 'English ??/??',
          'fr': 'French ??',
          'nl': 'Dutch',
          'es': 'Spanish'
        };
       
       
        @override
        Widget build(BuildContext context) {
          return DropdownButton(
            items: _languages.entries
                .map((MapEntry element) => DropdownMenuItem(value: element.key, child: Text(element.value)))
                .toList(),
            onChanged: (value) {
              /**/
            },
          );
        }
      

      【讨论】:

        【解决方案3】:

        map 方法 om Map 与可迭代对象上的 map 方法不同(例如 List)。它不是返回Iterable,而是返回Map。因此,内部方法需要返回一个MapEntry,因此该方法可以构造一个新的Map 对象来返回。为了将其转换为列表,您需要将地图本身转换为列表。

        我假设您想要做的是获取地图中的条目并将它们映射到DropDownButton,其中语言代码是按钮的值,语言文本是按钮的文本。因此,您想在_langages.entries 上调用map,这将为您提供映射中所有键和值的Iterable。然后,您可以在这个可迭代对象上调用 map,它会按照您的预期进行:

        var _languages = {
          'en': 'English ??/??',
          'fr': 'French ??',
          'nl': 'Dutch',
          'es': 'Spanish'
        };
        
        languages.entries.map((entry) => DropdownMenuItem(
           value: entry.key,
           child: Text(entry.value),
        )).toList();
        

        【讨论】:

        • 是的,map 在 Dart 中似乎是模棱两可的。我想要的是原始含义,即将每个项目转换为新项目而不是创建数据结构
        • @WouterVandenputte map 方法是 Iterable 独有的。 Map 类不是 Iterable
        猜你喜欢
        • 2021-02-11
        • 1970-01-01
        • 2021-03-25
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多