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
相关产品推荐
相关产品推荐

