0

私はフリーズ パッケージを使用して不変モデルを操作し、json_serializable パッケージによる json シリアル化の組み込み機能を利用してますUserさまざまな共用体タイプ ( UserLoggedInUserGeneralUserError)を持つ単純なクラス/モデルがあります。

@freezed
class User with _$User {
  const factory User(String id, String email, String displayName) =
      UserLoggedIn;
  const factory User.general(String email, String displayName) = UserGeneral;
  const factory User.error(String message) = UserError;

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

runtimeType私は複数のコンストラクターを使用しており、ドキュメントで提案されているように API にキーを含めたくないので、コンバーターを作成できます(もう少し下にスクロールすると、次の文で始まります: If you don't control the JSON response,その後、カスタム コンバーターを実装できます。 )

それに基づいて、次のコンバータークラスを作成しました。

class UserConverter implements JsonConverter<User, Map<String, dynamic>> {
  const UserConverter();

  @override
  User fromJson(Map<String, dynamic> json) {
    if (json['id'] != null) {
      return UserLoggedIn.fromJson(json);
    } else if (json['error'] != null) {
      return UserError.fromJson(json);
    } else {
      return UserGeneral.fromJson(json);
    }
  }

  @override
  Map<String, dynamic> toJson(User data) => data.toJson();
}

ドキュメントは、注釈を介してこのコンバーターを使用する別のクラス (ラッパー クラス) を参照するようになりました。

@freezed
class UserModel with _$UserModel {
  const factory UserModel(@UserConverter() User user) = UserModelData;

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

質問:ラッパー クラス ( ) を使用せずに、このコンバーターを使用することは可能UserModelですか?

理由:このラッパー クラスは、不要な別の抽象化レイヤーを追加しています (私の場合)。特にラッパークラスには他の利点/目的がなく、それを使用せずにそれを行うことができるはずだと感じているため.

4

0 に答える 0