3
  • FreshMVVM 3.0.0
  • Xamarin 形式 4.2

我们的一些输入页面是模态加载的,当用户按下保存时,我们执行Command这样的

var newTemperature = new Temperature()
{
    Date = DateTime.Now,
    Value = this.TemperatureValue,
    CaptureType = CaptureType.Manual,
    IsModified = true,
};

await this.Services.DataService.SaveAsync(newTemperature);

// Save completed, now close modal.
await this.CoreMethods.PopPageModel(data, modal, animate);

如果您查看CoreMethods.PopPageModelGitHub 中的调用,您会发现它处理两个进程

  1. 提高 PageWasPopped 信号
  2. 调用导航服务以从导航堆栈中弹出页面

处理弹出页面的FreshMVVM代码位于 FreshPageModel 中。除其他外,代码从 Appearing 和 Disappearing 事件中解脱钩,并将BindingContext 设置为 null。从上面的顺序可以看出,这意味着在从堆栈中弹出之前将BindingContexton设置为 null。View

这样做的问题是,在 0.5 到 1.5 秒之间的短时间内,用户会看到一个View看起来数据已全部重置的数据。如果他们刚刚按下保存,这可能会非常令人不安。

如果我在调用此问题之前反转逻辑顺序PopPageModel并从导航堆栈中弹出,则RaisePageWasPopped此问题消失。

以前没有其他人见过这个问题吗?

任何FreshMVVM想要指出我建议的方法错误的用户?

4

2 回答 2

0

请注意,服务正在等待,保持 UI 直到服务完成,您是否尝试过await立即删除并弹出页面或在服务繁忙时显示加载器?

this.InsertReports(metadata.Reports).ConfigureAwait(false);

于 2020-02-21T09:26:11.897 回答
0

我们对这个问题的解决方案是实现我们自己的 PopPageModel 方法,该方法本质上是切换顺序,以便在调用之前在导航堆栈上调用 PopPageRaisePageWasPopped

当我们想要关闭页面时,这就是我们所说的

public Task DismissAsync(bool modal = true, bool animate = true)
{
    return this.DispatcherService.RunOnUiThreadAsync(
        async () =>
            {
                string navServiceName = this.CurrentNavigationServiceName;
                if (this.IsModalFirstChild)
                {
                    await this.CoreMethods.PopModalNavigationService(true);
                }
                else
                {
                    IFreshNavigationService rootNavigation = FreshIOC.Container.Resolve<IFreshNavigationService>(navServiceName);
                    await rootNavigation.PopPage(modal, animate);

                    if (modal)
                    {
                        this.RaisePageWasPopped();
                    }
                }
            });
}
于 2020-04-09T09:34:58.043 回答