Расширенные перечисления Dart — вызов const factory без перенаправления не является постоянным выражением
Я переношу свое приложение Flutter 3 на использование новых расширенных перечислений вместо того, чтобы расширять перечисления вручную.
У меня есть это перечисление (многие функции сейчас устарели, но они используются в моем существующем коде). Я json сериализую его и сохраняю.
import 'package:vepo/src/application/shared_with_back_end/option/option.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
enum VgnItmType {
nullObject(value: Option(name: 'Null Object', iconCodePoint: 0xf07a, id: 0)),
groceryItm(value: Option(name: 'Grocery Item', iconCodePoint: 0xf291, id: 1)),
menuItm(value: Option(name: 'Menu Item', iconCodePoint: 0xf2e3, id: 2)),
groceryStoreItm(
value: Option(name: 'Grocery Store', iconCodePoint: 0xf07a, id: 3)),
restaurantItm(
value: Option(name: 'Restaurant', iconCodePoint: 0xf2e7, id: 4)),
eventItm(value: Option(name: 'Event', iconCodePoint: 0xf500, id: 5)),
fashionItm(value: Option(name: 'Fashion Item', iconCodePoint: 0xf553, id: 6)),
recipeItm(value: Option(name: 'Recipe', iconCodePoint: 0xf86b, id: 7));
const VgnItmType({required this.value});
final Option value;
static Map<VgnItmType, Option> items = <VgnItmType, Option>{
VgnItmType.groceryItm: Option(
name: 'Grocery Item',
id: VgnItmType.groceryItm.index,
iconCodePoint: 0xf291),
VgnItmType.fashionItm: Option(
name: 'Fashion Item',
id: VgnItmType.fashionItm.index,
iconCodePoint: 0xf553),
VgnItmType.menuItm: Option(
name: 'Menu Item', id: VgnItmType.menuItm.index, iconCodePoint: 0xf2e3),
VgnItmType.recipeItm: Option(
name: 'Recipe', id: VgnItmType.recipeItm.index, iconCodePoint: 0xf86b),
VgnItmType.groceryStoreItm: Option(
name: 'Grocery Store',
id: VgnItmType.groceryStoreItm.index,
iconCodePoint: 0xf07a),
VgnItmType.restaurantItm: Option(
name: 'Restaurant',
id: VgnItmType.restaurantItm.index,
iconCodePoint: 0xf2e7),
VgnItmType.eventItm: Option(
name: 'Event', id: VgnItmType.eventItm.index, iconCodePoint: 0xf500),
VgnItmType.nullObject:
Option(name: '', id: VgnItmType.nullObject.index, iconCodePoint: 0xf07a)
};
String get name => items[this]!.name;
int get id => items[this]!.id;
int get iconCodePoint => items[this]!.iconCodePoint;
Option get option => items[this]!;
static List<Option> get options =>
values.map((e) => e.value).sortedBy((option) => option.name);
static List<VgnItmType> get enums =>
items.keys.toList().sortedBy((option) => option.name);
static VgnItmType idToEnum(int id) =>
items.keys.firstWhere((element) => element.id == id);
}
класс опций:
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:vepo/src/_common/entity_types/entity.dart';
part 'option.freezed.dart';
part 'option.g.dart';
@freezed
class Option extends Entity with _$Option {
const factory Option(
{required int iconCodePoint,
String? fontFamily,
required int id,
required String name}) = _Option;
const Option._();
factory Option.empty() {
return const Option(iconCodePoint: 0, id: 0, name: '');
}
factory Option.fromJson(Map<String, dynamic> json) => _$OptionFromJson(json);
}
Сущность:
abstract class Entity {
const Entity();
}
Я получаю ошибки:
lib/src/_common/enums/vegan_item_type.dart:5:21: Ошибка: вызов const factory без перенаправления не является константным выражением. nullObject(value: Option(name: 'Null Object', iconCodePoint: 0xf07a, id: 0)), ^ lib/src/_common/enums/vegan_item_type.dart:6:21: Error: вызов const factory без перенаправления не является постоянное выражение. productItm(значение: Option(имя: «Продуктовый товар», iconCodePoint: 0xf291, id: 1)), ^ lib/src/_common/enums/vegan_item_type.dart:14:20: Ошибка: вызов фабрики const без перенаправления не является постоянное выражение. recipeItm(value: Option(name: 'Recipe', iconCodePoint: 0xf86b, id: 7)); ^ lib/src/_common/enums/vegan_item_type.dart:13:21: Ошибка: вызов const factory без перенаправления не является постоянным выражением. fashionItm(значение: Option(имя: «Элемент моды», iconCodePoint: 0xf553, id: 6)), ^ lib/src/_common/enums/vegan_item_type.dart:9:14: Ошибка: вызов const factory без перенаправления не является постоянным выражением. значение: Option(имя: «Продовольственный магазин», iconCodePoint: 0xf07a, id: 3)), ^ lib/src/_common/enums/vegan_item_type.dart:11:14: Ошибка: вызов const factory без перенаправления не является константой выражение. значение: Option(имя: «Ресторан», iconCodePoint: 0xf2e7, id: 4)), ^ lib/src/_common/enums/vegan_item_type.dart:7:18: Ошибка: вызов const factory без перенаправления не является постоянным выражением . menuItm(value: Option(name: 'Menu Item', iconCodePoint: 0xf2e3, id: 2)), ^ lib/src/_common/enums/vegan_item_type.dart:12:19: Error: вызов const factory без перенаправления не является постоянное выражение. eventItm(значение: Option(имя: «Событие», iconCodePoint: 0xf500, идентификатор: 5)),
Ошибка здесь:
Разве это не мойOption
инициализировать постоянное выражение?