Как мне перейти на новую страницу после завершения моего вызова aync в форме c # Xamarin?

#c# #xamarin.forms

#c# #xamarin.forms

Вопрос:

В моем запуске (app.xaml.cs) в методе OnStart() я использую Acr.UserDialogs для отображения счетчика загрузки, пока я извлекаю данные из базы данных. В настоящее время у меня возникла проблема, когда по завершении задачи я ожидаю, что она перейдет на новую страницу, но этого не происходит, и я не знаю, что я делаю не так.

У меня есть следующий код:

  protected override void OnStart()
    {
        //showing the loading spinner here (Works)
        Device.BeginInvokeOnMainThread(() => UserDialogs.Instance.ShowLoading("Loading ...", 
        MaskType.Black));

        Task.Run(async () =>
        {
            ProductsViewModel = await _storeService.GetProducts();
        })
            .ContinueWith(result => Device.BeginInvokeOnMainThread(
                () =>
                    {

                    UserDialogs.Instance.HideLoading();
                    //once the data is recieved here, I expect this to transition to the ProductList 
                   //Page but it doesn't and I'm not sure why
                    MainPage = new NavigationPage(new ProductList(ProductsViewModel));
                    
                })
            );
    }
 

Может быть, это потому, что я что-то блокирую?

Комментарии:

1. Попробуйте поместить await Task.Delay(100); после строки showLoading.

2. к сожалению, это не сработало

3. Разве вы не можете просто сделать OnStart асинхронным, а затем избавиться от своего Task.Run ?

Ответ №1:

Во-первых, нам нужно будет инициализировать главную страницу в конструкторе класса приложения. Мы можем создать объект ContentPage и назначить его главной странице. Мы создаем объект базового класса (ContentPage), чтобы он выглядел без изменений в пользовательском интерфейсе.

 public App()
        {
            InitializeComponent();

            MainPage = new ContentPage();
        }

protected override void OnStart()
    {
        //showing the loading spinner here (Works)
        Device.BeginInvokeOnMainThread(() => UserDialogs.Instance.ShowLoading("Loading ...", 
        MaskType.Black));

        Task.Run(async () =>
        {
            ProductsViewModel = await _storeService.GetProducts();
        })
            .ContinueWith(result => Device.BeginInvokeOnMainThread(
                () =>
                    {

                    UserDialogs.Instance.HideLoading();
                    //once the data is recieved here, I expect this to transition to the ProductList 
                   //Page but it doesn't and I'm not sure why
                    MainPage = new NavigationPage(new ProductList(ProductsViewModel));
                    
                })
            );
    }
 

Комментарии:

1. Сработало отлично! Спасибо!