Let freezed use factory on initializing

57 Views Asked by At

I have a freezed class

@freezed
class Lobby with _$Lobby implements DataObject {
  @JsonSerializable(fieldRename: FieldRename.snake, explicitToJson: true)
  const factory Lobby({
    Redirect? redirect,
  }) = _Lobby;
  const Lobby._();

  factory Lobby.fromJson(Map<String, dynamic> json) => _$LobbyFromJson(json);
}

and an enum

enum Redirect {
  test1('/thisistest1'),
  test2('/thisistest2'),

  const Redirect(this.path);

  factory Redirect.fromPath(String path) {
    return values.firstWhere((e) => e.path == path);
  }

  final String path;
}

When constructing my Lobby-Class I use the fromJson factory. In my Json I have the path and not the Redirect enum so I need to translate that.

Can I either tell freezed to use the Redirect.fromPath factory or can I somehow change the .fromJson accordingly?

What would be the best approach?

EDIT I have this data json in my edge-case, this is the print

{redirect: null}

And I am calling Lobby.fromJson(data)

1

There are 1 best solutions below

6
Vladyslav Ulianytskyi On BEST ANSWER

You could try JsonConverter:

enum Redirect {
  test1('/thisistest1'),
  test2('/thisistest2');

  const Redirect(this.path);

  factory Redirect.fromPath(String path) => values.firstWhere((e) => e.path == path);

  final String path;
}

class RedirectStringToEnumConvertor implements JsonConverter<Redirect?, String?> {
  const RedirectStringToEnumConvertor();

  @override
  Redirect? fromJson(String? json) => json == null? null : Redirect.fromPath(json);

  @override
  String? toJson(Redirect? object) => object?.toString();
}

@freezed
@JsonSerializable(fieldRename: FieldRename.snake, explicitToJson: true)
class Lobby with _$Lobby implements DataObject {
  const factory Lobby({
    @RedirectStringToEnumConvertor() Redirect? redirect,
  }) = _Lobby;

  const Lobby._();

  factory Lobby.fromJson(Map<String, dynamic> json) => _$LobbyFromJson(json);
}

More info freezed