【问题标题】:Convert List<dynamic> to List<String>将 List<dynamic> 转换为 List<String>
【发布时间】:2021-05-20 04:49:39
【问题描述】:

我正在从服务器获取数据。运行runtimeType 表明它们具有列表类型。 目前我正在使用cast&lt;String&gt;() 获取List&lt;String&gt;

但这是唯一的\正确的方式吗?

   var value = await http.get('http://127.0.0.1:5001/regions');

   if(value.statusCode == 200) {  
      return jsonDecode(value.body)['data'].cast<String>();
    }

【问题讨论】:

    标签: json list dart


    【解决方案1】:

    有多种方法,具体取决于如果列表包含非字符串,您希望多长时间出现错误,以及您将如何使用该列表。

    • list.cast&lt;String&gt;() 在原始列表周围创建一个惰性包装器。它检查每次读取该值实际上是String。如果您打算经常阅读,那么所有这些类型检查可能会很昂贵,并且如果您希望在列表的最后一个元素不是字符串的情况下尽早出错,那么它不会为您执行此操作。

    • List&lt;String&gt;.from(list) 创建一个String 的新列表并将list 中的每个元素复制到新列表中,同时检查它实际上是一个String。如果一个值实际上不是一个字符串,这种方法会很早就出错。创建后,不再进行类型检查。另一方面,创建新列表需要额外的内存。

    • [for (var s in list) s as String],

    • [... list.cast&lt;String&gt;()],

    • &lt;String&gt;[for (var s in list) s],

    • &lt;String&gt;[... list] 是创建新字符串列表的所有其他方式。最后两个依赖于来自dynamic 的隐式向下转换,前两个使用显式转换。

    我建议尽可能使用列表文字。在这里,我可能会选择最小的版本&lt;String&gt;[...list]如果你想要一个新列表。否则.cast&lt;String&gt;() 没问题。

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2020-05-23
      • 2020-06-02
      • 2021-11-11
      相关资源
      最近更新 更多