Flutter中如何实现支持父类判断的类型校验函数?
解决Dart中动态类型判断(支持继承关系)的问题
问题背景
你尝试实现一个类型判断函数,直接用is表达式传入Type变量时触发编译错误;改用runtimeType == cls又无法支持继承关系(子类对象无法匹配父类类型)。
错误原因
is表达式要求类型必须是编译期确定的常量类型,不能使用变量(如cls)作为判断类型,因此第一个实现报错。runtimeType返回的是对象的精确运行时类型,只会匹配完全一致的Type,不会考虑继承或接口实现关系,所以子类对象匹配父类Type时返回false。
解决方案
方案1:泛型函数(推荐,原生支持)
利用Dart泛型的类型检查特性,直接在函数定义中声明泛型参数,is T会自动处理继承关系:
bool isValidType<T>(dynamic element) { return element is T; }
调用方式调整为:
isValidType<Node>(node); // 返回true isValidType<Element>(node); // 返回true
这种方式完全符合需求,无需依赖第三方包,且是编译期类型检查,性能更优。
方案2:保留Type参数调用(需依赖第三方包)
如果必须保留isValidType(element, Type cls)的调用形式,可以使用type_checker包来处理类型继承关系:
- 在
pubspec.yaml中添加依赖:
dependencies: type_checker: ^0.1.0
- 实现函数:
import 'package:type_checker/type_checker.dart'; bool isValidType(dynamic element, Type cls) { return TypeChecker.fromRuntime(cls).isAssignableFrom(element.runtimeType); }
调用时即可得到预期结果:
isValidType(node, Node); // 返回true isValidType(node, Element); // 返回true
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

