ffi_native_only_classes_extending_nativefieldwrapperclass1_can_be_pointer
NativeFieldWrapperClass1 を拡張するクラスのみが Pointer として渡すことができます。
説明
#@Native アノテーションが付与された関数またはメソッドの FFI シグネチャに、Pointer 型のパラメータがあるにもかかわらず、対応する Dart のパラメータ型が NativeFieldWrapperClass1 を拡張しないクラスインスタンス(または Pointer や TypedData)である場合に、アナライザーはこの診断を生成します。
例
#以下のコードでは、MyService が NativeFieldWrapperClass1 を拡張していないため、この診断が生成されます。しかし、process メソッドの @Native シグネチャは、レシーバーが Pointer<Void> として渡されることを示しています。
import 'dart:ffi';
class MyService { // MyService does not extend NativeFieldWrapperClass1
@Native<Void Function(Pointer<Void>, Int8)>(symbol: 'MyService_process')
external void process(int data);
}一般的な修正
#Dart クラスがネイティブオブジェクトをラップすることを意図している場合: Dart クラスを
NativeFieldWrapperClass1に拡張させてください。これは、Dart クラスインスタンスに対応するネイティブオブジェクトがあり、そのポインタを渡すべきである場合に正しいアプローチです。dartimport 'dart:ffi'; class MyService extends NativeFieldWrapperClass1 { @Native<Void Function(Pointer<Void>, Int8)>(symbol: 'MyService_process') external void process(int data); }Dart オブジェクトへの不透明なハンドルを渡すことを意図している場合:
@Nativeアノテーションの FFI シグネチャを、パラメータのPointerの代わりにHandleを使用するように変更してください。これにより、Dart オブジェクト自体の参照を渡すことができるようになり、ネイティブコードは Dart C API を使用して対話できます。dartimport 'dart:ffi'; class MyService { @Native<Void Function(Handle, Int8)>(symbol: 'MyService_process') external void process(int data); }