首页 > 解决方案 > 转换列表列出

问题描述

我正在从服务器获取数据。运行runtimeType显示它们具有 List 类型。目前我正在cast<String>()使用List<String>.

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

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

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

标签: jsonlistdart

解决方案


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

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

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

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

  • [... list.cast<String>()],

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

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

我建议尽可能使用列表文字。<String>[...list]在这里,如果您想要一个新列表,我可能会选择最小的版本。否则.cast<String>()就好了。


推荐阅读