flutter - 不强制转换的子类对象的访问字段
问题描述
给定以下类:
abstract class ParentState extends Equatable {
const SomeState();
}
class SomeState extends ParentState {
const SomeState({required this.someField});
final String someField;
@override
List<Object> get props => [someField];
}
someField
如果当前状态是我的方法中的类型SomeState
,我想访问mapEventToState
,但编译器不允许这样做:
@override
Stream<ParentState> mapEventToState(
ParentEvent event,
) async* {
if (state is SomeState) {
print(state.someField); // Error: The getter 'someField' isn't defined for the type 'ParentState'.
}
}
但是,如果我手动创建一个ParentState
变量,它会按预期工作:
ParentState state = SomeState(someField: 'test');
if (state is SomeState) {
print(state.someField); // Works.
}
此外,手动铸造mapEventToState
作品,但这不应该是必需的:
if (state is SomeState) {
print((state as SomeState).someField); // Works.
}
我错过了什么?
解决方案
在您的第一个错误示例中,它似乎state
是周围类中的一个字段,具有自动生成的 getter 和 setter。
然而,从分析器的角度来看,它state
也可能是一个 getter 函数,它允许在每次调用 getter 时返回不同的对象。因此,在if
语句中第一次调用 getter 时,getter 可以返回一个SomeState
对象,但在if
body 中,getter 可以返回一个完全不同的对象而没有someField
getter。
要解决这个问题,您只需要在函数中创建变量的本地副本并使用该副本而不是类字段:
@override
Stream<ParentState> mapEventToState(
ParentEvent event,
) async* {
final stateCopy = state;
if (stateCopy is SomeState) {
print(stateCopy.someField);
}
}
推荐阅读
- android - 与 Android Auto 附录相关的错误 - 在 Google Play 中发布 APK 时
- python-3.x - 你如何用 python 使用 metasploit?
- javascript - 创建可重用组件的正确方法是什么?
- java - 如何在 JPQL 中使用通用实体名称
- node.js - 关于发件人名称更改的 Node.js msg91 otp 问题
- angular - eslint: rxjs/no-unsafe-takeuntil 问题
- c++ - C++ 元编程来拆分函数参数并将它们一个接一个地传递给另一个函数
- macos - 使用特定的 make 文件“ld: library not found for -lgcrt1.o”时 Mac m1 出错
- excel - VBA脚本将单元格内容范围复制到剪贴板,不带引号
- ios - 使用 Apple 登录 - 无法验证授权授予代码