You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:33:22