未处理的异常:类型“List<dynamic>”不是类型转换中“List<String>”类型的子类型

Mar*_*S82 2 dart flutter

这个异常在 lins 中抛出myList = results['users'];。我也试过了myList = results['users'] as List<String>;。的类型results['users']List<dynamic>。实际上它包含字符串,为什么不能转换呢?

List<String> myList = List<String>();
results = await ApiService.searchUser();
setState(() {
  myList = results['users'];
}
Run Code Online (Sandbox Code Playgroud)

Les*_*iak 9

您可以建立一个新列表

myList = new List<String>.from(results['users']);
Run Code Online (Sandbox Code Playgroud)

或者,使用演员表:

myList = results['users'].cast<String>();
Run Code Online (Sandbox Code Playgroud)

请注意,这myList.runtimeType将有所不同:

  • List<String> 如果是新列表
  • CastList<dynamic, String> 在演员的情况下

参见关于Effective Dart 的讨论:何时使用“as”、“.retype”、“.cast”

我建议您几乎不要使用强制转换或重新输入。

  • retype 包装列表,强制对每次访问进行 as T 检查,无论是否需要。
  • cast 可选地包装列表,避免在不需要时进行 as T 检查,但这样做的代价是使返回的对象多态(原始类型或 CastList),这会干扰可以生成的代码的质量。

如果你要触及列表的每一个元素,你不妨复制它

 new List<T>.from(original)
Run Code Online (Sandbox Code Playgroud)

因此,如果我的访问模式稀疏或需要更新原始模式,我只会使用强制转换或重新键入。

请注意,上面的讨论指的retype是从 Dart 2 中删除的方法,但其他点仍然有效。