繁体   English   中英

是否可以在 dart 中动态设置方法的返回类型

[英]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> 你也可以看看eithertuple

这可能有效:


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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM