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

为什么Xamarin.Forms项目AppShell.cs中GoToAsync跳转LoginPage不生效

跳转失效原因

  1. 路由重复注册冲突:你已经在XAML的TabBar节点中为LoginPage声明了Route="LoginPage"的全局路由,又在AppShell构造函数中手动调用Routing.RegisterRoute("LoginPage", typeof(LoginPage))重复注册同名路由,导致Shell路由寻址异常。
  2. 跳转路径不符合规则:LoginPage是定义在根层级的TabBar路由,使用相对路径GoToAsync("LoginPage")只会在当前页面的子路由中查找,XAML注释中也明确标注了全局根路由跳转需要使用//前缀。
  3. 跳转触发时机错误:AppShell构造函数执行时,Shell实例还未完成初始化、当前活动页面也未加载完成,此时调用导航方法会因为上下文不完整导致跳转逻辑失效。
  4. 异步方法声明不规范:原OnItemSelected方法使用async void声明,构造函数中调用异步void方法无法追踪执行状态,跳转逻辑可能在执行过程中被中断。

修复方案

  • 移除构造函数中重复注册LoginPage路由的代码Routing.RegisterRoute("LoginPage", typeof(LoginPage)),仅保留未在XAML中声明路由的页面注册逻辑。
  • 将跳转路径修改为全局根路径,把await Shell.Current.GoToAsync("LoginPage");调整为await Shell.Current.GoToAsync("//LoginPage");。
  • 把初始化跳转逻辑从构造函数移到AppShell的OnAppearing生命周期方法中执行,此时Shell实例已经完成加载。
  • 将OnItemSelected方法的返回值从async void改为async Task,确保异步跳转逻辑可以正常等待执行。

修复后代码示例

AppShell.cs

public partial class AppShell : Xamarin.Forms.Shell
{
    private string _initMessage;
    public AppShell(string message)
    {
        InitializeComponent();
        _initMessage = message;
        // 仅注册未在XAML中声明路由的页面
        Routing.RegisterRoute(nameof(ItemDetailPage), typeof(ItemDetailPage));
        Routing.RegisterRoute(nameof(NewItemPage), typeof(NewItemPage));
    }

    protected override async void OnAppearing()
    {
        base.OnAppearing();
        if (_initMessage != "main") 
        {
            int itemid = Int32.Parse(_initMessage);
            // 替换原来的.Result阻塞调用,改为异步等待
            var item = await App.Database.GetItemAsyncId(itemid);
            var itemValue = new Models.Item
            {
                Id = item.Id,
                Description = item.Description,
                Text = item.Text
            };
            await OnItemSelected(itemValue);
        }
    }

    public async Task OnItemSelected(Item item)
    {  
        await Shell.Current.GoToAsync("//LoginPage");
        // 原业务逻辑保留
        // await Shell.Current.GoToAsync($"{nameof(ItemDetailPage)}?{nameof(ItemDetailViewModel.ItemId)}={item.Id}");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:48:02