Alb*_*uña 1 api json response dart flutter
我的应用程序目前正在为每个 api 响应使用自定义类作为模型。但是我正在尝试更改它,以优化一些小东西,因此我正在尝试实现一个类包装器,例如称为 ApiResponse。但是对于 make fromJson 和 toJson,它的静态调用和方法不能正常工作。
例如,我将展示我正在尝试的内容。MyModel -> 类响应。ApiResponse -> 包含任何模型类的主类,并且必须调用子方法作为其本身“fromjson/tojson”。测试 -> 用于测试目的的类,对类的错误注释。
class MyModel {
String id;
String title;
MyModel({this.id, this.title});
factory MyModel.fromJson(Map<String, dynamic> json) {
return MyModel(
id: json["id"],
title: json["title"],
);
}
Map<String, dynamic> toJson() => {
"id": this.id,
"title": this.title,
};
}
class ApiResponse<T> {
bool status;
String message;
T data;
ApiResponse({this.status, this.message, this.data});
factory ApiResponse.fromJson(Map<String, dynamic> json) {
return ApiResponse<T>(
status: json["status"],
message: json["message"],
data: (T).fromJson(json["data"])); // The method 'fromJson' isn't defined for the type 'Type'.
// Try correcting the name to the name of an existing method, or defining a method named 'fromJson'.
}
Map<String, dynamic> toJson() => {
"status": this.status,
"message": this.message,
"data": this.data.toJson(), // The method 'toJson' isn't defined for the type 'Object'.
// Try correcting the name to the name of an existing method, or defining a method named 'toJson'
};
}
class Test {
test() {
ApiResponse apiResponse = ApiResponse<MyModel>();
var json = apiResponse.toJson();
var response = ApiResponse<MyModel>.fromJson(json);
}
}
Run Code Online (Sandbox Code Playgroud)
基本响应.dart
class BaseResponse {
dynamic message;
bool success;
BaseResponse(
{this.message, this.success});
factory BaseResponse.fromJson(Map<String, dynamic> json) {
return BaseResponse(
success: json["success"],
message: json["message"]);
}
}
Run Code Online (Sandbox Code Playgroud)
list_response.dart
server response for list
{
"data": []
"message": null,
"success": true,
}
@JsonSerializable(genericArgumentFactories: true)
class ListResponse<T> extends BaseResponse {
List<T> data;
ListResponse({
String message,
bool success,
this.data,
}) : super(message: message, success: success);
factory ListResponse.fromJson(Map<String, dynamic> json, Function(Map<String, dynamic>) create) {
var data = List<T>();
json['data'].forEach((v) {
data.add(create(v));
});
return ListResponse<T>(
success: json["success"],
message: json["message"],
data: data);
}
}
Run Code Online (Sandbox Code Playgroud)
single_response.dart
server response for single object
{
"data": {}
"message": null,
"success": true,
}
@JsonSerializable(genericArgumentFactories: true)
class SingleResponse<T> extends BaseResponse {
T data;
SingleResponse({
String message,
bool success,
this.data,
}) : super(message: message, success: success);
factory SingleResponse.fromJson(Map<String, dynamic> json, Function(Map<String, dynamic>) create) {
return SingleResponse<T>(
success: json["success"],
message: json["message"],
data: create(json["data"]));
}
}
Run Code Online (Sandbox Code Playgroud)
数据响应.dart
class DataResponse<T> {
Status status;
T res; //dynamic
String loadingMessage;
GeneralError error;
DataResponse.init() : status = Status.Init;
DataResponse.loading({this.loadingMessage}) : status = Status.Loading;
DataResponse.success(this.res) : status = Status.Success;
DataResponse.error(this.error) : status = Status.Error;
@override
String toString() {
return "Status : $status \n Message : $loadingMessage \n Data : $res";
}
}
enum Status {
Init,
Loading,
Success,
Error,
}
Run Code Online (Sandbox Code Playgroud)
或者如果使用freezed那么 data_response 可以是
@freezed
abstract class DataResponse<T> with _$DataResponse<T> {
const factory DataResponse.init() = Init;
const factory DataResponse.loading(loadingMessage) = Loading;
const factory DataResponse.success(T res) = Success<T>;
const factory DataResponse.error(GeneralError error) = Error;
}
Run Code Online (Sandbox Code Playgroud)
用法:(改造库的一部分
@GET(yourEndPoint)
Future<SingleResponse<User>> getUser();
@GET(yourEndPoint)
Future<ListResponse<User>> getUserList();
Run Code Online (Sandbox Code Playgroud)
如果不使用 reftofit:
const _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _data = <String, dynamic>{};
final _result = await _dio.request<Map<String, dynamic>>('$commentID',
queryParameters: queryParameters,
options: RequestOptions(
method: 'GET',
headers: <String, dynamic>{},
extra: _extra,
baseUrl: baseUrl),
data: _data);
final value = SingleResponse<Comment>.fromJson(
_result.data,
(json) => Comment.fromJson(json),
);
Run Code Online (Sandbox Code Playgroud)
你不能在 Dart 上调用类型的方法,因为静态方法必须在编译时解析,并且类型直到运行时才有值。
但是,您可以将解析器回调传递给构造函数并使用Serializable每个模型都可以实现的接口(例如)。然后,通过更新你ApiResponse,ApiResponse<T extends Serializable>它会知道每个类型T都有一个toJson()方法。
这是更新的完整示例。
class MyModel implements Serializable {
String id;
String title;
MyModel({this.id, this.title});
factory MyModel.fromJson(Map<String, dynamic> json) {
return MyModel(
id: json["id"],
title: json["title"],
);
}
@override
Map<String, dynamic> toJson() => {
"id": this.id,
"title": this.title,
};
}
class ApiResponse<T extends Serializable> {
bool status;
String message;
T data;
ApiResponse({this.status, this.message, this.data});
factory ApiResponse.fromJson(Map<String, dynamic> json, Function(Map<String, dynamic>) create) {
return ApiResponse<T>(
status: json["status"],
message: json["message"],
data: create(json["data"]),
);
}
Map<String, dynamic> toJson() => {
"status": this.status,
"message": this.message,
"data": this.data.toJson(),
};
}
abstract class Serializable {
Map<String, dynamic> toJson();
}
class Test {
test() {
ApiResponse apiResponse = ApiResponse<MyModel>();
var json = apiResponse.toJson();
var response = ApiResponse<MyModel>.fromJson(json, (data) => MyModel.fromJson(data));
}
}
Run Code Online (Sandbox Code Playgroud)