当我在应用程序中多次往返导航时,多次调用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
这样做的正确方法是什么?
答案 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");