4

我正在创建一个应用程序,当我使用 MessagingCenter 发送时,它需要将参数发送到另一个页面并使用 MessagingCenter 发送参数,它调用了多次。

如果我在下次使用 unscribe 时,下次就不会收到了。

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");
    }

我只想使用订阅发送一次,并且只发送一次。

任何人都可以对此进行调查并建议我该怎么做吗?

4

1 回答 1

3

你想只发送和接收一次消息吗?然后您可以在收到消息后使用取消订阅方法。例如,您可以这样做:

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

更新

在 上DetailPage,可以调用MessagingCenter.Subscribein methodOnAppearing()和 call MessagingCenter.Unsubscribein method 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中的效果是: 在此处输入图像描述

完整演示的链接在这里,您可以查看。

于 2019-06-14T02:27:41.990 回答