MvvmCross ViewModel 生命周期

MvvmCross ViewModel Life Cycle

根据我能查到的资料,MvvmCross Viewmodel的生命周期是

构造-使用IoC进行依赖注入

Init() - 导航参数的初始化

ReloadState() - 墓碑后补水

Start() - 初始化和再水化完成时调用

我的实现如下:

public async Task Init(Guid ID)
{
    await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentInventory(ID);
    ShipmentInventory = ShipmentDataSource.CurrInventory;

    ShipmentLots = await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentLotList((int)ShipmentInventory.idno, (short)ShipmentInventory.idsub);

    Inv_DamageList = await ListDataSource.GetInv_Damage();
}
protected override void SaveStateToBundle(IMvxBundle bundle)
{
    base.SaveStateToBundle(bundle);
    bundle.Data["ShipmentInventory"] = StringSerializer.SerializeObject(ShipmentInventory);
    bundle.Data["ShipmentLots"] = StringSerializer.SerializeObject(ShipmentLots);
    bundle.Data["Inv_DamageList"] = StringSerializer.SerializeObject(Inv_DamageList);
}

protected override void ReloadFromBundle(IMvxBundle state)
{
    base.ReloadFromBundle(state);
    ShipmentInventory = StringSerializer.DeserializeObject<ShipmentInventory>(state.Data["ShipmentInventory"]);
    ShipmentLots = StringSerializer.DeserializeObject<ShipmentLotList>(state.Data["ShipmentLots"]);
    Inv_DamageList = StringSerializer.DeserializeObject<Inv_DamageList>(state.Data["Inv_DamageList"]);
    state.Data.Clear();
}

首先,当我按下 Home 键时,我似乎无法让模拟器真正销毁 Activity,即使我选中了该选项。 activity 似乎一直在后台徘徊。

也就是说,当我按下主页键时,它会调用 SaveStateToBundle。它似乎永远不会调用 ReloadFromBundle。这使得很难测试实际发生了什么。我担心的是,根据生命周期,如果应用程序确实从墓碑中恢复,它会在调用 ReloadFromBundle 之前调用 Init。由于 Init 是将参数传递给 ViewModel 的首选方式,因此只有使用参数来初始化数据才有意义。如果发生这种情况后,它调用ReloadFromBundle,它会覆盖Init中初始化的数据。这很好但效率很低。有没有办法在 Init 中知道 ViewModel 是由于新导航而创建的,还是正在从逻辑删除中恢复的?

感谢您对此的任何帮助。

吉姆

我与 ReloadFromBundle(IMvxBundle state) 有同样的问题,它从未被调用过。只有 "SaveState" 模式似乎有效。

不过我可以回答你的第二个问题:

您不应使用 Init 加载数据。您应该只使用它来传递要检索的数据的 ID。 "loading" 阶段应该发生在 Start 方法中。