Xamarin 表单 MessagingCenter 取消订阅未按预期工作

2024-03-11

当我在应用程序中多次来回导航时,MessagingCenter.Subscribe() 内编写的功能会被多次调用。但每次在订阅之前,我都会在构造函数中取消订阅,如下所示,但它仍然不起作用。

MessagingCenter.Unsubscribe<SubmitPage>(this,"Save");
MessagingCenter.Subscribe<SubmitPage>(this, "Save", (sender) =>
{
   DisplayToastOnSuccessfulSubmission();
});

在我的应用程序中,我有 6 页(git https://github.com/suchithm/MessageCenterSampleApp),我使用 MessagingCenter.Send 将数据保存在第六页中,并且将在第二页中订阅相同的数据,并且保存的消息将显示在第二页中(导航到该页面后)。

现在我像 2->1->2->3->4->5->6 一样导航,在这种特殊情况下 DisplayToastOnSuccessfulSubmission() 将被调用两次(因为 Page2 构造函数被调用两次)。

我什至尝试将相同的代码放在 OnAppearing 中。 我无法在 OnDisappear 中取消订阅,因为我需要在到达第 6 页进行保存时连接事件。

在示例项目中重现了相同的行为并添加到此处https://github.com/suchithm/MessageCenterSampleApp https://github.com/suchithm/MessageCenterSampleApp
Dropbox 链接 https://www.dropbox.com/s/72joc4ttb7yr2ge/MsgCenterSample.zip?dl=0

执行此操作的正确方法是什么?


但每次订阅之前,我都会在构造函数中取消订阅,如下所示,但它仍然不起作用。

MessagingCenter.Subscribe()被多次调用,因为第 2 页有两个实例在你的代码中,他们都使用MessagingCenter.Subscribe()方法,这就是为什么Unsubscribe没用。

您可以修改page2() to a 单例以确保只有一个实例Page2在你的项目中,之后当你发送消息时, 这MessagingCenter.Subscribe()仅被调用一次。

第2页.cs:

public static Page2 instance = new Page2();

public static Page2 GetPage2Instance()
{
    if(instance == null)
    {
        return new Page2();
    }
    return instance;
}

private Page2()
{
    InitializeComponent();
    MessagingCenter.Unsubscribe<Page2>(this, "SaveToastPage2");
    MessagingCenter.Subscribe<Page2>(this, "SaveToastPage2", (sender) =>
    {
       DisplayToastOnSuccessfulSubmission();
    }
 }

当您发送消息时:

MessagingCenter.Send(Page2.GetPage2Instance(), "SaveToastPage2");

EDIT :

请记住,声明构造函数Page2类是私有的,以确保只有一个实例Page2当然在你的项目中。

private Page2()
{
   ...
}

修改你的Page1.cs code :

async void Handle_Next(object sender, System.EventArgs e)
{
    await App.NavigationRef.PushAsync(Page2.GetPage2Instance(), true);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin 表单 MessagingCenter 取消订阅未按预期工作 的相关文章

随机推荐