DotNet Maui中WeakReferenceMessenger跨组件通信失效问题求助
解决方案
1. 检查MyMessage类的定义
确保消息类是public权限且正确继承自ValueMessage<string>(因为你传递的是字符串类型的条码),示例代码:
public class MyMessage : ValueMessage<string> { public MyMessage(string value) : base(value) { } }
如果是自定义消息类,必须保证包含可被监听端正确获取的Value属性,且类型与发送端一致。
2. 调整消息注册/注销时机
将注册代码移至MainPage的OnAppearing方法,注销代码移至OnDisappearing,避免注册时机过晚或实例被回收导致监听失效:
protected override void OnAppearing() { base.OnAppearing(); WeakReferenceMessenger.Default.Register<MyMessage>(this, (r, m) => { MainThread.BeginInvokeOnMainThread(() => { // 先加简单验证,确认消息是否收到 Console.WriteLine($"收到条码:{m.Value}"); OnMessageReceived(r, m.Value); }); }); } protected override void OnDisappearing() { base.OnDisappearing(); WeakReferenceMessenger.Default.Unregister<MyMessage>(this); }
3. 确认消息类型与命名空间一致
检查MainActivity和MainPage中引用的MyMessage是否为同一个类——避免在不同命名空间下定义同名类,导致消息类型不匹配无法触发回调。
4. 验证条码捕获与消息发送逻辑
确保MainActivity正确捕获到扫描器的Intent数据,使用Newland扫描器官方指定的Intent Key获取条码(不同型号可能略有差异,需确认):
protected override void OnNewIntent(Intent intent) { base.OnNewIntent(intent); // Newland扫描器默认的条码数据Key string barcode = intent.GetStringExtra("com.newland.scanner.intent.extra.BARCODE_DATA"); if (!string.IsNullOrEmpty(barcode) && barcode.Length <= 12) { WeakReferenceMessenger.Default.Send(new MyMessage(barcode)); } }
可在此处添加日志输出,确认条码已正确获取且Send方法执行。
5. 排除回调自身逻辑问题
暂时替换OnMessageReceived为简单的弹窗或日志,验证消息是否真的未被接收,排除是回调方法内部逻辑导致的无响应:
WeakReferenceMessenger.Default.Register<MyMessage>(this, (r, m) => { MainThread.BeginInvokeOnMainThread(async () => { await DisplayAlert("收到条码", m.Value, "确定"); // OnMessageReceived(r, m.Value); }); });
内容的提问来源于stack exchange,提问作者infopete
相关产品推荐
相关产品推荐

