У меня есть это перечисление:
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 хм, нет.





Попробуй это!
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.
Вы можете изменить регистр переключения и определить действие для каждого случая, используя карту и возвращая метод для выполнения правильных условий, шаг, описанный в коде ниже:
// 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 не является константой.
Тогда наверняка в вашем вопросе не хватает некоторых деталей. Пожалуйста, обновите свой вопрос, включив в него реальную проблему.
Собственно, это все, что я делаю
Ваша проблема не воспроизводима. Фактически, все эти ответы здесь, включая мой ответ, могут правильно соответствовать обстоятельствам, которые вы объяснили в своем вопросе. Вы должны предоставить минимальный воспроизводимый пример, который каждый сможет запустить, чтобы получить именно ту ошибку, которую вы получаете. В настоящее время ваши короткие фрагменты кода совершенно не помогают воспроизвести проблему.
Вот дартпад => dartpad.dev/?id=44e53a1907cc35a612c26be2c67b65b4
Так что проблема теперь просто в опечатке. Вы набрали case backendError.e410 (маленькая «b») вместо case BackendError.e410 (заглавная «B»). backendError относится к локальной конечной переменной, которую вы определили в этой области, а BackendError относится к перечислению. Если вы это исправите, это должно работать.
@jarinox Я не совсем понимаю, почему это постоянное выражение и как мне нужно его изменить.