Flutter Pigeon中@HostApi类互相引用生成绑定时报错如何解决?
解决方案
首先明确Pigeon的两个核心类型定位:
- 用
@HostApi/@FlutterApi修饰的抽象类是跨端调用接口,仅用于定义需要原生/Flutter侧实现的方法集合,本身不能作为方法参数、返回值的类型使用 - 跨端传递的数据结构需要定义为普通的无注解Dart类,Pigeon会自动为其生成双端的序列化逻辑
你需要将「数据结构定义」和「跨端调用接口定义」拆分实现,具体操作如下:
1. 先定义可跨端传递的公共数据类
这些类不需要加@HostApi注解,也不需要加abstract修饰符,仅用来承载跨端传递的属性即可:
import 'package:pigeon/pigeon.dart'; // 跨端传递的数据类 class FlightController {} class Camera {} class Gimbal {} class Controller {} class Radar {} class Lidar {}
2. 分别定义各模块的跨端调用接口
所有需要原生实现的方法,都封装在单独的@HostApi修饰的接口类中,接口名可以和对应数据类做区分(比如加Api后缀):
// Aircraft的调用接口 @HostApi() abstract class AircraftApi { FlightController getFlightController(); List<Camera> getCameras(); List<Gimbal> getGimbal(); Controller getController(); Radar getRadar(); List<Lidar> getLidars(); } // FlightController的调用接口 @HostApi() abstract class FlightControllerApi { // 示例方法:传入FlightController实例,调用原生对应实现 void takeOff(FlightController controller); double getCurrentAltitude(FlightController controller); } // 其余Camera、Gimbal等模块的调用接口同理定义 @HostApi() abstract class CameraApi { void takePhoto(Camera camera); }
3. 调用逻辑说明
你从AircraftApi获取到对应的数据类实例后,把实例作为参数传入对应模块Api的方法即可触发原生侧的对应实现,Pigeon会自动处理参数的序列化和跨端传递。
内容的提问来源于stack exchange,提问作者rhobro
相关产品推荐
相关产品推荐

