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

在Xamarin.Forms的App.xaml.cs构造函数中使用await遇问题求助

问题原因与解决方案

你的代码问题出在异步操作没有被等待:你用匿名异步委托执行DocExists方法,但没有等待它完成,构造函数就直接执行了后面的if-else判断。此时firebaseDocExists还是初始的false值,所以总是跳转到MyPage。

构造函数不能直接标记为async,但可以通过以下方式修正:

  1. 先设置一个临时的加载页面,避免用户看到空白屏;
  2. 编写一个异步初始化方法,完成Firestore查询后再切换到目标页面。

修改后的代码示例:

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
        // 先显示加载页面
        MainPage = new ContentPage 
        { 
            Content = new Label { Text = "加载中...", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center } 
        };
        // 启动异步初始化流程
        _ = InitializeAppAsync();
    }

    private async Task InitializeAppAsync()
    {
        try
        {
            var firebaseDoc = await CrossCloudFirestore.Current
                                                       .Instance
                                                       .Collection("myCollection")
                                                       .Document("docId")
                                                       .GetAsync();

            bool firebaseDocExists = firebaseDoc.Exists;

            // 根据查询结果切换页面
            MainPage = firebaseDocExists ? new NavigationPage(new MainPage()) : new MyPage();
        }
        catch (Exception ex)
        {
            // 处理异常,比如网络错误、权限问题等
            MainPage = new ContentPage { Content = new Label { Text = $"加载失败:{ex.Message}" } };
        }
    }
}

关键说明

  • 用临时加载页提升用户体验,避免长时间空白;
  • 异步初始化方法中完成Firestore查询,确保拿到结果后再设置MainPage;
  • 添加异常捕获,处理网络异常等情况,避免程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:55:29