如何在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,提问作者箐竹亭
相关产品推荐
相关产品推荐

