.NET 8 MAUI中Shell.Current.GoToAsync异常:特定场景无响应
.NET 8 MAUI LoadingPage跳转LoginPage无响应问题解决
在.NET 8 MAUI项目的LoadingPage中,重写OnNavigatedTo方法时,原本带认证检查的跳转逻辑能正常切换页面,但改成直接调用await Shell.Current.GoToAsync($"///{nameof(LoginPage)}")后,LoadingPage一直停留在界面上,LoginPage的构造函数完全没被执行。
问题原因
- 异步方法阻塞UI线程:
OnNavigatedTo本质是同步事件回调,直接在里面执行异步导航操作,可能导致UI上下文阻塞,Shell的导航流程无法正常推进。 - 路由或路径配置错误:LoginPage未正确注册到Shell路由,或者
///根路径的使用不匹配当前Shell的页面结构。
解决办法
调整异步导航的执行方式
不要在OnNavigatedTo里直接写异步代码,把导航逻辑抽成独立的异步方法,通过非阻塞的方式调用:protected override void OnNavigatedTo(NavigatedToEventArgs args) { base.OnNavigatedTo(args); // 用_ = 避免阻塞当前方法 _ = NavigateToTargetPage(); } private async Task NavigateToTargetPage() { await Shell.Current.GoToAsync($"///{nameof(LoginPage)}"); }检查Shell路由注册
确保LoginPage已经在Shell中完成路由注册,比如在AppShell.xaml.cs里添加:public AppShell() { InitializeComponent(); Routing.RegisterRoute(nameof(LoginPage), typeof(LoginPage)); }或者直接在
AppShell.xaml中声明页面路由:<ShellContent Route="LoginPage" ContentTemplate="{DataTemplate local:LoginPage}" />验证导航路径正确性
如果LoginPage不是Shell的根级别页面,去掉///前缀,直接使用await Shell.Current.GoToAsync(nameof(LoginPage));如果是根页面,确认Shell的结构中该页面的层级是否匹配根路径要求。排查导航循环
检查LoginPage的代码,确保没有触发跳回LoadingPage的逻辑,避免出现页面跳转死循环导致LoadingPage一直显示。
内容的提问来源于stack exchange,提问作者jstuardo
相关产品推荐
相关产品推荐

