Расширенные перечисления 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инициализировать постоянное выражение?

0 ответов

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