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

.NET MAUI Android应用Azure B2C登录登出后再次登录显示空白页

.NET MAUI Shell登录跳转后空白问题修复

问题场景

用.NET MAUI Shell开发登录流程,首次登录能正常跳转到DashboardPage,但登出后再次登录,页面显示空白,无法正常加载目标页面。登录逻辑代码如下:

public partial class LoginPageViewModel : BaseViewModel
{
    private readonly IAuthNService _authNService;

    public LoginPageViewModel(IAuthNService authNService)
    {
        _authNService = authNService;
    }

    [ICommand]
    async void Login()
    {
        try
        {
            var result = await _authNService.LoginAsync(CancellationToken.None);
            var token = result?.IdToken;  
            if (token != null)
            {
                var handler = new JwtSecurityTokenHandler();
                var data = handler.ReadJwtToken(token);
                var claims = data.Claims.ToList();
                if (data != null)
                {
                    await Shell.Current.GoToAsync($"//{nameof(DashboardPage)}", true);
                }
            }
        }
        catch (MsalClientException ex)
        {
            await Toast.Make(ex.Message).Show();
        }
        catch (Exception ex)
        {
            await Toast.Make(ex.Message).Show();
        }
    }
}

排查方向及修复方案

1. 导航栈未彻底清理

登出时若未清空导航栈,再次登录跳转时会残留旧页面状态,导致新页面无法正常渲染。

修复:
在登出逻辑中添加导航栈清理代码:

// 跳回登录页
await Shell.Current.GoToAsync($"//{nameof(LoginPage)}", true);
// 移除导航栈中所有非登录页的页面
var stackPages = Shell.Current.Navigation.NavigationStack.ToList();
foreach (var page in stackPages.Where(p => p.GetType() != typeof(LoginPage)))
{
    Shell.Current.Navigation.RemovePage(page);
}

2. DashboardPage状态残留或初始化失败

首次登录时ViewModel正常初始化,但登出后页面实例可能被复用,导致状态残留或依赖注入异常,引发空白。

修复:

  • 强制跳转时创建新页面实例:
// 替换原跳转代码
var dashboard = App.Current.Services.GetRequiredService<DashboardPage>();
await Shell.Current.Navigation.PushModalAsync(dashboard, true);
  • 在DashboardPage的OnAppearing中重置状态:
protected override void OnAppearing()
{
    base.OnAppearing();
    (BindingContext as DashboardPageViewModel)?.ResetState();
}

3. 异步命令线程问题

登录命令使用async void,可能导致导航操作在非UI线程执行,引发页面渲染异常。

修复:
将命令改为async Task:

[ICommand]
async Task Login()
{
    // 原逻辑保持不变
}

4. Shell路由配置冲突

检查DashboardPage的路由是否正确注册,避免重复或错误路由导致跳转异常。

修复:
在AppShell.xaml中确认路由配置:

<ShellContent Route="DashboardPage" ContentTemplate="{DataTemplate local:DashboardPage}" />

或代码注册:

// AppShell构造函数中添加
Routing.RegisterRoute(nameof(DashboardPage), typeof(DashboardPage));

内容的提问来源于stack exchange,提问作者Antonio Avndaño Duran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:45:11