Xamarin Android绑定库如何重命名自动生成的重复同名事件
问题根源
Xamarin Android 绑定生成器存在隐式转换逻辑:当 Java 类中包含 void Set[字段名]([接口类型]) 形式的 setter 方法,且入参是包含回调方法的接口时,会自动将接口的回调方法转换为 C# 风格的事件挂载到类上,无需开发者手动实现接口订阅逻辑。
你遇到的重复事件问题,正是因为CrossBridgeCommunicator类同时包含setMainBridge和setWidgetBridge两个 setter 方法,且两个方法的入参都是同一个BridgeMessageParser.IListener接口,生成器为两个 setter 分别生成了一套同名事件,最终触发了定义冲突。
解决方案
方案1:为自动生成事件加前缀(推荐)
在Metadata.xml中为两个 setter 方法分别配置事件名前缀,生成的事件会自动加上前缀避免冲突,配置示例如下:
<!-- 为MainBridge对应的自动生成事件添加Main前缀 --> <attr path="/api/package[@name='com.usebutton.sdk.internal.bridge']/class[@name='CrossBridgeCommunicator']/method[@name='setMainBridge' and parameter[1]/@type='com.usebutton.sdk.internal.bridge.BridgeMessageParser$IListener']" name="eventNamePrefix">Main</attr> <!-- 为WidgetBridge对应的自动生成事件添加Widget前缀 --> <attr path="/api/package[@name='com.usebutton.sdk.internal.bridge']/class[@name='CrossBridgeCommunicator']/method[@name='setWidgetBridge' and parameter[1]/@type='com.usebutton.sdk.internal.bridge.BridgeMessageParser$IListener']" name="eventNamePrefix">Widget</attr>
配置完成后重新编译,原本重复的WebViewDismiss事件会生成为MainWebViewDismiss和WidgetWebViewDismiss,冲突自动消除。
如果上述路径匹配失败,可在绑定项目编译生成的obj/[Debug/Release]/api.xml文件中,搜索CrossBridgeCommunicator、setMainBridge、setWidgetBridge的准确节点路径,替换上述示例中的path属性即可。
方案2:禁用该类的自动事件生成
如果你不需要使用自动生成的事件,也可以直接关闭CrossBridgeCommunicator类的自动事件生成逻辑,配置如下:
<attr path="/api/package[@name='com.usebutton.sdk.internal.bridge']/class[@name='CrossBridgeCommunicator']" name="generateEvents">false</attr>
关闭后生成器不会再生成相关事件,需要使用回调时,你可以手动获取MainBridge、WidgetBridge实例自行订阅回调即可。
内容的提问来源于stack exchange,提问作者Andrés Leandro

