c# - 如何为结果进行等待异步任务以进一步操作 xamarin 表单?
问题描述
在我的 Xamarin.Forms 应用程序中,我使用 azure 移动服务进行离线数据同步。
在我的应用程序的 OnStart 方法中,我正在调用异步任务,并且根据任务的结果,我需要加载不同的页面。不幸的是,现在没有页面正在加载。当我删除对异步任务的调用时,页面正在加载。
OnStart 方法
protected async override void OnStart()
{
login = new List<Login>();
List<Login> items = await App.dataManager.GetLoginAsync();
if (items.Count <= 0)
{
MainPage = (new Registration());
}
else
{
MainPage = (new LoginPage());
}
}
异步任务方法
public async Task<List<Login>> GetLoginAsync()
{
try
{
IEnumerable<Login> items = await logins
.ToEnumerableAsync();
return new List<Login>(items);
}
catch (MobileServiceInvalidOperationException msioe)
{
Debug.WriteLine(@"Invalid sync operation: {0}", msioe.Message);
}
catch (Exception e)
{
Debug.WriteLine(@"Sync error: {0}", e.Message);
}
return null;
}
解决方案
由于MainPage 属性应该在 App 构造函数中设置,并且我们不应该通过在构造函数中等待异步方法来阻塞 UI 线程,您可以这样实现导航逻辑:
在 App 的构造函数中设置 MainPage 如下:
MainPage = new StarterPage();
在 StarterPage 的 OnAppearing 方法中:
protected override async void OnAppearing()
{
base.OnAppearing();
login = new List<Login>();
//show ActivityIndicator
List<Login> items = await App.dataManager.GetLoginAsync();
//hide ActivityIndicator
if (items.Count <= 0)
{
await Navigation.PushAsync(Registration);
}
else
{
await Navigation.PushAsync(LoginPage);
}
}
推荐阅读
- clojure - 最短的 Clojure 静态类型
- reactjs - 如何在一个类中导入 Firebase Auth、Firestore 和 Firebase Storage 节点包以及它们的 TypeScript 类型?
- javascript - React 检测遇到错误:RangeError: Maximum call stack size exceeded - while trying to fetch a large amount of data
- javascript - 如何在 nuxt 中使用 google recaptcha?
- javascript - 如何使用 webpack 导入 HTML 文件?
- amazon-web-services - 条件 DynamoDB 将项目放入 lambda (python)
- php - PHP不发送reposnse
- ruby-on-rails - Ruby 版本不正确
- asp.net-mvc - 信封的多个 webhook 端点
- python - Django中没有“没有这样的表”异常时要检查的事情