address_receiver 진단: '.address'의 수신자는 구체적인 FFI 타입이어야 해요
address_receiver 진단: '.address'의 수신자는 구체적인 FFI 타입이어야 해요
분석기가 내보내는 진단에는 이름이 있어요. address_receiver는 .address getter를 허용된 FFI 타입이 아닌 수신자에 사용했을 때 Dart 분석기가 알려주는 컴파일 타임 진단이에요. .address getter는 FFI 데이터 구조의 내부 메모리를 가리키는 Pointer를 얻기 위해 사용해요.
출처: address_receiver
본문
설명
분석기는 .address getter의 정적 타입이 허용된 FFI 타입 중 하나가 아닌 수신자에 사용되었을 때 이 진단을 만들어요. .address getter는 FFI 데이터 구조의 내부 메모리를 가리키는 Pointer를 얻기 위해 사용해요.
.address의 수신자는 다음 중 하나여야 해요.
- 구체적인
TypedData인스턴스 (예:Uint8List) []로 접근한 구체적인TypedData인스턴스의 요소Array<T>인스턴스 (dart:ffi에서 가져온 것)[]로 접근한Array<T>인스턴스의 요소Struct나Union하위 클래스의 필드 (단, 그 필드의 타입이Array<T>, 중첩된Struct, 또는 중첩된Union인 경우)Struct또는Union인스턴스
예시
다음 코드는 여러 가지 잘못된 수신자 때문에 이 진단을 만들어요.
import 'dart:ffi';
final class MyStruct extends Struct {
@Uint8()
external int x;
@Uint8()
external int y;
}
@Native(isLeaf: true)
external void nativeLeafCall(Pointer ptr);
void main() {
final struct = Struct.create();
final y = struct.y;
// Incorrect: The receiver is not a struct field, but some integer.
nativeLeafCall(y.address);
}
흔한 해결 방법
.address getter의 수신자가 허용된 타입 중 하나가 되도록 해요. .address getter는 TypedData, Array, Struct, Union 인스턴스 또는 그 필드·요소의 메모리를 가리키는 Pointer를 얻기 위한 것이에요.
import 'dart:ffi';
@Native(isLeaf: true)
external void nativeLeafCall(Pointer ptr);
final class MyStruct extends Struct {
@Uint8()
external int x;
@Uint8()
external int y;
}
void main() {
final struct = Struct.create();
// Correct: The receiver is a struct field.
nativeLeafCall(struct.y.address);
}