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];
}
return ApiResponse.fromJsonList(
response.data as Map<String, dynamic>,
(json) => json.map(MyModel.fromJson).toList(),
list: (json) => List<Map?>.from(json['items']),
).data!;
Discussed in #8
Originally posted by Reprevise December 31, 2022
I have a class like this:
I use it as so:
How can I do this with Crimson?