Исключение NullReferenceException для App.Current.Главная страница

#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 Как правило, есть два возможных случая — либо мы чего-то не знаем, либо у нас есть какие-то неправильные предположения. Есть и третья — черная магия, но до сих пор этого никогда не случалось.