FreshMVVM 并在弹出模态之前重置 VM
FreshMVVM and resetting VM before popping Modal
- 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.PopPageModel
call in GitHub,您会发现它处理两个进程
- 提高 PageWasPopped 信号
- 调用导航服务将页面从导航堆栈中弹出
FreshMVVM
代码handles the page being popped is in FreshPageModel。除其他外,代码从 Appearing 和 Disappearing 事件中解除挂钩,并且 将 BindingContext 设置为 null。从上面的顺序可以看出,这意味着 View
上的 BindingContext
在从堆栈中弹出之前设置为 null。
问题在于,在 0.5 到 1.5 秒之间的短时间内,用户会看到一个 View
,看起来数据已全部重置。如果他们刚刚按下保存,这可能会非常令人不安。
如果我颠倒 PopPageModel
中的逻辑顺序并在调用 RaisePageWasPopped
之前从导航堆栈中弹出,此问题就会消失。
以前没有其他人遇到过这个问题吗?
FreshMVVM
的任何用户想要指出我建议的方法的错误吗?
请注意正在等待服务,按住UI直到服务完成,
您是否尝试过删除 await
并立即弹出页面或在服务繁忙时显示加载程序?
this.InsertReports(metadata.Reports).ConfigureAwait(false);
我们解决这个问题的方法是实现我们自己的 PopPageModel 方法,该方法实质上是切换顺序,以便在调用 RaisePageWasPopped
之前在导航堆栈上调用 PopPage
这就是我们要关闭页面时调用的方法
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();
}
}
});
}
- 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.PopPageModel
call in GitHub,您会发现它处理两个进程
- 提高 PageWasPopped 信号
- 调用导航服务将页面从导航堆栈中弹出
FreshMVVM
代码handles the page being popped is in FreshPageModel。除其他外,代码从 Appearing 和 Disappearing 事件中解除挂钩,并且 将 BindingContext 设置为 null。从上面的顺序可以看出,这意味着 View
上的 BindingContext
在从堆栈中弹出之前设置为 null。
问题在于,在 0.5 到 1.5 秒之间的短时间内,用户会看到一个 View
,看起来数据已全部重置。如果他们刚刚按下保存,这可能会非常令人不安。
如果我颠倒 PopPageModel
中的逻辑顺序并在调用 RaisePageWasPopped
之前从导航堆栈中弹出,此问题就会消失。
以前没有其他人遇到过这个问题吗?
FreshMVVM
的任何用户想要指出我建议的方法的错误吗?
请注意正在等待服务,按住UI直到服务完成,
您是否尝试过删除 await
并立即弹出页面或在服务繁忙时显示加载程序?
this.InsertReports(metadata.Reports).ConfigureAwait(false);
我们解决这个问题的方法是实现我们自己的 PopPageModel 方法,该方法实质上是切换顺序,以便在调用 RaisePageWasPopped
这就是我们要关闭页面时调用的方法
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();
}
}
});
}