MvvmCross框架中的ViewModel生命周期详解

MvvmCross框架中的ViewModel生命周期详解

概述

在MvvmCross框架中,ViewModel作为MVVM模式的核心组件,其生命周期管理对于应用开发至关重要。本文将深入解析MvvmCross中ViewModel的完整生命周期,帮助开发者更好地掌握ViewModel的创建、初始化、状态保存与恢复等关键环节。

基础生命周期方法

1. 构造函数(Construction)

MvvmCross使用IoC容器实例化ViewModel,并通过依赖注入机制注入所有指定的依赖项:

public class SampleViewModel : MvxViewModel
{
    private readonly IDataService _dataService;
    
    public SampleViewModel(IDataService dataService)
    {
        _dataService = dataService; // 依赖注入
    }
}

2. Prepare方法

Prepare方法用于接收导航参数,分为两种形式:

  • 无参Prepare:在所有场景下都会被调用
  • 带参Prepare:仅在带参数导航时调用

典型实现示例:

public class DetailViewModel : MvxViewModel<DetailParameter>
{
    private DetailParameter _param;
    
    public override void Prepare(DetailParameter parameter)
    {
        _param = parameter; // 保存导航参数
    }
}

3. Initialize方法

Initialize在原生导航完成后调用,适合执行异步初始化操作:

public override async Task Initialize()
{
    await base.Initialize();
    // 执行初始化逻辑,如加载数据
    await LoadDataAsync();
}

框架会自动创建InitializeTask属性,可用于绑定UI显示加载状态。

状态管理与墓碑化(Tombstoning)

状态保存(SaveState)

当应用进入墓碑状态时,框架会调用SaveStateToBundle方法:

protected override void SaveStateToBundle(IMvxBundle bundle)
{
    base.SaveStateToBundle(bundle);
    bundle.Data["Key"] = JsonConvert.SerializeObject(_importantData);
}

状态恢复(ReloadState)

应用恢复时的状态恢复流程:

  1. 先调用ReloadFromBundle
  2. 然后调用无参Prepare
  3. 最后调用Initialize

恢复状态示例:

protected override void ReloadFromBundle(IMvxBundle state)
{
    base.ReloadFromBundle(state);
    if(state.Data.ContainsKey("Key"))
    {
        _importantData = JsonConvert.DeserializeObject<DataType>(state.Data["Key"]);
    }
}

视图生命周期回调

MvvmCross 5.0+版本将ViewModel与视图生命周期关联,提供了以下回调方法:

void ViewCreated();      // 视图创建时
void ViewAppearing();    // 视图即将显示
void ViewAppeared();     // 视图已显示
void ViewDisappearing(); // 视图即将消失
void ViewDisappeared();  // 视图已消失
void ViewDestroy();      // 视图销毁时

这些方法在不同平台上有不同的底层实现:

| 回调 | iOS | Android | UWP | |--------------|--------------------|-----------------------|---------------| | Appearing | ViewWillAppear | OnAttachedToWindow | Loading | | Appeared | ViewDidAppear | OnGlobalLayout | OnLoaded | | Disappearing | ViewWillDisappear | OnPause | Unloaded | | Disappeared | ViewDidDisappear | OnDetachedFromWindow | OnUnloaded |

4.x及3.x版本的生命周期

在早期版本中,ViewModel生命周期采用CIRS模式:

  1. Construction:通过IoC构造
  2. Init:初始化导航参数
  3. ReloadState:恢复墓碑状态
  4. Start:初始化完成后的启动

典型实现:

public class LegacyViewModel : MvxViewModel
{
    // 1. Construction
    public LegacyViewModel(IService service) { ... }
    
    // 2. Init
    public void Init(NavParams parameters) { ... }
    
    // 3. ReloadState
    public void ReloadState(SavedState state) { ... }
    
    // 4. Start
    public override void Start() { ... }
}

最佳实践建议

  1. 依赖注入:始终通过构造函数注入依赖项
  2. 职责分离
    • Prepare只保存参数,不执行业务逻辑
    • Initialize处理异步初始化
    • SaveState/ReloadState只处理状态序列化
  3. 生命周期感知:谨慎使用视图回调,考虑平台差异
  4. 资源管理:对于长时间运行的资源,考虑使用弱引用或消息机制

总结

MvvmCross提供了完善的ViewModel生命周期管理机制,从基础的构造初始化,到复杂的墓碑状态处理,再到与视图生命周期的深度集成。理解这些生命周期方法及其调用时机,对于开发健壮的跨平台MVVM应用至关重要。开发者应根据具体需求选择合适的生命周期方法来实现业务逻辑,同时注意平台差异和性能优化。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

井美婵Toby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值