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

Suc*_*ith 9 xamarin.android xamarin xamarin.forms

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

MessagingCenter.Unsubscribe<SubmitPage>(this,"Save");
MessagingCenter.Subscribe<SubmitPage>(this, "Save", (sender) =>
{
   DisplayToastOnSuccessfulSubmission();
});
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我有 6 页(git),我使用 MessagingCenter.Send 将数据保存在第 6 页,同样将在第 2 页订阅,保存的消息将显示在第 2 页(导航到该页面后)。

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

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

在示例项目中重现相同的行为并在此处添加https://github.com/suchithm/MessageCenterSampleApp
Drop box 链接

这样做的正确方法是什么?

Yor*_*hen 10

但是每次订阅之前,我都会在构造函数中取消订阅相同的内容,如下所示,仍然没有奏效。

MessagingCenter.Subscribe()被多次调用,因为您的代码中有两个 Page2 实例,它们都使用MessagingCenter.Subscribe()方法,这就是为什么Unsubscribe不起作用。

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

Page2.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();
    }
 }
Run Code Online (Sandbox Code Playgroud)

当您发送消息时:

MessagingCenter.Send(Page2.GetPage2Instance(), "SaveToastPage2");
Run Code Online (Sandbox Code Playgroud)

编辑

请记住,将Page2类的构造函数声明为私有以确保Page2您的项目中只有一个实例。

private Page2()
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

修改您的Page1.cs代码:

async void Handle_Next(object sender, System.EventArgs e)
{
    await App.NavigationRef.PushAsync(Page2.GetPage2Instance(), true);
}
Run Code Online (Sandbox Code Playgroud)