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
相关产品推荐
相关产品推荐

