【问题标题】:Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<String>' in type cast未处理的异常:类型“List<dynamic>”不是类型转换中“List<String>”类型的子类型
【发布时间】:2020-03-24 22:07:11
【问题描述】:

此异常在 lins myList = results['users']; 中引发。我也试过myList = results['users'] as List&lt;String&gt;;results['users'] 的类型是 List&lt;dynamic&gt;。其实它包含字符串,为什么不能转换呢?

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

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    你可以建立一个新列表

    myList = new List<String>.from(results['users']);
    

    或者,使用演员表:

    myList = results['users'].cast<String>();
    

    注意myList.runtimeType 会有所不同:

    • List&lt;String&gt; 如果是新列表
    • CastList&lt;dynamic, String&gt; 在演员表的情况下

    查看Effective Dart: When to use "as", ".retype", ".cast"的讨论

    我建议你几乎不要使用 cast 或 retype。

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

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

     new List<T>.from(original)
    

    因此,如果我的访问模式稀疏或者我需要更新原始模式,我只会使用 cast 或 retype。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2021-01-16
      • 2021-01-28
      • 2019-09-26
      相关资源
      最近更新 更多