gpt4 book ai didi

dart - 如何在 flutter 中将泛型类型作为参数传递给 Future

转载 作者:IT王子 更新时间:2023-10-29 07:19:36 26 4
gpt4 key购买 nike

我的目标是创建一个单例类来处理网络服务器请求,并将通用类型(这是我的数据模型)作为参数传递给解码并分配给我的数据模型。我部分完成的代码如下所示,非常感谢帮助。

class Network{
Future<someDataModel> _getRequest(T) async {
print("entered");
final response = await client
.get("http://api.themoviedb.org/3/movie/popular?api_key=$_apiKey");
print(response.body.toString());
if (response.statusCode == 200) {
// If the call to the server was successful, parse the JSON
return T.fromJson(json.decode(response.body));
} else {
// If that call was not successful, throw an error.
throw Exception('Failed to load post');
}
}

在同一个类中,我使用下面的公共(public)方法访问 getRequest。因此,通过这种方法,我的意图是将我的数据模型作为泛型类型参数传递给 get 请求,并让解码部分发生。部分完成的代码如下。

 getAllList(){
return _getRequest(dataModel);
}

最佳答案

下面的解决方案适用于通用对象以及通用对象列表(来自 JSON 列表响应)。

首先,你需要有一个函数来检查泛型对象的类型并返回对应的fromJson的结果。调用:

class Generic {
/// If T is a List, K is the subtype of the list.
static T fromJson<T, K>(dynamic json) {
if (json is Iterable) {
return _fromJsonList<K>(json) as T;
} else if (T == LoginDetails) {
return LoginDetails.fromJson(json) as T;
} else if (T == UserDetails) {
return UserDetails.fromJson(json) as T;
} else if (T == Message) {
return Message.fromJson(json) as T;
} else if (T == bool || T == String || T == int || T == double) { // primitives
return json;
} else {
throw Exception("Unknown class");
}
}

static List<K> _fromJsonList<K>(List<dynamic> jsonList) {
return jsonList?.map<K>((dynamic json) => fromJson<K, void>(json))?.toList();
}
}

然后你的函数最终看起来像这样:

class Network {
/// If T is a List, K is the subtype of the list.
Future<T> _getRequest<T, K>() async {
print("entered");
final response = await client
.get("http://api.themoviedb.org/3/movie/popular?api_key=$_apiKey");
print(response.body.toString());
if (response.statusCode == 200) {
// If the call to the server was successful, parse the JSON
return Generic.fromJson<T, K>(json.decode(response.body));
} else {
// If that call was not successful, throw an error.
throw Exception('Failed to load post');
}
}

例如,如果您希望响应是一条消息,您可以调用 _getRequest<Message, void>() .如果您需要一个消息列表,您可以调用 _getRequest<List<Message>, Message>() .

此外,如果您有一个带有通用数据对象的响应包装器(通常是这种情况),您可以像这样配置它:

class Wrapper<T, K> {
bool? isSuccess;
T? data;

Wrapper({
this.isSuccess,
this.data,
});

factory Wrapper.fromJson(Map<String, dynamic> json) => _$WrapperFromJson(json);

Map<String, dynamic> toJson() => _$WrapperToJson(this);
}

Wrapper<T, K> _$WrapperFromJson<T, K>(Map<String, dynamic> json) {
return Wrapper<T, K>(
isSuccess: json['isSuccess'] as bool?,
data: json['data'] == null ? null : Generic.fromJson<T, K>(json['data']),
);
}

Map<String, dynamic> _$WrapperToJson(Wrapper wrapper) => {
"isSuccess": wrapper.isSuccess,
"data": wrapper.data,
};

然后像这样使用它:

Wrapper<T, K>.fromJson(json.decode(response.body))

关于dart - 如何在 flutter 中将泛型类型作为参数传递给 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56271651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com