Dart中父类实例is判断为子类后无法访问子类属性如何解决
Dart类型判断后无法访问子类属性的问题解决方案
你遇到的问题是Dart的类型提升机制的限制导致的,和你写的类继承结构无关,也不需要额外配置。
核心原因
- 类型提升只对不可重新赋值的局部变量生效。如果你的变量
a是类的成员属性、全局变量,或者是可以被重新赋值的局部变量,Dart无法保证is判断之后到你访问属性的这段时间里,a不会被修改为其他非B类型的实例,所以不会做自动类型提升,你自然只能访问父类A的属性。 - 如果你开启了空安全,变量
a声明为可空类型A?的情况下,没有先做非空判断直接做is判断,也会导致类型提升失效。 - 如果你在
is判断和属性访问之间对a有重新赋值的操作,也会打断类型提升。
你参考的Flutter示例中,event是回调函数的入参,属于不可重新赋值的局部变量,所以is判断后自动类型提升直接生效,就可以直接访问子类的属性。
解决方案
方案1:使用局部变量接收(推荐,无需强制转换)
如果你的a是成员变量/全局变量,先把它赋值给一个局部临时变量,再做类型判断:
A a = B(); // 这里a是成员变量 final tempA = a; if (tempA is B) { print(tempA.stringA); print(tempA.stringB); // 可正常访问 }
如果是局部变量,直接给变量加final修饰,保证不会被重新赋值即可:
final A a = B(); if (a is B) { print(a.stringB); // 正常访问 }
方案2:强制类型转换
已经做过is判断的前提下,用as强制转换类型即可安全访问:
A a = B(); if (a is B) { print((a as B).stringB); // 不会抛出类型转换异常 }
内容的提问来源于stack exchange,提问作者MindStudio
相关产品推荐
相关产品推荐

