Как остановить центр обмена сообщениями, чтобы перестать подписываться несколько раз в Xamarin.Forms?

Я создаю приложение, и оно должно посылать аргумент на другую страницу и посылать аргумент с помощью Messagingcenter, когда я отправляю с использованием MessagingCenter, он вызывает более одного раза.

Если я использую отписаться, чем в следующий раз, он не получит в следующий раз.

MessagingCenter.Send(this, "Invoke", "Invokedtrue");

MessagingCenter.Subscribe<MyPage, string>(this, "Invoke", async (sender, arg) =>
{
    await Process(arg);
});
MessagingCenter.Unsubscribe<MyPage>(this,"Invoke");


**ListPage**

    private void ViewCell_Tapped(object sender, EventArgs e)
    {
        try
        {
            MessagingCenter.Send(this, "Invoke", "Invokedtrue");
        }
        catch (Exception ex)
        {
            Debug.Write(ex);
        }
    }

**Detail Page**

    MessagingCenter.Subscribe<ListPage, string>(this, "Invoke", async (sender, arg) =>
    {
        await Process(arg);
    });

    private async Task Process(string arg)
    {
        //Here is api call to view detail of particular record

        //Here I unsubscribe the MessagingCenter.
        MessagingCenter.Unsubscribe<ListPage>(this,"Invoke");
    }

Я хочу отправить только один раз, используя подписку и отправить только один раз.

Может кто-нибудь разобраться в этом и предложить мне, что я должен сделать в этом?

1 ответ

Решение

Хотите отправить и получить сообщение только один раз? Затем вы можете использовать метод отмены подписки после получения сообщения. Например, вы можете сделать так:

 MessagingCenter.Subscribe<MyPage, string>(this, "Invoke", async (sender, 
   arg) =>
{
await Process(arg); 
MessagingCenter.Unsubscribe<MyPage>(this,"Invoke");
});

Обновлено:

На DetailPage, вы можете позвонить MessagingCenter.Subscribe в методе OnAppearing() и позвонить MessagingCenter.Unsubscribe в методе OnDisappearing просто так:

protected override void OnAppearing()
    {
        base.OnAppearing();
       MessagingCenter.Subscribe<ListPage, string>(this, "Invoke", async (sender, arg) =>
        {
            Debug.Write("123456---->  get one msg");
            DisplayAlert("Alert", "We have received a message.", "OK");
        });
    }

    protected async override void OnDisappearing()
    {
        base.OnDisappearing();
        MessagingCenter.Unsubscribe<ListPage,string>(this, "Invoke");
    }
}

На ListPage

async void OnTap (object sender, EventArgs e)  
    {
        await Navigation.PushAsync(new DetailPage());
        try
        {

            MessagingCenter.Send(this, "Invoke", "Invokedtrue");

            Debug.Write("123456---->  send one msg");

        }
        catch (Exception ex)
        {
            Debug.Write(ex);
        }

    }

Примечание: когда вы входите в ListPage, вы можете попробовать следующий код:

  MainPage = new  NavigationPage( new ListPage());

Эффект в IOS:

Ссылка на полный демо здесь, вы можете проверить это.

Другие вопросы по тегам