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

应用启动时MainPage无法正常加载,切换后台后恢复的问题求助

应用启动时MainPage无法正常加载,仅后台切换后才显示

我编写了LoadMainPage方法,用于根据用户登录、注册状态跳转对应页面,并在App.Xaml.cs的OnStart方法中调用该方法。但应用启动时主页面无法正常显示,只有点击手机多任务图标切换到后台再重新进入才会出现。


LoadMainPage方法代码

public async Task LoadMainPage()
{
    try
    {
        signedin = Auth.IsUserSignedIn();
        if (signedin)
            registered = await Firestore.IsUserRegistered();
            
        if (!signedin)
        {
            MainPage = new NavigationPage(new MainPage());
        }
        else if (signedin && !(registered))
        {
            MainPage = new NavigationPage(new RegistrationPage());
        }
        else if (signedin && (registered))
        {
            MainPage = new NavigationPage(new FlyoutPage1());
        }

    }
    catch (Exception ex) { await App.Current.MainPage.DisplayAlert("Error", ex.Message, "OK"); }
}

OnStart调用代码

protected override async void OnStart()
{
    base.OnStart();
    await LoadMainPage();
}

Firestore.IsUserRegistered方法代码

public async Task<bool> IsUserRegistered()
{
    FirebaseFirestore collection = FirebaseFirestore.Instance;
    string email = FirebaseAuth.Instance.CurrentUser.Email;
    Android.Gms.Tasks.Task task = collection.Collection("User").WhereEqualTo("Email", email)
            .Limit(1).Get().AddOnSuccessListener(this);
    for (int i = 0; i < 25; i++)
    {
        await Task.Delay(100);
        if (isregistered ) break;
    }

    return isregistered;
}
public void OnSuccess(Java.Lang.Object result)
{
    var documents = (QuerySnapshot)result;
    isregistered = !documents.IsEmpty;
}

问题原因及修复方案

核心问题

  1. 异步生命周期方法调用导致UI更新滞后:OnStart为异步void方法,异步操作的执行时机可能晚于UI初始化完成的时间,导致主页面设置未被及时渲染。
  2. Firestore查询实现低效且存在线程同步问题:通过循环轮询等待isregistered变量,不仅浪费资源,还可能因线程可见性问题导致变量更新不及时,影响页面跳转逻辑。

修复步骤

1. 优化Firestore查询的异步实现

放弃轮询等待,直接将Android原生Task转换为.NET可await的Task,确保查询完成后再返回结果:

public async Task<bool> IsUserRegistered()
{
    FirebaseFirestore db = FirebaseFirestore.Instance;
    string email = FirebaseAuth.Instance.CurrentUser.Email;
    
    // 将Android Task转换为.NET可await的Task
    var querySnapshot = await Tasks.WhenAll(
        db.Collection("User").WhereEqualTo("Email", email).Limit(1).Get()
    );
    
    return !querySnapshot[0].IsEmpty;
}

2. 确保主页面设置在UI线程执行

显式切换到UI线程更新主页面,避免异步操作导致的UI渲染延迟:

public async Task LoadMainPage()
{
    try
    {
        signedin = Auth.IsUserSignedIn();
        bool registered = false;
        if (signedin)
            registered = await Firestore.IsUserRegistered();
            
        // 强制在UI线程更新主页面
        Device.BeginInvokeOnMainThread(() =>
        {
            if (!signedin)
            {
                MainPage = new NavigationPage(new MainPage());
            }
            else if (!registered)
            {
                MainPage = new NavigationPage(new RegistrationPage());
            }
            else
            {
                MainPage = new NavigationPage(new FlyoutPage1());
            }
        });
    }
    catch (Exception ex) 
    { 
        Device.BeginInvokeOnMainThread(() =>
        {
            MainPage?.DisplayAlert("Error", ex.Message, "OK");
        });
    }
}

3. 添加启动临时页面(可选)

在App构造函数中先设置一个加载页,避免启动时出现空白:

public App()
{
    InitializeComponent();
    // 先设置临时加载页,提升用户体验
    MainPage = new NavigationPage(new LoadingPage());
}

内容的提问来源于stack exchange,提问作者Asgar Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:30:49