서브타입이어야 합니다
서브타입이어야 합니다
The type '{0}' must be a subtype of '{1}' for '{2}'.
이 진단은 타입 인자가 기대하는 슈퍼타입 관계를 만족하지 못할 때 나타나요. 주로 dart:ffi 함수 포인터 관련 호출에서 발생해요.
본문
이 애널라이저 진단은 두 가지 경우에 발생해요.
Pointer.fromFunction호출이나NativeCallable생성자에서, 타입 인자(명시적이든 추론된 것이든)가 메서드의 첫 번째 인자로 전달된 함수의 타입의 슈퍼타입이 아닐 때.DynamicLibrary.lookupFunction호출에서, 첫 번째 타입 인자가 두 번째 타입 인자의 슈퍼타입이 아닐 때.
FFI에 대한 자세한 내용은 C interop using dart:ffi 문서를 참고하면 좋아요.
예시
다음 코드는 함수 f의 타입(String Function(int))이 타입 인자 T(Int8 Function(Int8))의 서브타입이 아니기 때문에 이 진단이 나와요.
import 'dart:ffi';
typedef T = Int8 Function(Int8);
double f(double i) => i;
void g() {
Pointer.fromFunction<T>(f, 5.0);
}
일반적인 해결 방법
어느 쪽이 맞는지에 따라 다른 고쳐주면 돼요.
1) 함수가 맞다면 타입 인자를 그에 맞게 바꿔요.
import 'dart:ffi';
typedef T = Float Function(Float);
double f(double i) => i;
void g() {
Pointer.fromFunction<T>(f, 5.0);
}
2) 타입 인자가 맞다면 함수를 그에 맞게 바꿔요.
import 'dart:ffi';
typedef T = Int8 Function(Int8);
int f(int i) => i;
void g() {
Pointer.fromFunction<T>(f, 5);
}