Как остановить центр обмена сообщениями, чтобы перестать подписываться несколько раз в Xamarin.Forms? - PullRequest
1 голос
/ 13 июня 2019

Я создаю приложение, и оно должно отправить аргумент на другую страницу и отправить аргумент с помощью 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 Ответ

1 голос
/ 14 июня 2019

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

 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: enter image description here

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

...