【问题标题】:Flutter does not work custom enum for swtich statementFlutter 不适用于 switch 语句的自定义枚举
【发布时间】:2020-05-01 15:24:27
【问题描述】:
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 它也不起作用。

【问题讨论】:

  • 可以添加 liveStatus.flightScheduleStatus 和 liveStatus.flightScheduleStatus.value 吗?
  • 我根据您的代码创建了一个示例,并且工作正常。看看this dartpad

标签: flutter dart enums switch-statement


【解决方案1】:

我猜问题是您的FlightScheduleStatus 类实际上允许您创建具有相同内部值的多个对象实例。因为你有一个FlightScheduleStatus 的公共构造函数,我猜你在代码的其他地方使用它来将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 的普通构造函数设为私有,因此它仅供FlightScheduleStatus 本身使用。工厂构造器允许我们返回已经创建的对象,而不是创建新对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多