Переключить перечисление на атрибуты в dart

У меня есть это перечисление:

enum ContentError {
  e410('Exception: 410'),
  e411('Excetion: 411'),
  e412('Exception: 412'),
  e413('Exception: 413');

  const ContentError(this.name);

  final String name;
}

Теперь я получил строку и хочу изменить регистр в именах Enum.

switch (myString) {
  case ContentError.e410.name:
    // do something
  ...
}

но это не работает так, как написано The property 'name' can't be accessed on the type 'ContentError' in a constant expression.

Как я могу изменить регистр в атрибуте Enum name?

Обновлено: Смотрите это dart.pad как MRE

@jarinox Я не совсем понимаю, почему это постоянное выражение и как мне нужно его изменить.

progNewbie 06.03.2024 00:37

@jarinox хм, нет.

progNewbie 08.03.2024 20:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
240
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуй это!

enum ContentError {
  e410,
  e411,
  e412,
  e413,
}

extension ContentErrorExtension on ContentError {
  String get name {
    switch (this) {
      case ContentError.e410:
        return 'Exception: 410';
      case ContentError.e411:
        return 'Exception: 411';
      case ContentError.e412:
        return 'Exception: 412';
      case ContentError.e413:
        return 'Exception: 413';
      default:
        return '';
    }
  }
}

void main() {
  String myString = 'Exception: 410';

  switch (myString) {
    case ContentError.e410.name:
      print('Handling Exception 410');
      break;
    case ContentError.e411.name:
      print('Handling Exception 411');
      break;
    case ContentError.e412.name:
      print('Handling Exception 412');
      break;
    case ContentError.e413.name:
      print('Handling Exception 413');
      break;
    default:
      print('Unhandled exception');
  }
}

это дает мне Extension methods can't be used in constant expressions.

progNewbie 05.03.2024 17:46

Вы можете изменить регистр переключения и определить действие для каждого случая, используя карту и возвращая метод для выполнения правильных условий, шаг, описанный в коде ниже:

// your input
final myString = ContentError.e410.name;

// define the action rule, like switch case
final rule = {
  ContentError.e410.name: () {
    print('do something e410');
  },
  ContentError.e411.name: () {
    print('do something e411');
  },
  ContentError.e412.name: () {
    print('do something e412');
  },
  ContentError.e413.name: () {
    print('do something e413');
  },
}[myString];

// default action, act like default 
// in the switch case
final def = () {
  print('default');
};

// execute the rule result
// if rule not contains the input
// then call default action
(rule ?? def)();

И вот результаты:

Надеюсь, это решит вашу проблему. Спасибо 😉

Ответ принят как подходящий

Поскольку вы все равно не получите исчерпывающего результата при переключении строки, вы можете просто использовать singleWhere, чтобы получить значение перечисления из строки, и использовать try-catch:

try {
  final contentError = ContentError.values.singleWhere((e) => e.name == myString);

  switch (contentError) {
    case ContentError.e410:
    // Do something
  }
} on StateError {
  // The 'default' case
}

Однако этот код будет перехватывать StateError, поступающий из любого кода в случаях переключения, поэтому лучшим решением может быть:

ContentError? contentError;
try {
  contentError = ContentError.values.singleWhere((e) => e.name == myString);
} on StateError {
  // The 'default' case
}

if (contentError != null) {
  switch (contentError) {
    case ContentError.e410:
    // Do something
  }
}

это не работает, как я понимаю The expression of a constant pattern must be a valid constant.. Потому что contentError не является константой.

progNewbie 09.03.2024 10:39

Тогда наверняка в вашем вопросе не хватает некоторых деталей. Пожалуйста, обновите свой вопрос, включив в него реальную проблему.

Dhafin Rayhan 09.03.2024 13:23

Собственно, это все, что я делаю

progNewbie 09.03.2024 13:38

Ваша проблема не воспроизводима. Фактически, все эти ответы здесь, включая мой ответ, могут правильно соответствовать обстоятельствам, которые вы объяснили в своем вопросе. Вы должны предоставить минимальный воспроизводимый пример, который каждый сможет запустить, чтобы получить именно ту ошибку, которую вы получаете. В настоящее время ваши короткие фрагменты кода совершенно не помогают воспроизвести проблему.

Dhafin Rayhan 09.03.2024 14:03

Вот дартпад => dartpad.dev/?id=44e53a1907cc35a612c26be2c67b65b4

progNewbie 09.03.2024 15:50

Так что проблема теперь просто в опечатке. Вы набрали case backendError.e410 (маленькая «b») вместо case BackendError.e410 (заглавная «B»). backendError относится к локальной конечной переменной, которую вы определили в этой области, а BackendError относится к перечислению. Если вы это исправите, это должно работать.

Dhafin Rayhan 09.03.2024 16:55

Другие вопросы по теме