Как управлять сериализацией / десериализацией свойства enum с помощью Dart / Flutter to Firestore? - PullRequest
0 голосов
/ 28 октября 2018

Мне нужно сохранить объект Dart из моего приложения Flutter в Firestore

Этот объект содержит свойство enum.

Какое лучшее решение для сериализации / десериализации этого свойства enum?

  • в виде строки

  • в виде Int

Я не нахожу простого решения для этого.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Ответ Гюнтера верен, если немного неполон.

Сериализуемый JSON обрабатывает преобразование Enum в и из строки, вот пример кода, который генерируется:

const _$HoursEnumMap = <Hours, dynamic>{
  Hours.FullTime: 'FullTime',
  Hours.PartTime: 'PartTime',
  Hours.Casual: 'Casual',
  Hours.Contract: 'Contract',
  Hours.Other: 'Other'
};

ивзамен он преобразует его обратно с помощью этой довольно тупой функции:

T _$enumDecode<T>(Map<T, dynamic> enumValues, dynamic source) {
  if (source == null) {
    throw ArgumentError('A value must be provided. Supported values: '
        '${enumValues.values.join(', ')}');
  }
  return enumValues.entries
      .singleWhere((e) => e.value == source,
          orElse: () => throw ArgumentError(
              '`$source` is not one of the supported values: '
              '${enumValues.values.join(', ')}'))
      .key;
}

Мне это так надоело, я решил сделать небольшой пакет, чтобы убрать сложность, и он мне очень пригодился:

https://pub.dev/packages/enum_to_string

По крайней мере, его устройство было протестировано на растворе копирования / вставки.Любые дополнения или запросы тяги приветствуются.

0 голосов
/ 29 октября 2018

Лучший способ - использовать целочисленное значение enums, поскольку его проще всего преобразовать из типа / в тип int / enum.

Необходимо позаботиться о том, чтобы новые значения перечисления добавлялись только в концекогда вы изменяете перечисление, в противном случае сохраненные значения станут недействительными.

https://pub.dartlang.org/packages/built_value обеспечивает генерацию кода для классов и имеет свои собственные перечисления и выполняет сериализацию JSON для вас.

https://pub.dartlang.org/packages/json_serializable, кажется, поддерживает перечисления Dart напрямую, но я не использовал его сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...