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

如何在Flutter中使用Pigeon实现与Windows平台C++代码的通信?

Flutter + Windows C++ 用Pigeon实现add函数交互完整示例

1. 定义Pigeon接口并生成代码

首先在项目根目录新建pigeon.dart文件,定义交互接口:

import 'package:pigeon/pigeon.dart';

@HostApi()
abstract class CalcApi {
  int add(int a, int b);
}

执行生成命令(确保已在pubspec.yaml中添加pigeon依赖):

flutter pub run pigeon --input pigeon.dart --dart_out lib/pigeon.dart --cpp_out windows/runner/pigeon_calc.cpp --cpp_header_out windows/runner/pigeon_calc.h

生成后,windows/runner目录下会多出pigeon_calc.h和pigeon_calc.cpp两个自动生成的文件。

2. 实现C++端的add逻辑

在windows/runner目录下新建calc_impl.cpp文件,编写接口实现:

#include "pigeon_calc.h"
#include <flutter/plugin_registrar_windows.h>
#include <memory>

class CalcApiImpl : public CalcApi {
 public:
  int add(int a, int b) override {
    return a + b;
  }
};

void RegisterCalcApi(flutter::PluginRegistrarWindows* registrar) {
  CalcApi::SetUp(registrar->messenger(), std::make_unique<CalcApiImpl>());
}

3. 修改CMakeLists.txt配置编译规则

打开windows/runner/CMakeLists.txt,做以下三处修改:

  • 在set(SOURCES块中,添加生成的pigeon文件和自定义实现文件:
set(SOURCES
  "flutter_window.cpp"
  "main.cpp"
  "utils.cpp"
  "win32_window.cpp"
  # 新增以下两行
  "pigeon_calc.cpp"
  "calc_impl.cpp"
)
  • 在文件末尾,注册我们的API插件:
# 注册CalcApi插件
add_library(calc_api_plugin STATIC calc_impl.cpp)
target_link_libraries(calc_api_plugin PRIVATE flutter flutter_wrapper_plugin)
target_include_directories(calc_api_plugin PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")

list(APPEND PLUGIN_LIST calc_api_plugin)
  • 确保头文件路径被正确包含(默认runner目录已包含,保险起见可添加):
target_include_directories(runner PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")

4. Flutter端调用并显示结果

修改lib/main.dart,调用C++的add方法并展示结果:

import 'package:flutter/material.dart';
import 'pigeon.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Pigeon Windows Demo')),
        body: const Center(child: AddResultWidget()),
      ),
    );
  }
}

class AddResultWidget extends StatefulWidget {
  const AddResultWidget({super.key});

  @override
  State<AddResultWidget> createState() => _AddResultWidgetState();
}

class _AddResultWidgetState extends State<AddResultWidget> {
  int _result = 0;

  Future<void> _callAdd() async {
    final api = CalcApi();
    final result = await api.add(3, 5);
    setState(() {
      _result = result;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('3 + 5 = $_result'),
        const SizedBox(height: 20),
        ElevatedButton(
          onPressed: _callAdd,
          child: const Text('计算'),
        ),
      ],
    );
  }
}

5. 运行程序

执行flutter run -d windows,点击界面上的"计算"按钮,即可看到3+5的结果显示在界面上。

关键注意点

  • 确保pigeon依赖版本与你的Flutter版本兼容,例如在pubspec.yaml中添加:pigeon: ^10.0.0(版本号可根据实际调整)
  • C++代码必须正确继承Pigeon生成的抽象类,并实现所有接口方法,否则会出现编译错误
  • CMakeLists.txt中必须将新增的cpp文件加入编译源,否则会出现链接错误

内容的提问来源于stack exchange,提问作者箐竹亭

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:37:02