Skip to content

Using Crimson with a generic class #9

Description

@simc

Discussed in #8

Originally posted by Reprevise December 31, 2022
I have a class like this:

class ApiResponse<T> extends Equatable {
  final List<CustomError>? errors;
  final T? data;
  const ApiResponse({
    this.errors,
    this.data,
  });

  T get dataOrThrow => data ?? (throw error!);

  CustomError? get error {
    // ...
  }

  factory ApiResponse.fromJson(
    Map<String, dynamic> map,
    T Function(Map<String, dynamic> json) create,
  ) {
    return ApiResponse<T>(
      errors: map['errors'] != null
          ? List<CustomError>.from(
              map['errors']?.map((x) => CustomError.fromJson(x)),
            )
          : null,
      data: map['data'] != null ? create(map['data']) : null,
    );
  }

  factory ApiResponse.fromJsonList(
    Map<String, dynamic> map,
    T Function(List<Map<String, dynamic>>) create, {
    List<dynamic> Function(Map<String, dynamic> json)? list,
  }) {
    T? getData() {
      if (map['data'] == null) return null;
      final items = List<Map?>.from(
        list?.call(map['data'] as Map<String, dynamic>) ??
            map['data'] as List<dynamic>,
      );
      return create(
        items.whereNotNull().map((e) => e as Map<String, dynamic>).toList(),
      );
    }

    return ApiResponse<T>(
      errors: map['errors'] != null
          ? List<CustomError>.from(
              map['errors'].map((x) => CustomError.fromJson(x)),
            )
          : null,
      data: getData(),
    );
  }

  @override
  List<Object?> get props => [errors, data];
}

I use it as so:

return ApiResponse.fromJsonList(
  response.data as Map<String, dynamic>,
  (json) => json.map(MyModel.fromJson).toList(),
  list: (json) => List<Map?>.from(json['items']),
).data!;

How can I do this with Crimson?

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions