You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart运行时类型检查疑问:为何List<dynamic>判断返回false?

问题分析与解决方案

你遇到的这个问题其实是对runtimeType和is运算符的理解偏差导致的,我来帮你拆解清楚:

核心原因

responseJson['results'].runtimeType返回的是一个**Type类型的对象**,它代表了responseJson['results']的运行时类型信息。而is运算符的作用是判断一个对象是否属于某个类型(或其子类型)的实例。

你写的responseJson['results'].runtimeType is List<dynamic>,本质上是在问:「这个Type对象是不是List<dynamic>的实例?」——显然Type和List是完全不同的类型,所以结果必然是false,哪怕runtimeType打印出来的字符串是List<dynamic>。

正确的判断方式

方式1:直接检查对象类型(推荐)

如果你只是想确认responseJson['results']是一个List(不管具体泛型,因为Dart中泛型在运行时是被擦除的),直接用is检查对象本身即可:

if (responseJson['results'] is List && responseJson['results'].length > 0) {
  return responseJson;
}

甚至可以更精确一点(不过泛型擦除后,List<dynamic>和List在运行时其实是同一个类型):

if (responseJson['results'] is List<dynamic> && responseJson['results'].length > 0) {
  return responseJson;
}

方式2:精确匹配runtimeType(不推荐除非特殊需求)

如果你确实需要严格匹配runtimeType,应该用==而不是is:

if (responseJson['results'].runtimeType == List<dynamic> && responseJson['results'].length > 0) {
  return responseJson;
}

不过这种方式灵活性很差,比如如果返回的是List<String>,runtimeType就不匹配了,但实际它依然是List的实例,所以一般推荐用第一种方式。

修改后的完整代码

var responseJson = json.decode(response.body);
// 正确的类型检查
if (responseJson['results'] is List && responseJson['results'].length > 0) {
  return responseJson;
}
throw NotFoundException('Result is empty...');

内容的提问来源于stack exchange,提问作者Matthias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:12:48