Я создаю приложение, и ему нужно отправить аргумент на другую страницу и отправить аргумент с помощью 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");
}
Я хочу отправить только один раз, используя подписку и отправить только один раз.
Может ли кто-нибудь изучить это и предложить мне, что я должен делать в этом?
вы уверены, что не звоните отправить или подписаться несколько раз? Кроме того, аргументы, которые вы используете в Send<T1,T2>, должны совпадать с аргументами, которые вы используете при вызове Subscribe<T1,T2>.
Привет @Jason Да, я уверен, что я нажимаю только один раз, но подписываюсь более одного раза. Поэтому процесс выполнения занимает слишком много времени. Не могли бы вы предложить, что мы должны сделать в этом?
Вы хотите отправить и получить сообщение только один раз? Затем вы можете использовать метод Unsubscribe после получения сообщения. Например, вы можете сделать так:
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());
Ссылка на полное демо — здесь, можете посмотреть.
Я пытался с этим, но когда пользователь нажимает второй раз, он также не получает подписку на моей странице. Не могли бы вы дать другое лучшее решение?
@DeepSoni Вы хотите снова получить сообщение после этого? Механизм MessagingCenter заключается в том, чтобы отправить один раз и получить один раз, если вы не отмените подписку. Не могли бы вы поделиться дополнительным фрагментом кода о MessagingCenter в вашем приложении?
Я добавляю свой код в вопрос, не могли бы вы изучить это и предложить мне, что я должен изменить?
@DeepSoni Я обновил ответ, вы можете проверить его.
Спасибо за ответ. Я попробовал ваш код и отлично работает на android
, но когда я перемещаю платформу на iOS
, у меня это не работает. Не могли бы вы проверить и поделиться возможным способом, который хорошо работает на обеих платформах.
@DeepSoni С MessagingCenter все в порядке. На что нам нужно обратить внимание, так это на push- и pop-стили страницы. Я обновил ответ, вы можете проверить его.
Спасибо за ответ. Позвольте мне попробовать ваш обновленный код на обеих платформах.
Я пробовал то, что вы упомянули, но подписка вызывается дважды.
Вы говорите, что подписка повторяется несколько раз на второй странице?