Windows主机调用Flutter客户端方法:如何接收返回值?
Flutter Windows插件:C++主动调用Flutter并接收返回值的实现方案
常规调用回顾
Flutter调用C++的标准流程:
Flutter端代码:
final int result = await platform.invokeMethod('getBatteryLevel');
C++端响应代码:
channel.SetMethodCallHandler( [](const flutter::MethodCall<> &call, std::unique_ptr<flutter::MethodResult<>> result) { if (call.method_name() == "getBatteryLevel") { int battery_level = GetBatteryLevel(); battery_level != -1 ? result->Success(battery_level) : result->Error("UNAVAILABLE", "Battery level not available."); } else { result->NotImplemented(); } });
反向调用需求与问题
需要实现C主动向Flutter推送电池数据,并接收Flutter的返回字符串。已尝试在Flutter端通过return返回结果,但C端无法正确传递MethodResult接收返回值,出现编译错误。
Flutter客户端修正代码
确保方法名与C++端调用一致,直接通过return返回响应:
Future<dynamic> _handleMethodCall(MethodCall call) async { switch (call.method) { case "sendBatteryLevel": // 与C++端InvokeMethod的方法名完全匹配 final args = call.arguments as Map; final batteryLevel = args['batteryLevel'] as int; // 返回字符串作为响应 return 'Thank you for informing me!'; default: throw PlatformException(code: 'NOT_IMPLEMENTED', message: 'Method not implemented'); } }
C++端正确实现
需要自定义MethodResult子类来处理Flutter的返回值,通过std::promise/std::future同步获取结果(异步场景可直接在回调中处理):
#include <future> #include <string> #include <flutter/method_channel.h> #include <flutter/encodable_value.h> // 自定义MethodResult,处理Flutter的响应 class CustomMethodResult : public flutter::MethodResult<flutter::EncodableValue> { public: explicit CustomMethodResult(std::promise<std::string> promise) : promise_(std::move(promise)) {} void Success(const std::optional<flutter::EncodableValue>& result) override { if (result && std::holds_alternative<std::string>(*result)) { promise_.set_value(std::get<std::string>(*result)); } else { promise_.set_value("Invalid response type"); } } void Error(const std::string& error_code, const std::optional<std::string>& error_message, const std::optional<flutter::EncodableValue>&) override { std::string error_str = "Error: " + error_code; if (error_message) error_str += ": " + *error_message; promise_.set_value(error_str); } void NotImplemented() override { promise_.set_value("Method not implemented in Flutter"); } private: std::promise<std::string> promise_; }; // 主动调用Flutter并接收返回值的函数 void SendBatteryUpdateToFlutter() { int battery_level = GetBatteryLevel(); // 创建promise和future用于接收结果 std::promise<std::string> response_promise; auto response_future = response_promise.get_future(); // 调用Flutter方法 method_channel_->InvokeMethod( "sendBatteryLevel", std::make_unique<flutter::EncodableValue>(flutter::EncodableMap{ {flutter::EncodableValue("batteryLevel"), flutter::EncodableValue(battery_level)} }), std::make_unique<CustomMethodResult>(std::move(response_promise))); // 阻塞等待Flutter返回结果(异步场景可移除,通过future回调处理) std::string flutter_response = response_future.get(); // 处理返回值,例如打印或业务逻辑 // printf("Flutter response: %s\n", flutter_response.c_str()); }
核心注意事项
- 方法名严格匹配:C++端
InvokeMethod的第一个参数必须和Flutter端switch的case值完全一致,否则会触发NotImplemented。 - MethodResult的传递:不能传入空的
unique_ptr,必须实例化自定义的MethodResult子类,通过回调或同步机制获取返回值。 - 类型一致性:确保Flutter返回的类型与C++端解析的类型匹配(示例中为字符串),如果返回其他类型(如int、Map),需在
Success方法中对应处理EncodableValue的类型。
内容的提问来源于stack exchange,提问作者Eberulf
相关产品推荐
相关产品推荐

