You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms调用DisplayAlert抛出System.NullReferenceException问题求助

问题:调用DisplayAlert时触发NullReferenceException

遇到的错误:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

相关代码

App.xaml.cs

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        MainPage = new NavigationPage(new MainPage());
    }
}

MainPage.cs

public partial class MainPage : ContentPage
{
    private static readonly DisplayMessage DisplayMessage = new();

    public MainPage()
    {
        InitializeComponent();

        DisplayMessage.Display();
    }
}

DisplayMessage.cs

public class DisplayMessage
{
    public async void Display()
    {
        await Application.Current.MainPage.DisplayAlert("Hello World", "Welcome", "OK");
    }
}

已尝试的无效方案

曾尝试通过在App类中定义静态RootPage的方式解决,但无效果:

public static Page RootPage;

public App()
{
    InitializeComponent();
    
    MainPage = new MainPage();
    
    App.RootPage = this.MainPage;
}
    
App.RootPage.DisplayAlert(title, message, ok);

解决方向

1. 问题根源

在App构造函数中,先实例化MainPage,此时MainPage的构造函数会立即调用DisplayMessage.Display()。但此时App.MainPage还未完成框架层面的初始化,Application.Current.MainPage仍为null,导致调用DisplayAlert时触发空引用异常。

2. 可行解决方案

方案一:延迟到页面加载完成后调用

将Display的调用从MainPage构造函数移到Appearing事件中,确保页面及应用主页面已完成初始化:

public partial class MainPage : ContentPage
{
    private static readonly DisplayMessage DisplayMessage = new();

    public MainPage()
    {
        InitializeComponent();
        Appearing += MainPage_Appearing;
    }

    private void MainPage_Appearing(object sender, EventArgs e)
    {
        DisplayMessage.Display();
        Appearing -= MainPage_Appearing; // 移除事件避免重复触发
    }
}
方案二:直接传递当前Page实例给工具类

避免依赖Application.Current.MainPage,直接将当前MainPage实例传入DisplayMessage:
修改DisplayMessage.cs:

public class DisplayMessage
{
    private readonly Page _page;

    public DisplayMessage(Page page)
    {
        _page = page;
    }

    public async void Display()
    {
        await _page.DisplayAlert("Hello World", "Welcome", "OK");
    }
}

修改MainPage.cs:

public partial class MainPage : ContentPage
{
    private readonly DisplayMessage _displayMessage;

    public MainPage()
    {
        InitializeComponent();
        _displayMessage = new DisplayMessage(this);
        _displayMessage.Display();
    }
}
方案三:修正静态RootPage的使用时机

如果坚持使用静态RootPage方案,需确保调用DisplayAlert前RootPage已完成赋值,同样需要延迟调用:
修改App.xaml.cs:

public static Page RootPage;

public App()
{
    InitializeComponent();
    MainPage = new NavigationPage(new MainPage());
    RootPage = MainPage;
}

然后在MainPage的Appearing事件中调用Display,此时App.RootPage已被正确赋值。


内容的提问来源于stack exchange,提问作者JBD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:00:27