Как я могу дождаться завершения асинхронного метода, а затем продолжить выполнение инструкции? - PullRequest
0 голосов
/ 25 июня 2019

Я создаю кроссплатформенное приложение для xamarin.forms. Я использую плагин для отображения всплывающего окна. Однако, похоже, что клавиша await не работает, так как выполнение продолжается до завершения задачи. Кроме того, если кнопка для отображения всплывающего окна нажимается быстро много раз подряд, всплывающее окно будет отображаться при многократном нажатии вместо отображения один раз и блокирует все остальные.

У меня есть команда, прикрепленная к кнопке. Всякий раз, когда нажимается кнопка, свойство команды запускается корректно, но await, похоже, не действует.

public ICommand {
            get => new Command(async () =>
            {
                if (ObjectivosDoMes.Count < 3)
                    await PopupNavigation.Instance.PushAsync(new NovoObjectivoDoMes(ObjectivosDoMes), true);
                        PodeAdicionarObjMes = ObjectivosDoMes.Count < 3 ? true : false;
            });
        }

Я бы хотел, чтобы после показа всплывающего окна код выполнялся сразу после его закрытия. Это библиотека, которую я использую для отображения всплывающего окна: https://github.com/rotorgames/Rg.Plugins.Popup

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

await работает нормально.Используемая вами библиотека всплывающих окон завершает свою операцию PushAsync, когда всплывающее окно отображается , а не когда закрыто .См. этот выпуск , чтобы найти обходной путь, позволяющий await закрыть всплывающее окно.

0 голосов
/ 26 июня 2019

В вашем коде вы предполагаете, что задание, возвращаемое PopupNavigation, завершится, когда всплывающее окно закроется.Вместо этого, как только всплывающая страница будет помещена в стек навигации, эта задача завершится.Поэтому ожидание этой задачи не поможет определить, когда всплывающее окно было закрыто.Вы можете подключиться к событию «Исчезновение» всплывающей страницы.Вот некоторый рабочий пример, который является автономным и не зависит от других Views / ViewModels.

       // in constructor
        ButtonTappedCommand = new Command(async () => await OnButtonTappedCommand()) ;
        page = new Rg.Plugins.Popup.Pages.PopupPage();
    }

    private async Task OnButtonTappedCommand()
    {
        page.Content = new Button() 
        { 
           Text="Close", 
           // close the popup page on tap
           Command = new Command(()=>PopupNavigation.Instance.PopAsync()) 
        };
        page.Disappearing += Popup_Disappearing;

        await PopupNavigation.Instance.PushAsync(page);
    }

    private void Popup_Disappearing(object sender, EventArgs e)
    {
        page.Disappearing -= Popup_Disappearing;
        Debug.WriteLine("Someone closed the popup");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...