Flutter 是否可以设置方法';在dart中动态选择返回类型

Flutter 是否可以设置方法';在dart中动态选择返回类型,flutter,dart,Flutter,Dart,首先看一下这个演示方法: Future<Product1Model> getProducts() async { String url = .......; var headers = {.......}; var request = MultipartRequest('GET', Uri.parse(url)); request.headers.addAll(headers); StreamedResponse response =

首先看一下这个演示方法:

  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;
  }
Future getProducts()异步{
字符串url=。。。。。。。;
变量头={……};
var request=MultipartRequest('GET',Uri.parse(url));
request.headers.addAll(headers);
StreamdResponse response=等待请求。发送();
如果(response.statusCode==200){
var body=wait response.stream.bytesToString();
返回Product1Method.Product1ModelFromJson(正文);
}
返回null;
}
在这里可以看到,此方法的返回类型是Product1Model。但是,可能有许多类型的产品,因此,我需要动态地设置
返回类型
(Product1Model)和
响应体解码方法
(Product1Method.Product1ModelFromJson),以重用
getProducts
方法

那么,这是Dart吗?
如果可能的话,我该怎么做呢?

如果你的意思是有时它会返回
Product1Model
有时它会返回
Product2Model
,如果是这样的话,那么我建议将其设置为
Future
Future
。您可以查看
元组
,也可以尝试返回未来

  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;
  }
Or开关语句

dynamic x = await getProducts();
switch(x.runtimeType){
  case (Product1Model()):
  //Something
  case (Product2Model()):
   //Something
}
或者如果你有一个单行代码

x is Product1Model? Something: x is Product2Model?Something: And so on
这可能会奏效:


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);
  
}

是的,我有时需要Product1模型,有时需要Product2模型等等。但如果有可能的话,我可以减少大量代码来解码动态类型的产品,这从根本上说是不可能的。声明的返回类型用于静态类型检查,但您需要的返回类型仅在运行时确定。您知道在调用方法时将返回什么类型吗?或者只有当你从API得到响应时才知道这一点?是的,我知道返回类型。有不同的API来获得不同类型的产品。我想重用getProducts函数,这就是我想动态设置返回类型的原因。您可以这样调用您的方法:getProducts()。唯一的问题是-您正在调用另一个类的静态方法以获取响应,但不确定如何执行此操作。理想情况下,您的ProductxMethod都应该具有相同的方法名(例如ProducModelFromJson,并从相同的基类继承)。检查这是否对你有效。我是按照你解释的方式做的,但是,我只是想知道,如果可能的话,大量的代码可以减少。你想减少什么部分?x是Product1模型零件吗?您需要有某种方法来获得它,您可以使用switch语句,它稍微短一点,或者?运营商,虽然短得多,但只适用于1条线路Yap…………这些是我能想到的减少代码的唯一方法感谢您的合作。实际上,不仅仅是这两种产品型号。我有很多产品型号。这就是为什么我想动态设置返回类型,以便在可能的情况下重用getProducts方法。我不想要这个解决方案,因为我已经在代码中实现了它。但是,我真的很感谢你和我合作。非常感谢,伙计。您帮助我减少了许多代码行。你的第一个答案是我期待的答案。
x is Product1Model? Something: x is Product2Model?Something: And so on

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);
  
}
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());