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也不起作用。

最佳答案

我想问题是您的FlightScheduleStatus类实际上允许您创建具有相同内部值的多个对象实例。因为您有一个FlightScheduleStatus的公共(public)构造函数,所以我想您正在代码中的其他地方使用该构造函数将int转换为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的常规构造函数设为私有(private),因此它仅由FlightScheduleStatus本身使用。工厂构造函数允许我们返回已经创建的对象,而不是创建新的对象。

关于flutter - Flutter不支持switch语句的自定义枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61545412/

10-12 01:57