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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:45:20