flutter List< String>.from()和as List < String>in Dart之间的区别

bq9c1y66  于 2022-12-14  发布在  Flutter
关注(0)|答案(1)|浏览(261)

我已经从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>

inb24sb2

inb24sb21#

让我们来看看一些例子:

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的静态类型为List<int>,对象的实际运行时类型也为List<int>dynamicList的静态类型为List<dynamic>,但实际运行时类型为List<int>(它与intList是同一个对象)。由于该对象最初是List<int>,因此List对象不可能包含除int元素之外的任何内容,并且转换回List<int>是安全的。
在第二个示例中,dynamicList的静态类型为List<dynamic>,实际运行时类型为List<dynamic>。由于该对象最初被构造为List<dynamic>,因此可以向其中添加非int元素,而转换为List<int>并不一定安全。(或类似于List的)对象,该对象单独转换每个 element,这正是List.fromList.cast所做的。

相关问题