.NET MAUI返回主页时出现空引用错误的技术咨询
.NET MAUI 返回主页空引用错误解决方案
核心问题分析
你的TabbedPageMenu是Shell子类,MAUI中Shell作为主页面时不能用NavigationPage包裹,同时你混合了模态导航(PushModalAsync)与传统导航栈操作,导致导航栈混乱,进而引发空引用错误。
具体修复步骤
1. 修正主页面设置逻辑
移除NavigationPage包裹,直接将Shell实例设为主页面:
- 登录按钮代码(LoginPage):
private async void BtnLogin_Clicked(object sender, EventArgs e) { App.Current.MainPage = new TabbedPageMenu(); }
- 返回主页按钮代码:
private async void BtnBack_Clicked(object sender, EventArgs e) { App.Current.MainPage = new TabbedPageMenu(); }
2. 规范模态页面返回操作
你通过PushModalAsync打开的页面,必须用PopModalAsync关闭。如果要直接回到主页,需清空所有模态栈:
private async void BtnBack_Clicked(object sender, EventArgs e) { // 逐层关闭所有模态页面,回到主页面 while (Navigation.ModalStack.Count > 0) { await Navigation.PopModalAsync(); } }
3. 改用Shell原生导航(推荐)
Shell提供了更规范的导航机制,避免栈混乱:
注册路由(App.xaml.cs)
public App() { InitializeComponent(); // 注册页面路由 Routing.RegisterRoute(nameof(ExeTreinoPage), typeof(ExeTreinoPage)); Routing.RegisterRoute(nameof(ParabensPage), typeof(ParabensPage)); // 直接设置Shell为主页面 MainPage = new TabbedPageMenu(); }
打开页面(TreinosPage)
private async void CvParcelamento_SelectionChanged(object sender, TappedEventArgs e) { var btn = (Frame)sender; var item = (Parcelamento)btn.BindingContext; if (item == null) return; Preferences.Set("Parcelamento", item.ParcelamentoId.ToString()); // 使用Shell导航打开页面 await Shell.Current.GoToAsync(nameof(ExeTreinoPage)); }
返回主页(ParabensPage)
private async void BtnBack_Clicked(object sender, EventArgs e) { // 直接回到Shell根页面 await Shell.Current.GoToAsync("//"); }
4. 修复潜在空引用点
在TreinosPage中,先判断item不为空再设置Preferences,避免空引用:
private async void CvParcelamento_SelectionChanged(object sender, TappedEventArgs e) { var btn = (Frame)sender; var item = (Parcelamento)btn.BindingContext; if (item == null) return; Preferences.Set("Parcelamento", item.ParcelamentoId.ToString()); // 导航逻辑... }
内容的提问来源于stack exchange,提问作者Wesley Henrique dos Santos
相关产品推荐
相关产品推荐

