MvvmCross 5导航服务

时间:2017-06-26 11:58:47

标签: c# android xamarin mvvmcross

我对MvvmCross 5中引入的导航服务有疑问。

在版本4中:

  • 我使用ShowViewModel<ViewModel>()导航到片段
  • 然后调用ViewModel的Init方法
  • 之后,称为片段的OnCreateView方法
  • 我可以根据ViewModel数据操作视图(例如,向视图添加特定元素)。

在第5版中:

  • 我使用await NavigationService.Navigate<ViewModel>()
  • 导航
  • 首先调用片段的OnCreateView
  • 之后是ViewModel中的Initialize方法。
  • 创建片段视图时,不会以ViewModel数据结束。

这是错误还是异步导航功能? 如果需要,是否有更好的方法来基于ViewModel数据操作Fragment视图?

1 个答案:

答案 0 :(得分:3)

  

这是一个错误还是异步导航的功能?

这是设计的,但自那时起(v5.0.4)进行了修订,请参见下面的流量变化。

  

如果需要,是否有更好的方法来操纵片段   基于ViewModel数据的视图?

使用v5.0.4 +应该会产生您期望的行为。在开始视图生命周期事件之前,等待Initialize() ViewModel ViewModel.Ctor处的导航服务完成。

MvvmCross v5.0.0 - v5.0.3

您看到的行为出现在MvvmCross 5.0.0-5.0.3中。流程如下:

  • Init(parameter)
  • (选定的导航电话) ViewModel.ReloadState(savedState) 已弃用,使用反射,而非使用类型安全初始化)
  • (选定的导航电话) ViewModel.Start()
  • (选定的导航电话) BeforeNavigate
  • *ViewDispatcher.ShowViewModel() (NavigationService事件)
  • *ViewModel.Initialize() (触发视图生命周期)
  • AfterNavigate
  • BeforeClose (NavigationService事件)
  • ViewDispatcher.ChangePresentation() (NavigationService事件)
  • AfterClose
  • ViewModel.Ctor (NavigationService事件)

MvvmCross v5.0.4 +

v5.0.4 +改进了流程并更改了导航顺序:

  • BeforeNavigate
  • *ViewModel.Initialize() (NavigationService事件)
  • Init(parameter)
  • ViewModel.ReloadState(savedState) 已弃用,使用反射,而非使用类型安全初始化)
  • ViewModel.Start()
  • *ViewDispatcher.ShowViewModel()
  • AfterNavigate (触发视图生命周期)
  • BeforeClose (NavigationService事件)
  • ViewDispatcher.ChangePresentation() (NavigationService事件)
  • AfterClose
  • Initialize (NavigationService事件)

其他信息

您可以查看导航订单中记录的GitHub问题(#1968)。此外,您还可以查看更新版本5.0.4的{{1}}订单的提取请求(#1971)。