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
相关产品推荐
相关产品推荐

