Suc*_*ith 9 xamarin.android xamarin xamarin.forms
当我在应用程序中多次来回导航时,多次调用 MessagingCenter.Subscribe() 中编写的功能。但是每次订阅之前,我都会在构造函数中取消订阅相同的内容,如下所示,仍然没有用。
MessagingCenter.Unsubscribe<SubmitPage>(this,"Save");
MessagingCenter.Subscribe<SubmitPage>(this, "Save", (sender) =>
{
DisplayToastOnSuccessfulSubmission();
});
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我有 6 页(git),我使用 MessagingCenter.Send 将数据保存在第 6 页,同样将在第 2 页订阅,保存的消息将显示在第 2 页(导航到该页面后)。
现在我像 2->1->2->3->4->5->6 那样导航,在这种特殊情况下 DisplayToastOnSuccessfulSubmission() 将被调用两次(因为 Page2 构造函数被调用两次)。
我什至尝试在 OnAppearing 中放置相同的代码。我无法在 OnDisappear 中取消订阅,因为我需要将事件连接到第 6 页进行保存。
在示例项目中重现相同的行为并在此处添加https://github.com/suchithm/MessageCenterSampleApp
Drop box 链接
这样做的正确方法是什么?
Yor*_*hen 10
但是每次订阅之前,我都会在构造函数中取消订阅相同的内容,如下所示,仍然没有奏效。
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();
}
}
Run Code Online (Sandbox Code Playgroud)
当您发送消息时:
MessagingCenter.Send(Page2.GetPage2Instance(), "SaveToastPage2");
Run Code Online (Sandbox Code Playgroud)
编辑:
请记住,将Page2类的构造函数声明为私有以确保Page2您的项目中只有一个实例。
private Page2()
{
...
}
Run Code Online (Sandbox Code Playgroud)
修改您的Page1.cs代码:
async void Handle_Next(object sender, System.EventArgs e)
{
await App.NavigationRef.PushAsync(Page2.GetPage2Instance(), true);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5122 次 |
| 最近记录: |