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

问题描述 投票:3回答:2

当我在应用程序中多次往返导航时,会多次调用MessagingCenter.Subscribe()内部编写的功能。但是每次订阅之前,我都会在构造函数中取消订阅,如下所示,仍然无法正常工作。

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

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

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

我甚至尝试在OnAppearing中放置相同的代码。我无法取消订阅OnDisappear,因为当我到达Page6进行保存时,我需要事件接线。

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

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

xamarin xamarin.android xamarin.forms
2个回答
4
投票

但是每次订阅之前,我都会在构造函数中取消订阅,如下所示,仍然无法正常工作。

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();
    }
 }

当您发送消息时:

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

编辑:

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

private Page2()
{
   ...
}

修改你的Page1.cs代码:

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

0
投票

当您导航到页面时,不要取消订阅,而是在从页面导航AWAY时取消订阅。那时你的'this'实例仍然和你认为的那个'相同'。

© www.soinside.com 2019 - 2024. All rights reserved.