ReloadState 方法和 MvxViewModel 上的 Init 不冲突吗?
Isn't ReloadState method conflicts with Init on MvxViewModel?
根据这个https://github.com/MvvmCross/MvvmCross/wiki/View-Model-Lifecycle,我们应该实现保存状态和重新加载状态来处理逻辑删除。
但是如果我们在 Init 方法中有一个值参数会发生什么?
示例:
public StockDetailViewModel
{
int stockId;
...
void Init(int stockIdAsIntent)
{
stockId = stockIdAsIntent
}
protected override void ReloadFromBundle(IMvxBundle state)
{
id = int.Parse(state.Data["id"]);
}
protected override void SaveStateToBundle(IMvxBundle bundle)
{
bundle.Data["id"] = stockId;
}
async void Start()
{
stockModel = StockService.Get(stockId);
}
...
}
现在假设我们导航到名为 StockFormViewModel
的子视图模型。
这样做会调用 SaveState
方法。
现在我们打开表格,做我们的事情,然后调用 this.Close(this);
如果我们跟随CIRS,首先会调用Init
,然后是ReloadState
。
但是 Init
方法将失败,因为我们来自子视图模型,并且没有给出任何意图作为参数,因此 ReloadState
方法没有机会启动并恢复stockId.
我很确定我在这里做错了什么,但我不能指责它...
事实证明,我将 MVVMCross 导航与父意图导航混合在一起(由于基础 class 的旧重构)。
这些不能一起工作是完全有道理的。
我切换到完整的 MVVM 交叉导航,并且有两种情况:
- 如果视图模型仍在缓存中(mvvmcross 有一个 VM 缓存),它会从那里获取 VM,因此,当您在 "child"、none 上调用关闭时调用初始化方法(Init、Reload 或 Start)。
- 如果视图模型不在缓存中,它将重建 VM 并调用 ReloadState 而不是 Init。
根据这个https://github.com/MvvmCross/MvvmCross/wiki/View-Model-Lifecycle,我们应该实现保存状态和重新加载状态来处理逻辑删除。
但是如果我们在 Init 方法中有一个值参数会发生什么?
示例:
public StockDetailViewModel
{
int stockId;
...
void Init(int stockIdAsIntent)
{
stockId = stockIdAsIntent
}
protected override void ReloadFromBundle(IMvxBundle state)
{
id = int.Parse(state.Data["id"]);
}
protected override void SaveStateToBundle(IMvxBundle bundle)
{
bundle.Data["id"] = stockId;
}
async void Start()
{
stockModel = StockService.Get(stockId);
}
...
}
现在假设我们导航到名为 StockFormViewModel
的子视图模型。
这样做会调用 SaveState
方法。
现在我们打开表格,做我们的事情,然后调用 this.Close(this);
如果我们跟随CIRS,首先会调用Init
,然后是ReloadState
。
但是 Init
方法将失败,因为我们来自子视图模型,并且没有给出任何意图作为参数,因此 ReloadState
方法没有机会启动并恢复stockId.
我很确定我在这里做错了什么,但我不能指责它...
事实证明,我将 MVVMCross 导航与父意图导航混合在一起(由于基础 class 的旧重构)。 这些不能一起工作是完全有道理的。
我切换到完整的 MVVM 交叉导航,并且有两种情况:
- 如果视图模型仍在缓存中(mvvmcross 有一个 VM 缓存),它会从那里获取 VM,因此,当您在 "child"、none 上调用关闭时调用初始化方法(Init、Reload 或 Start)。
- 如果视图模型不在缓存中,它将重建 VM 并调用 ReloadState 而不是 Init。