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)
应用恢复时的状态恢复流程:
- 先调用
ReloadFromBundle
- 然后调用无参
Prepare
- 最后调用
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模式:
- Construction:通过IoC构造
- Init:初始化导航参数
- ReloadState:恢复墓碑状态
- 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() { ... }
}
最佳实践建议
- 依赖注入:始终通过构造函数注入依赖项
- 职责分离:
- Prepare只保存参数,不执行业务逻辑
- Initialize处理异步初始化
- SaveState/ReloadState只处理状态序列化
- 生命周期感知:谨慎使用视图回调,考虑平台差异
- 资源管理:对于长时间运行的资源,考虑使用弱引用或消息机制
总结
MvvmCross提供了完善的ViewModel生命周期管理机制,从基础的构造初始化,到复杂的墓碑状态处理,再到与视图生命周期的深度集成。理解这些生命周期方法及其调用时机,对于开发健壮的跨平台MVVM应用至关重要。开发者应根据具体需求选择合适的生命周期方法来实现业务逻辑,同时注意平台差异和性能优化。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考