首页 > 解决方案 > 如何等待异步方法完成然后继续执行指令?

问题描述

我正在 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

标签: c#xamarin.formsasync-await

解决方案


在您的代码中,您假设 PopupNavigation 返回的任务将在弹出窗口关闭时完成。相反,一旦弹出页面被推送到导航堆栈,这个任务就会完成。因此,等待此任务将无助于检测弹出窗口何时关闭。您可以挂钩到弹出页面的消失事件。这是一些独立的工作示例,不依赖于其他视图/视图模型。

       // 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");
    }

推荐阅读