当我在应用程序中多次来回导航时,MessagingCenter.Subscribe() 内编写的功能会被多次调用。但每次在订阅之前,我都会在构造函数中取消订阅,如下所示,但它仍然不起作用。
MessagingCenter.Unsubscribe<SubmitPage>(this,"Save");
MessagingCenter.Subscribe<SubmitPage>(this, "Save", (sender) =>
{
DisplayToastOnSuccessfulSubmission();
});
在我的应用程序中,我有 6 页(git https://github.com/suchithm/MessageCenterSampleApp),我使用 MessagingCenter.Send 将数据保存在第六页中,并且将在第二页中订阅相同的数据,并且保存的消息将显示在第二页中(导航到该页面后)。
现在我像 2->1->2->3->4->5->6 一样导航,在这种特殊情况下 DisplayToastOnSuccessfulSubmission() 将被调用两次(因为 Page2 构造函数被调用两次)。
我什至尝试将相同的代码放在 OnAppearing 中。
我无法在 OnDisappear 中取消订阅,因为我需要在到达第 6 页进行保存时连接事件。
在示例项目中重现了相同的行为并添加到此处https://github.com/suchithm/MessageCenterSampleApp https://github.com/suchithm/MessageCenterSampleApp
Dropbox 链接 https://www.dropbox.com/s/72joc4ttb7yr2ge/MsgCenterSample.zip?dl=0
执行此操作的正确方法是什么?
但每次订阅之前,我都会在构造函数中取消订阅,如下所示,但它仍然不起作用。
MessagingCenter.Subscribe()
被多次调用,因为第 2 页有两个实例在你的代码中,他们都使用MessagingCenter.Subscribe()
方法,这就是为什么Unsubscribe
没用。
您可以修改page2()
to a 单例以确保只有一个实例Page2
在你的项目中,之后当你发送消息时,
这MessagingCenter.Subscribe()
仅被调用一次。
第2页.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");
EDIT :
请记住,声明构造函数Page2
类是私有的,以确保只有一个实例Page2
当然在你的项目中。
private Page2()
{
...
}
修改你的Page1.cs
code :
async void Handle_Next(object sender, System.EventArgs e)
{
await App.NavigationRef.PushAsync(Page2.GetPage2Instance(), true);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)