在Xamarin.Forms的App.xaml.cs构造函数中使用await遇问题求助
问题原因与解决方案
你的代码问题出在异步操作没有被等待:你用匿名异步委托执行DocExists方法,但没有等待它完成,构造函数就直接执行了后面的if-else判断。此时firebaseDocExists还是初始的false值,所以总是跳转到MyPage。
构造函数不能直接标记为async,但可以通过以下方式修正:
- 先设置一个临时的加载页面,避免用户看到空白屏;
- 编写一个异步初始化方法,完成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
相关产品推荐
相关产品推荐

