当从缓存中重新加载 ViewModel 时,我需要能够拦截框架并执行重新初始化。由于没有重新创建 ViewModel,我既不能使用 Init()、MvxViewModel.InitFromBundle 也不能使用 MvxViewModel.ReloadFromBundle 方法。
我正在尝试调试单击后退按钮会恢复状态不一致的 ViewModel 的情况。某种 MvxViewModel.OnReloading() 会有所帮助。
有没有办法在 v3 中做到这一点?
编辑:
假设我有 FirstPageViewModel,它公开了一个导航到 SecondPageViewModel 的命令。根据我的观察,如果您在 SecondPageView 上单击模拟器的后退按钮,则不会构造 FirstPageViewModel。相反,我相信它是从某个缓存中检索的,然后绑定到视图。此缓存可能是 IMvxSingleViewModel 缓存的实现。
因此,在 ViewModel 构建之后调用 Init()、InitFromBundle() 和 ReloadFromBundle() 的常规流程不适用于这种情况。换句话说,我需要一种重新初始化 ViewModel 的方法,无论它是刚刚构建的,还是从缓存中复活的。如果是前者,我可以使用 Init() 方法。如果后者为真,则无法在 ViewModel 本身内执行此操作。
这就是问题:
我有一个从 FirstViewModel 传递到 SecondViewModel 的 ICollectionService 实例。FirstView 还包含一个绑定到此 CollectionService 的 ListView。因为 CollectionService 不是强类型的,所以我可以传递它并使用适当的项目模板在视图中呈现它的项目。
在显示 SecondViewModel 之前,FirstViewModel 检索一些远程数据并填充 CollectionService。当显示 SecondViewModel 时,它的视图使用不同的项模板显示来自 CollectionService 的数据。但是,如果我向后导航,由于 FirstViewModel 仍在引用 CollectionService,FirstView 将呈现 SecondViewModel 使用的数据,除非可以重新初始化 FirstViewModel,在此过程中清除 CollectionService。也许方法是错误的,但这是我问题的症结所在。
我不知道平台是否会有所不同,因为我希望 Windows Phone 和 iOS 上的行为相同,因为这种重新初始化将发生在 Core 模块中。尽管如此,这些都是对 Android 的观察。
TIA。