Dart getter返回枚举name属性时触发setter类型不匹配报错
错误根本原因
这个编译错误和枚举.name属性的返回值类型无关,核心是违反了Dart语言对同名getter/setter的类型约束:同名getter的返回值类型必须是对应setter入参类型的子类型,否则就会抛出getter_not_subtype_setter_types错误。
你观察到的行为差异,本质是两段代码的setter入参类型不一致,和getter返回的是静态const字符串还是枚举name属性字符串没有任何关系:
- 可正常构建的代码中,getter
parity返回类型为String,对应setter的入参类型也是String,String是自身的子类型,完全符合类型约束,因此不会报错。 - 触发错误的代码中,getter
parity返回类型仍然是String,但你把setter的入参类型改成了SerialPortParity枚举类型。String和SerialPortParity是完全独立的两个类型,String不是SerialPortParity的子类型,因此直接触发编译错误。
你验证SerialPortParity.none.name是String类型的结论是完全正确的,问题出在getter和setter的类型配对不匹配。
修复方案
根据你的实际业务需求二选一即可:
- 如果需要对外暴露枚举类型的
parity属性,就把getter的返回类型改为SerialPortParity,直接返回枚举值而非枚举的name字符串,示例代码:
SerialPortParity get parity { switch (_parity) { case UsbPort.PARITY_NONE: return SerialPortParity.none; case UsbPort.PARITY_EVEN: return SerialPortParity.even; case UsbPort.PARITY_ODD: return SerialPortParity.odd; case UsbPort.PARITY_MARK: return SerialPortParity.mark; case UsbPort.PARITY_SPACE: return SerialPortParity.space; default: return SerialPortParity.none; } } // 原有入参为SerialPortParity类型的setter无需修改
- 如果需要对外暴露字符串类型的
parity属性,就把setter的入参类型改回String,和你之前使用静态const常量的版本保持类型一致,此时getter返回枚举的.name属性不会有任何问题。
内容的提问来源于stack exchange,提问作者Dark Sorrow
相关产品推荐
相关产品推荐

