[英]Is it possible to set a method's return type dynamically in dart
先看一下这个demo方法:
Future<Product1Model> getProducts() async {
String url = .......;
var headers = {.......};
var request = MultipartRequest('GET', Uri.parse(url));
request.headers.addAll(headers);
StreamedResponse response = await request.send();
if (response.statusCode == 200) {
var body = await response.stream.bytesToString();
return Product1Method.Product1ModelFromJson(body);
}
return null;
}
在这里可以看到,这个方法的返回类型是Product1Model 。 但是,可能有很多类型的产品,因此,我需要动态设置return types
(Product1Model)和response body decode method
(Product1Method.Product1ModelFromJson)以重用getProducts
方法。
那么,Dart 有可能做到这一点吗? 如果可能的话,那我该怎么做呢?
如果您的意思是有时它会返回Product1Model
有时它会返回Product2Model
,如果是这种情况则否,我建议将其设为Future<dynamic>
或Future<Object>
。 你也可以看看either
和tuple
这可能有效:
class Product1Model {
String a;
Product1Model(this.a);
}
class Product1Method {
static Product1Model Product1ModelFromJson(String body) => Product1Model(body);
}
class Product2Model {
String a;
Product2Model(this.a);
}
class Product2Method {
static Product2Model Product2ModelFromJson(String body) => Product2Model(body);
}
typedef ProductModelFromJson<T> = T Function(String);
Future<T> getProducts<T>(ProductModelFromJson<T> f) async {
var body=T.runtimeType.toString();
return f(body);
}
main() async {
var a= await getProducts<Product1Model>(Product1Method.Product1ModelFromJson);
var b=await getProducts<Product2Model>(Product2Method.Product2ModelFromJson);
print(a);
print(b);
}
再三考虑 - 你的 function 应该返回“body”变量:
Future<String> getProducts() async {
String url = .......;
var headers = {.......};
var request = MultipartRequest('GET', Uri.parse(url));
request.headers.addAll(headers);
StreamedResponse response = await request.send();
if (response.statusCode == 200) {
var body = await response.stream.bytesToString();
return body;
}
return null;
}
然后 - 因为你知道什么时候调用你期望的类型:
Product1Method.Product1ModelFromJson(getProducts());
尝试返回未来
Future<dynamic> getProducts() async {
String url = .......;
var headers = {.......};
var request = MultipartRequest('GET', Uri.parse(url));
request.headers.addAll(headers);
StreamedResponse response = await request.send();
if (response.statusCode == 200) {
var body = await response.stream.bytesToString();
return Product1Method.Product1ModelFromJson(body);
}
return null;
}
或未来
Future<Object> getProducts() async {
String url = .......;
var headers = {.......};
var request = MultipartRequest('GET', Uri.parse(url));
request.headers.addAll(headers);
StreamedResponse response = await request.send();
if (response.statusCode == 200) {
var body = await response.stream.bytesToString();
c return Product1Method.Product1ModelFromJson(body);
}
return null;
}
然后你可以在另一端设置一个接收器,通过执行类似的操作来检查它的类型
dynamic x = await getProducts();
if (x is Product1Model){
//Something
}
else if (x is Product2Model){
//Something
}
或 switch 语句
dynamic x = await getProducts();
switch(x.runtimeType){
case (Product1Model()):
//Something
case (Product2Model()):
//Something
}
或者,如果您在某事中有一个单行代码,
x is Product1Model? Something: x is Product2Model?Something: And so on
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.