#android #xamarin.forms
#Android #xamarin.формы
Вопрос:
У меня есть Xamarin.Формирует приложение, которое использует push-уведомления. По какой-то причине следующая строка:
(App.Current.MainPage as MainPage)?.AddMessage(body);
то , что вызывается из Android native OnMessageReceived()
, выбрасывает NullReferenceException
.
Почему это может произойти? Не App.Current
должен быть доступен из проекта, зависящего от конкретной платформы?
Редактировать:
Вот полный OnMessageReceived()
код:
public override void OnMessageReceived(RemoteMessage message)
{
base.OnMessageReceived(message);
string messageBody;
if (message.GetNotification() != null)
{
messageBody = message.GetNotification().Body;
}
// NOTE: test messages sent via the Azure portal will be received here
else
{
messageBody = message.Data.Values.First();
}
// convert the incoming message to a local notification
SendLocalNotification(messageBody);
// send the incoming message directly to the MainPage
SendMessageToMainPage(messageBody);
}
Комментарии:
1. Я думаю , имеет значение , вызывается ли он до или после
LoadApplication()
.2. @Cfun Поскольку приложение работало в фоновом режиме, я полагаю, что LoadApplication() уже был вызван?
3. Я так думаю, не могли бы вы точно подтвердить, отладив в этот момент, какой объект равен нулю?
App.Current
илиApp.Current.MainPage
?4. @Cfun Проблема в том, что я не могу ее отладить, поскольку (согласно документации) эмулятор не может быть настроен на получение уведомлений. Я считаю, что только App.Current может быть нулевым, как я использую ?. после App.Current. Главная страница.
5. о, хорошо знать об эмуляторе, вы пробовали
(App.Current?.MainPage as MainPage)?.AddMessage(body);
?
Ответ №1:
App.Current.MainPage
может содержать любую страницу, не обязательно вашего типа MainPage
, например, это может быть NavigationPage
. В результате литья становится null
ясно, что он относится к какому-то другому типу.
Также может случиться так, что ему ничего не будет присвоено.
Комментарии:
1. Но я точно знаю, что это главная страница. Страница страница = FreshPageModelResolver.ResolvePageModel<MainPageModel>(); FreshNavigationContainer simpleNav = новый FreshNavigationContainer(страница); MainPage = simpleNav;
2. Я действительно не знаю, как работает Fresh (и не хочу знать), но я могу сказать вам на 100%, что это не так. Почему бы вам не отладить и не проверить это. Вы увидите, что это не так просто, как не может быть, если вы увидите ошибку.
3. интересный факт о
as
том, что полезно знать.4. @DavidShochet если App.Current имеет значение null, добавьте какой-нибудь таймер, возможно, даже задачу. Задержка сработает. Вероятно, иногда для инициализации требуется некоторое время.
5. @DavidShochet Как правило, есть два возможных случая — либо мы чего-то не знаем, либо у нас есть какие-то неправильные предположения. Есть и третья — черная магия, но до сих пор этого никогда не случалось.