使用Messaging Center在页面间传递数据接收失效该如何解决?
故障原因
- 核心问题为消息发送时机早于订阅注册时机:你当前代码的执行顺序是先调用
MessagingCenter.Send发送消息,再实例化FirstPage,最后才会执行FirstPage构造函数内的MessagingCenter.Subscribe订阅逻辑。消息发送时没有任何订阅者监听Hi这个消息标识,自然无法触发回调。 - 补充排查点:你当前代码中发送、订阅的泛型参数(发送方类型
Page、消息标识Hi、传递数据类型string)是完全匹配的,这部分没有问题;如果后续调整发送方类型,需要保证收发两端的泛型签名完全一致,否则也会收不到消息。
修复方案
调整消息发送和页面初始化的顺序即可,先完成订阅注册再发送消息:
async private void isClicked(object sender, EventArgs e) { // 先实例化FirstPage,内部会自动执行订阅逻辑 var firstPage = new FirstPage(); // 此时已有订阅者,再发送消息即可触发回调 MessagingCenter.Send<Page, string>(this, "Hi", "Data Sent"); // 最后执行页面跳转 await Navigation.PushAsync(firstPage); }
额外注意事项
- 页面销毁时请记得取消订阅,避免内存泄漏,可以在
FirstPage中添加如下逻辑:
protected override void OnDisappearing() { base.OnDisappearing(); MessagingCenter.Unsubscribe<Page, string>(this, "Hi"); }
- 如果你的项目是.NET MAUI,
MessagingCenter已经被官方标记为弃用,推荐使用CommunityToolkit.Mvvm中的WeakReferenceMessenger实现跨组件消息传递,无需手动取消订阅也不会出现内存泄漏问题。
内容的提问来源于stack exchange,提问作者Anikwenwa Tosan
相关产品推荐
相关产品推荐

