gpt4 book ai didi

flutter - 如何在dart中的Object类的子类中将方法作为参数调用?

转载 作者:行者123 更新时间:2023-12-03 04:53:21 24 4
gpt4 key购买 nike

我在服务类中有一个方法:

@override
Future<String> registerNewVoter(Object deviceAppInfo) async {
Dio dio = new Dio();
final url = API().endpointVoterUri(EndpointVoter.newVoter).toString();
final header = {'Content-type': 'application/json'};
final data = await deviceAppInfo; ///need to call the method getInfo() on the Object class which returns a future

final response =
await dio.post(url, data: data, options: Options(headers: header));
if (response.statusCode == 200) {
Map map = response.data;
final uuid = map['result']['voter_uuid'];
return uuid;
}
print(
'Request $url failed\nResponse: ${response.statusCode} ${response.statusMessage}');
throw response;
}

我在方法中使用 Object deviceAppInfo类型作为参数,以保持服务尽可能纯净(遵循mvvm原理)。子类是 DeviceAppInfo,它具有一个称为 getInfo()(以及数据来自何处)的异步方法,该方法应分配给数据(请参见代码中的注释)。我正在努力查看如何使该类与DeviceAppInfo类分离。有什么建议么...?我正在考虑调用工厂构造函数,但不确定如何实现它。这是我的DeviceAppInfo类:
class DeviceAppInfo {
DeviceAppInfo({
this.platform,
this.platformVersion,
this.appVersion,
});


final String platform;
final String platformVersion;
final String appVersion;

Map<String, dynamic> toMap() => {
'platform': this.platform,
'platform_version': this.platformVersion,
'app_version': this.appVersion,
};

Future<Map<String, dynamic>> getInfo() async {
final values = await Future.wait([
getPlatform(),
getPlatformVersion(),
getProjectVersion(),
]);

return DeviceAppInfo(
platform: values[0],
platformVersion: values[1],
appVersion: values[2],
).toMap();
}

Future<String> getPlatform() async {
try {
if (Platform.isIOS) {
return 'ios';
}
return 'android';
} on PlatformException catch (e) {
return e.toString();
}
}

Future<String> getPlatformVersion() async {
try {
final platformVersion = await GetVersion.platformVersion;
return platformVersion;
} on PlatformException catch (e) {
return e.toString();
}
}

Future<String> getProjectVersion() async {
try {
final projectVersion = await GetVersion.projectVersion;
return projectVersion;
} on PlatformException catch (e) {
return e.toString();
}
}
}

最佳答案

我相信DeviceAppInfo是您服务的明显合作者,而将其隐藏在Object后面是不好的工程:

  • 它将使您的Api难以正确使用,并且易于错误地使用
  • 您的api不再是自我文档的,如果不阅读文档或代码,则无法正确使用它。

  • 但是,可以讨论将其作为参数公开还是提供给服务的构造函数。

    话虽如此,至少有3个选项可以使您的服务与DeviceAppInfo脱钩:

    选项1:将getInfo()的结果传递给方法
  • 最少可疑的问题,也是将入站数据解耦的常见形式
  • 如果您将Map用作输入类型,我有点怀疑,仍然很容易为 map 提供不正确的键

  • 选项2:将函数作为参数
  • 函数有点难使用,尚不清楚可以使用整个代码库中的哪些函数(与类相比)

  • 选项3:强制转换为动态

    请不要那样做
  • 最接近问题
  • 的目标
    不阅读文档/代码,很难正确使用
  • 函数
  • 您将编译时错误更改为运行时错误
  • 关于flutter - 如何在dart中的Object类的子类中将方法作为参数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61017754/

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