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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:37:18