You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:18:01