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

时间:2017-06-23 11:48:28

标签: xamarin xamarin.android xamarin.forms

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

  

但是每次订阅之前,我都会在构造函数中取消订阅,如下所示,仍然没有用。

from bs4 import BeautifulSoup soup = BeautifulSoup('<span class="mn-person-info__name Sans-17px-black-85%-semibold-dense">Marina Silon</span>', 'lxml') spans = soup.find_all('span', {'class' : 'mn-person-info__name Sans-17px-black-85%-semibold-dense'}) print spans # print result [<span class="mn-person-info__name Sans-17px-black-85%-semibold-dense">Marina Silon</span>] 被多次调用,因为代码中有两个Page2 实例,它们都使用MessagingCenter.Subscribe()方法,这就是为什么{ {1}}没有用。

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

Page2.cs:

Page2

发送消息时:

MessagingCenter.Subscribe()

编辑

请记住,将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()
{
   ...
}

答案 1 :(得分:0)

导航到页面时不再取消订阅, 从页面导航时退订。那时,您的“ this”实例仍然与您认为的“ this”相同。

答案 2 :(得分:0)

我遇到了同样的问题。我也通过在订阅和退订中传递相同的参数来解决问题。

MessagingCenter.Subscribe<Page1, T>(this, "Listen", async (Page1 arg1, T 
listenedString) =>
{

});

像下面一样退订

 MessagingCenter.Unsubscribe<Page1, T>(this, "Listen");