将列表<dynamic>转换为列表<String>



我正在从服务器获取数据。运行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>();
}

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

  • list.cast<String>()在原始列表周围创建一个惰性包装器。它检查每次读取的值实际上是一个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>()就可以了。

最新更新