ViewModel源码分析
为什么要使用反射创建ViewModel?我觉得应该是为了保证只存在一个ViewModel的实例。所以通过Map存储。如果单独需要创建,并添加到map中。设计者可能是为了解耦这个过程。所以通过反射来创建。
创建
//activity/activity-ktx/src/main/java/androidx/activity/ActivityViewModelLazy.kt
@MainThread
inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
//如果Factory为空则调用getDefaultViewModelProviderFactory获取Factory
//默认的Factory对象时SavedStateViewModelFactory
val factoryPromise = factoryProducer ?: {
defaultViewModelProviderFactory
}
//创建ViewModelLazy
//调用getViewModelStore方法获取ViewModelStore
return ViewModelLazy(VM::class, { viewModelStore }, factoryPromise)
}//activity/activity/src/main/java/androidx/activity/ComponentActivity.java
@NonNull
@Override
public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
if (getApplication() == null) {
throw new IllegalStateException("Your activity is not yet attached to the "
+ "Application instance. You can't request ViewModel before onCreate call.");
}
if (mDefaultFactory == null) {
mDefaultFactory = new SavedStateViewModelFactory(
getApplication(),
this,
getIntent() != null ? getIntent().getExtras() : null);
}
return mDefaultFactory;
}ViewModelProvider
提供者,负责调用工厂创建ViewModel并存储到ViewStore中或者从ViewStore中读取ViewModel
ViewModelStore
Factory
工厂负责创建ViewModel

最后更新于