首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MessagingCenter取消订阅不像预期的那样工作

MessagingCenter取消订阅不像预期的那样工作
EN

Stack Overflow用户
提问于 2017-06-23 11:48:27
回答 4查看 6.6K关注 0票数 10

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

代码语言:javascript
复制
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

吊箱连接

做这件事的正确方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-06-26 04:13:10

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

MessagingCenter.Subscribe()被多次调用,因为在代码中有两个Page2实例,它们都使用MessagingCenter.Subscribe()方法,这就是Unsubscribe无法工作的原因。

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

第2.cs页:

代码语言:javascript
复制
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();
    }
 }

当你发送信息时:

代码语言:javascript
复制
MessagingCenter.Send(Page2.GetPage2Instance(), "SaveToastPage2");

编辑

请记住,将Page2类的构造函数声明为私有,以确保项目中只有一个Page2实例。

代码语言:javascript
复制
private Page2()
{
   ...
}

修改Page1.cs代码:

代码语言:javascript
复制
async void Handle_Next(object sender, System.EventArgs e)
{
    await App.NavigationRef.PushAsync(Page2.GetPage2Instance(), true);
}
票数 11
EN

Stack Overflow用户

发布于 2020-03-16 17:54:30

我也面临着同样的问题。我通过传递相同的参数来解决问题,同时订阅和取消订阅。

代码语言:javascript
复制
MessagingCenter.Subscribe<Page1, T>(this, "Listen", async (Page1 arg1, T 
listenedString) =>
{

});

取消订阅,如下所示

代码语言:javascript
复制
 MessagingCenter.Unsubscribe<Page1, T>(this, "Listen");
票数 4
EN

Stack Overflow用户

发布于 2021-09-01 03:34:30

我用的是这个临时解决方案。我声明了一个静态字典来存储我的对象(对于这个例子,我使用了一个对象类型)。

代码语言:javascript
复制
private static Dictionary<string, object> subscribedReferencePages = new Dictionary<string, object>();

我总是存储最后订阅的页面引用。然后,在触发message方法只触发最后一个消息之前,比较页面引用。

代码语言:javascript
复制
    subscribedReferencePages[pageName] = this;
    MessagingCenter.Subscribe<ViewModelBase>(this, pageName, async (sender) =>
    {
        if (!ReferenceEquals(sender, this))
        {
            return;
        }

        this.OnInitialized();
    });

要调用消息方法,我需要将字典作为参数传递(而不是"this“引用)。

代码语言:javascript
复制
 MessagingCenter.Send(subscribedPages[pageName], keyPageName);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44720764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档