Dart FFI NativeCallback类型不匹配问题求助
解决Dart FFI回调类型不匹配问题
你遇到的这个看似矛盾的类型错误,本质是类型来源不一致导致的——虽然报错里的函数签名看起来完全一样,但实际上UnsignedInt或Pointer<Void>可能来自不同的命名空间/库。
核心解决方案:统一FFI类型的命名空间
确保所有与FFI相关的类型(包括UnsignedInt、Pointer)都明确指向dart:ffi库的实现,避免类型混淆。修改后的代码如下:
import 'dart:ffi' as ffi; // 明确使用dart:ffi的类型定义回调签名 typedef EventHandlerFunction = ffi.UnsignedInt Function( ffi.UnsignedInt inEvent, ffi.UnsignedInt inPropertyID, ffi.UnsignedInt inParam, ffi.Pointer<ffi.Void> inContext, ); // 函数参数和返回值同样使用dart:ffi的类型 ffi.UnsignedInt handleStateEvent( ffi.UnsignedInt inEvent, ffi.UnsignedInt inPropertyID, ffi.UnsignedInt inParam, ffi.Pointer<ffi.Void> inContext, ) { return ffi.UnsignedInt(0); } // 初始化NativeCallable时也明确关联dart:ffi的类型 final callback = ffi.NativeCallable<EventHandlerFunction>.isolateLocal( handleStateEvent, exceptionalReturn: ffi.UnsignedInt(0), );
常见排查点
- 检查是否导入了多个FFI相关的库(比如第三方FFI封装库),导致
UnsignedInt等类型被重复定义。 - 避免省略命名空间直接使用
UnsignedInt,即使导入了dart:ffi,用ffi.UnsignedInt的显式写法能彻底避免类型混淆。 - 注意:Linux系统下调用的是
.so库而非.dylib(后者是macOS平台),不过你提到其他函数调用正常,所以这点不影响当前问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

