ffi_native_only_classes_extending_nativefieldwrapperclass1_can_be_pointer
只有擴充套件 NativeFieldWrapperClass1 的類才能作為 Pointer 傳遞。
描述
#當使用 @Native 註解的函式或方法的 FFI 簽名中有一個引數是 Pointer 型別,但對應的 Dart 引數型別是不擴充套件 NativeFieldWrapperClass1(也不是 Pointer 或 TypedData)的類例項時,分析器會生成此診斷資訊。
示例
#以下程式碼會生成此診斷資訊,因為 MyService 沒有擴充套件 NativeFieldWrapperClass1,但其 process 方法的 @Native 簽名指示接收者應作為 Pointer<Void> 傳遞
dart
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 簽名更改為使用Handle代替Pointer作為引數。這允許傳遞對 Dart 物件本身的引用,原生程式碼可以使用 Dart C API 與該物件進行互動。dartimport 'dart:ffi'; class MyService { @Native<Void Function(Handle, Int8)>(symbol: 'MyService_process') external void process(int data); }