[英]How to create a List<String> from a List<Map<String, String>> in Dart?
[英]Difference between List<String>.from() and as List<String> in Dart
我已经从 Firebase 读取了一个快照,并试图从一个字符串列表的节点中提取值。
当我这样做时:
List<String> answers = snapshot.value["answers"] as List<String>;
有了上面我得到一个运行时错误说:
类型
'List<dynamic>'
不是类型转换中类型'List<String>'
的子类型
但不知何故,下面这两种方法都有效:
List<String> answers = List<String>.from(snapshot.value["answers"])
或这个:
List<String> answers = snapshot.value["answers"].cast<String>()
第一个和其他两个构造之间有什么区别,为什么我不能使用as
转换操作将List<dynamic>
转换为List<String>
?
让我们来看看一些例子:
var intList = <int>[1, 2, 3];
var dynamicList = intList as List<dynamic>; // Works.
var intList2 = dynamicList as List<int>; // Works.
但:
var dynamicList = <dynamic>[1, 2, 3];
var intList = dynamicList as List<int>; // Fails at runtime.
有什么不同?
在第一个示例中, intList
的 static 类型为List<int>
,而 object 的实际运行时类型也是List<int>
。 dynamicList
具有List<dynamic>
的 static 类型,但具有List<int>
的实际运行时类型(与intList
相同的 object )。 由于 object 最初是List<int>
,因此List
object 不可能保存除int
元素之外的任何内容,并且转换回List<int>
是安全的。
在第二个示例中, dynamicList
具有 List<dynamic> 的 static 类型和List<dynamic>
List<dynamic>
实际运行时类型。 由于 object 最初构造为List<dynamic>
,因此可能已将非int
元素添加到其中,并且强制转换为List<int>
不一定安全。 因此,您必须单独转换每个元素,这正是List.from
和List.cast
所做的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.