native_field_invalid_type 진단: native 필드에 쓸 수 없는 타입이에요

native_field_invalid_type 진단: native 필드에 쓸 수 없는 타입이에요

@Native 어노테이션이 붙은 필드에 native 필드로 지원하지 않는 타입을 썼을 때 Dart 분석기가 알려주는 native_field_invalid_type 진단에 대한 설명이에요. native 필드에는 포인터, 배열, 숫자 타입, compound 타입만 쓸 수 있어요.

출처: native_field_invalid_type

본문

설명

@Native 어노테이션이 붙은 필드의 타입이 native 필드로 지원되지 않을 때 분석기가 이 진단을 만들어요.

native 필드는 포인터, 배열, 숫자 타입, 그리고 Compound의 하위 타입(즉 struct나 union)을 지원해요. Handle이나 NativeFunction 같은 다른 NativeType의 하위 타입은 native 필드로 허용되지 않아요.

native 함수는 external 필드 대신 external 함수로 다뤄야 해요.

Handle이 지원되지 않는 이유는 Dart 객체를 포인터로 투명하게 저장하고 불러올 방법이 없기 때문이에요.

FFI에 대해 더 자세히 알고 싶다면 dart:ffi를 사용한 C interop 문서를 참고해요.

예시

다음 코드는 free 필드가 지원되지 않는 native 타입인 NativeFunction을 사용하기 때문에 이 진단을 만들어요.

import 'dart:ffi';

@Native<NativeFunction<Void Function()>>()
external void Function() free;

흔한 해결 방법

NativeFunction 필드로 기존 native 함수를 바인딩하려는 의도였다면, @Native 메서드를 대신 사용해요.

import 'dart:ffi';

@Native<Void Function(Pointer<Void>)>()
external void free(Pointer<Void> ptr);

C에서 함수 포인터를 저장하는 필드를 바인딩하려면, Dart 필드에 포인터 타입을 사용해요.

import 'dart:ffi';

@Native()
external Pointer<NativeFunction<Void Function(Pointer<Void>)>> free;

더 알아보기