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

Flutter Windows平台EventChannel传递Map数据失败求助

Windows Flutter EventChannel 传递Map数据解决方案

问题背景

在Windows平台使用Flutter EventChannel时,直接传递C原生Map会失败——因为flutter::EncodableValue无法直接包装原生Map类型,必须转为Flutter C SDK提供的EncodableMap类型才能正常跨通道传递。

解决步骤

1. 明确EncodableMap类型定义

flutter::EncodableMap是Flutter C++ SDK的内置类型,本质是std::map<flutter::EncodableValue, flutter::EncodableValue>的别名,要求所有键值对都必须被包装为flutter::EncodableValue类型。

2. 转换原生Map为EncodableMap

假设你的BrowsingDeviceMap是std::map<std::string, std::string>类型,遍历原生Map,将每个键值对分别包装为EncodableValue后插入到EncodableMap中:

// 假设BrowsingDeviceMap是std::map<std::string, std::string>类型
flutter::EncodableMap encodable_map;
for (const auto& pair : BrowsingDeviceMap) {
    encodable_map[flutter::EncodableValue(pair.first)] = flutter::EncodableValue(pair.second);
}

如果Map的值是int、bool等其他基础类型,直接用EncodableValue包装对应类型即可,它支持多种基础数据类型的转换。

3. 修改事件发送代码

替换原代码中失败的发送逻辑,改为传递转换后的EncodableMap:

void sentBrowsingEvent(std::unique_ptr<flutter::EventSink<flutter::EncodableValue>>&& events) {
    while (1) {
        Browsing_Check_routine(); // 假设此函数会更新BrowsingDeviceMap
        
        // 转换原生Map为EncodableMap
        flutter::EncodableMap encodable_map;
        for (const auto& pair : BrowsingDeviceMap) {
            encodable_map[flutter::EncodableValue(pair.first)] = flutter::EncodableValue(pair.second);
        }
        
        // 发送包装后的EncodableMap
        events->Success(flutter::EncodableValue(encodable_map));
        
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

4. Flutter端接收处理

Flutter端可以直接将接收到的事件转为Map<dynamic, dynamic>类型处理:

final eventChannel = EventChannel('getFromWinsBrowsingDevice');
eventChannel.receiveBroadcastStream().listen((event) {
  Map<dynamic, dynamic> deviceMap = event;
  // 处理Map数据逻辑
}, onError: (error) {
  // 错误处理逻辑
});

内容的提问来源于stack exchange,提问作者DavidLee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:05:33