首页 > 解决方案 > Flutter 不适用于 swtich 语句的自定义枚举

问题描述

abstract class Enum<T> {
  final T value;

  const Enum(this.value);
}


class FlightScheduleStatus<int> extends Enum<int> {
  const FlightScheduleStatus(int val) : super(val);
  static const None = const FlightScheduleStatus(0);
  static const OnTime = const FlightScheduleStatus(1);
  static const Delayed = const FlightScheduleStatus(2);
}


Widget getFlightStates(LiveStatus liveStatus) {
switch (liveStatus.flightScheduleStatus) {
      case FlightScheduleStatus.Delayed:
        return Row(
          children: <Widget>[
            Text('Delayed'),
            SizedBox(
              width: 3,
            ),
            Chip(
              label: Text('${liveStatus.delayedTime}'),
              backgroundColor: Colors.red,
            ),
          ],
        );
        break;
      case FlightScheduleStatus.OnTime:
        return Text('On Time');
        break;
      case FlightScheduleStatus.None:
        return Text('N/A');
        break;
    }
}

在这里,我使用自定义类创建了自定义枚举。但是当我们使用 switch 语句时并没有经过这里的任何情况。请在这个问题上帮助我。如果它是一个枚举类,我想按原样工作。

即使我使用liveStatus.flightScheduleStatus.value它也不工作。

标签: flutterdartenumsswitch-statement

解决方案


我想问题是您的FlightScheduleStatus类实际上允许您创建具有相同内部值的多个对象实例。由于您有一个公共构造函数,FlightScheduleStatus我猜您正在代码中的其他地方使用它来将 a 转换int为 a FlightScheduleStatus。如果是这种情况,您确实需要使用工厂构造函数,如下例所示:

abstract class Enum<T> {
  final T value;

  const Enum(this.value);
}

class FlightScheduleStatus extends Enum<int> {
  const FlightScheduleStatus._(int val) : super(val);

  factory FlightScheduleStatus(int val) {
    if (val == None.value) {
      return None;
    } else if (val == OnTime.value) {
      return OnTime;
    } else if (val == Delayed.value) {
      return Delayed;
    }
    throw Exception('$val is not a valid value for FlightScheduleStatus.');
  }

  static const None = const FlightScheduleStatus._(0);
  static const OnTime = const FlightScheduleStatus._(1);
  static const Delayed = const FlightScheduleStatus._(2);
}

void main() {
  var test = FlightScheduleStatus(0);

  switch (test) {
    case FlightScheduleStatus.None:
      print('None'); // <-- this is the one executed
      break;
    case FlightScheduleStatus.OnTime:
      print('OnTime');
      break;
    case FlightScheduleStatus.Delayed:
      print('Delayed');
      break;
  }
}

在示例中,我为FlightScheduleStatus私有创建了普通的构造函数,因此它只能单独使用FlightScheduleStatus。工厂构造函数允许我们返回已经创建的对象,而不是创建新对象。


推荐阅读