当我在应用程序中多次往返导航时,会多次调用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
这样做的正确方法是什么?
但是每次订阅之前,我都会在构造函数中取消订阅,如下所示,仍然无法正常工作。
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);
}
当您导航到页面时,不要取消订阅,而是在从页面导航AWAY时取消订阅。那时你的'this'实例仍然和你认为的那个'相同'。