【问题标题】:Xamarin Forms / MvvmCross architecture with ICommand.Execute(Object) pattern?Xamarin Forms / MvvmCross 架构与 ICommand.Execute(Object) 模式?
【发布时间】:2018-12-12 15:38:28
【问题描述】:

我已经开始学习一些使用 Xamarin Forms 和 MvvmCross 的移动开发。

在最简单的形式中,我有一个包含按钮的应用程序。当点击此按钮时,它会通过休息服务调用 api,并通过消息服务返回数据。

我在使用 ICommand.Execute(object) 模式时遇到了显示对话框 (ACR) 的问题。我假设这是因为此模式中的执行不是异步的,因此会阻塞主 ui 线程?这是我正在做的一个示例:

var cmd = Command.Create(CmdType.Login);
cmd.Execute(User); 

对于异步操作,请直接考虑 MvvmCross 文档中的以下几行。

MyCommand = new MvxCommand(() => MyTaskNotifier = MvxNotifyTask.Create(() => MyMethodAsync(), onException: ex => OnException(ex)));

private async Task MyMethodAsync()
{
    await _someService.DoSomethingAsync();

    // ...
}

在这种情况下,我的 DoSomething() 不是 aysnc - 如果有的话,它是 async void 或 no no。为了解决这个问题,我将 MvxCommand 更新为 MvxAsyncCommand,然后必须使用创可贴来显示对话框。

await Task.Delay(300);

await Task.Run(() => { command.Execute(User); }).ConfigureAwait(false);

此时,我显然在质疑命令模式的使用。我是否错过了一个简单的解决方案,或者我选择了一个不适合这里的架构?任何指导表示赞赏。

【问题讨论】:

标签: xamarin mvvmcross


【解决方案1】:

你可以这样使用它

public ICommand YourCommand => new Command(async () => await YourActionAsync());

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 2015-10-25
    • 1970-01-01
    • 2017-08-18
    • 2019-07-30
    • 2016-04-24
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多