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