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> 인스턴스의 요소
  • StructUnion 하위 클래스의 필드 (단, 그 필드의 타입이 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);
}

더 알아보기