C# 为什么在Xamarin.Forms中订阅事件时会出现NullReferenceException,但仅在iOS上?

C# 为什么在Xamarin.Forms中订阅事件时会出现NullReferenceException,但仅在iOS上?,c#,xamarin,xamarin.forms,nullreferenceexception,C#,Xamarin,Xamarin.forms,Nullreferenceexception,我有一个页面a,它有一个订阅另一个页面B上事件的方法。我想我可以在a页面的代码中实例化B页面,然后让a页面的方法订阅B页面的事件,最后将B页面推到导航堆栈中 不幸的是,当我在iOS上测试我的应用程序时,我在方法订阅事件的行上不断得到一个NullReferenceException。当我作为Android应用程序部署和测试时,代码运行得非常好,但我总是在iOS上得到NullReferenceException。引发此异常的原因是什么?如何修复它?为什么it平台特定于iOS A页上的代码 var c

我有一个页面a,它有一个订阅另一个页面B上事件的方法。我想我可以在a页面的代码中实例化B页面,然后让a页面的方法订阅B页面的事件,最后将B页面推到导航堆栈中

不幸的是,当我在iOS上测试我的应用程序时,我在方法订阅事件的行上不断得到一个NullReferenceException。当我作为Android应用程序部署和测试时,代码运行得非常好,但我总是在iOS上得到NullReferenceException。引发此异常的原因是什么?如何修复它?为什么it平台特定于iOS

A页上的代码

var confirmationPage = new EmailConfirmationPage(username);
confirmationPage.EmailConfirmed += this.OnEmailConfirmed;
await this.Navigation.PushModalAsync(confirmationPage);

...

private void OnEmailConfirmed(object source, EventArgs args)
{
    this.LabelMessage.Text = "Email Confirmed!";
}
B页的代码

using System;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace appFBLA2019
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class EmailConfirmationPage : ContentPage
    {
        private string username;
        private string email;

        public delegate void EmailConfirmedEventHandler(object source, EventArgs args);
        public event EmailConfirmedEventHandler EmailConfirmed;

        public EmailConfirmationPage(string username)
        {
            InitializeComponent();
            this.username = username;
            this.LabelTitle.Text = "Loading...";
            GetEmail();
        }

        private void GetEmail()
        {
            try
            {
                ServerConnector.QueryDB($"getEmail/{this.username}/-");
                this.email = ServerConnector.ReceiveFromDB();
                this.LabelTitle.Text = $"Enter the confirmation code sent to {this.email.Split('/')[1]}";
            }
            catch
            {
                this.LabelMessage.Text = "Connection Error: Please Try Again.";
            }
        }

        private async void ButtonConfirmEmail_Clicked(object sender, EventArgs e)
        {
            try
            {
                string userInputToken = this.EntryConfirmationCode.Text.Trim();
                ServerConnector.QueryDB($"confirmEmail/{this.username}/{userInputToken}/-");
                string returnData = ServerConnector.ReceiveFromDB();

                if (returnData == "true/-")
                {
                    OnEmailConfirmed();
                    await this.Navigation.PopModalAsync(true);
                }
                else
                {
                    this.LabelMessage.Text = "Email could not be confirmed. Please try your code again.";
                }
            }
            catch
            {
                this.LabelMessage.Text = "Connection Error: Please try again.";
            }
        }

        private void ButtonFixEmail_Clicked(object sender, EventArgs e)
        {
            string newEmail = this.EntryChangeEmail.Text;
            ServerConnector.QueryDB($"changeEmail/{this.username}/{newEmail}/-");
            string result = ServerConnector.ReceiveFromDB();

            if (result == "true/-")
            {
                this.LabelMessage.Text = $"Enter the confirmation code sent to {newEmail}";
            }
            else
            {
                this.LabelMessage.Text = $"Email could not be changed: {result.Split('/')[1]}";
            }
        }

        private async void ButtonClose_Clicked(object sender, EventArgs e)
        {
            await this.Navigation.PopModalAsync(true);
        }

        protected virtual void OnEmailConfirmed()
        {
            EmailConfirmed?.Invoke(this, EventArgs.Empty);
        }
    }
}
将方法订阅到事件之前调用堆栈:

在C:\Users\chung\source\repos\appFBLA2019\appFBLA2019\appFBLA2019\appFBLA2019\appFBLA2019\CreateAccountPage.xaml.cs:30,21 C处单击appFBLA2019.CreateAccountPage.ButtonCreateAccount中的0xC0#

将方法订阅到事件后调用堆栈:

0x1B8在appFBLA2019.CreateAccountPage.ButtonCreateAccount_点击C:\Users\chung\source\repos\appFBLA2019\appFBLA2019\appFBLA2019\CreateAccountPage.xaml.cs:39,13 C#


在进一步的测试中,我注意到这个问题在iOS和Android上都会出现,但只有在使用Xamarin Live Player运行应用程序时才会出现。我联系了微软,他们指出Xamarin Live Player不幸存在局限性。直接部署到设备不会导致任何问题,代码运行正常。

请显示整个B页,确认B页是否为
EmailConfirmationPage
正确吗?我已更新帖子以包含整个B页,是的,EmailConfirmationPage是B页。谢谢@MichaelPuckettii不使用异步void!确认页面构造是否正确?看起来在构建过程中出现了一个异常将调用navigation.PopModalAsync,但我不知道xamarin,所以我不知道会发生什么。请详细说明为什么在这种情况下我不应该使用async void?对于我当前的代码,它需要使用它。谢谢@波尔巴克