Flutter не работает с пользовательским перечислением для оператора swtich - PullRequest
0 голосов
/ 01 мая 2020
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;
    }
}

здесь я создал пользовательский enum с пользовательским классом. но когда мы используем оператор switch, не go в любом случае здесь. пожалуйста, помогите мне в этом вопросе. Я хочу работать с этим кодом так, как есть, если это перечислимый класс.

, даже если я использую liveStatus.flightScheduleStatus.value, он не работает.

1 Ответ

1 голос
/ 01 мая 2020

Полагаю, проблема в том, что ваш класс FlightScheduleStatus фактически позволяет вам создавать несколько экземпляров объекта с одинаковым внутренним значением. Поскольку у вас есть конструктор publi c для 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 private, так что он используется только FlightScheduleStatus сам. Заводской конструктор позволяет нам возвращать объекты, которые уже были созданы, вместо создания новых объектов.

...