【问题标题】:Dart define generic functionDart 定义泛型函数
【发布时间】:2021-01-05 12:30:28
【问题描述】:

我用下面的代码定义了一个函数类型

typedef DownloadCallback = Future<StreamedResponse> Function<T>(
  BuildContext context,
  T fileIdentifier,
);

并创建了一个类似类型的函数

Future<StreamedResponse> publicFileDownloader(
  BuildContext context,
  String url,
) {
  final request = Request('GET', Uri.parse(url));
  return Client().send(request);
}

但我有以下错误

参数类型“Future Function(BuildContext, String)”不能分配给参数类型“Future Function(BuildContext, T)”。

如何在不使用dynamic 类型的情况下修复错误?

【问题讨论】:

  • 你能举一个完整的例子来说明这个问题吗? (例如,您如何使用 publicFileDownloader 方法和 DownloadCallback 类型)。
  • 在另一个类中我有一个final DownloadCallback downloader在构造函数中赋值,你可以使用final DownloadCallback downloader = publicFileDownloader;来重现错误
  • 您的问题是您缺少类型的通用部分。当您写 final DownloadCallback 时,您实际上是在说 final DownloadCallback&lt;dynamic&gt;。尝试使用final downloader = publicFileDownloader;final DownloadCallback&lt;String&gt; downloader = publicFileDownloader;
  • 其实你也应该定义你的 DownloadCallback 为:typedef DownloadCallback&lt;T&gt; = Future&lt;String&gt; Function( String context, T fileIdentifier, );

标签: dart


【解决方案1】:

这是另一种尝试指定类型最终使 Dart 更加混乱的情况。问题在于:

final DownloadCallback downloader = publicFileDownloader;

其实意思是:

final DownloadCallback<dynamic> downloader = publicFileDownloader;

因此,你应该做的是:

final DownloadCallback<String> downloader = publicFileDownloader;

下一个问题是在声明 typedef 时错误使用泛型。您真正想要的是以下内容:

typedef DownloadCallback<T> = Future<StreamedResponse> Function(
  BuildContext context,
  T fileIdentifier,
);

所以完整的代码是:

typedef DownloadCallback<T> = Future<StreamedResponse> Function(
  BuildContext context,
  T fileIdentifier,
);

Future<StreamedResponse> publicFileDownloader(
  BuildContext context,
  String url,
) {
  final request = Request('GET', Uri.parse(url));
  return Client().send(request);
}

final DownloadCallback<String> downloader = publicFileDownloader;

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2020-08-30
    • 2013-11-26
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多