跳到主要内容

must_be_a_subtype

类型 '{0}' 必须是 '{1}' 的子类型,对于 '{2}'。

描述

#

分析器在以下两种情况下会产生此诊断:

  • 在调用 Pointer.fromFunctionNativeCallable 构造函数时,如果类型参数(无论是显式还是推断的)不是传递给方法的第一个参数的函数的类型的超类型。
  • 在调用 DynamicLibrary.lookupFunction 时,如果第一个类型参数不是第二个类型参数的超类型。

有关 FFI 的更多信息,请参阅使用 dart:ffi 的 C 互操作

示例

#

以下代码会产生此诊断,因为函数 f 的类型 (String Function(int)) 不是类型参数 T (Int8 Function(Int8)) 的子类型。

dart
import 'dart:ffi';

typedef T = Int8 Function(Int8);

double f(double i) => i;

void g() {
  Pointer.fromFunction<T>(f, 5.0);
}

常见修复方法

#

如果函数正确,则更改类型参数以匹配函数。

dart
import 'dart:ffi';

typedef T = Float Function(Float);

double f(double i) => i;

void g() {
  Pointer.fromFunction<T>(f, 5.0);
}

如果类型参数正确,则更改函数以匹配类型参数。

dart
import 'dart:ffi';

typedef T = Int8 Function(Int8);

int f(int i) => i;

void g() {
  Pointer.fromFunction<T>(f, 5);
}