在创建viewModel时,通用的方法是
viewModel = ViewModelProvider(this,MainViewModel.MainViewModelFactory()).get(MainViewModel::class.java) //viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
对应MainViewModelFactory:
class MainViewModelFactory() : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return MainViewModel() as T
}
}
如果加了关于activity或者fragment的ktx拓展依赖,则可以简化写法
val viewModel by viewModels<MainViewModel>()
查看这个拓展的方法源码可以看到
@MainThread
public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
val factoryPromise = factoryProducer ?: {
defaultViewModelProviderFactory
}
return ViewModelLazy(VM::class, { viewModelStore }, factoryPromise)
}
当factoryProducer为null时,调用了defaultViewModelProviderFactory的方法;
对应的代码为ComponentActivity.java类中
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;
}
这里创建了一个SavedStateViewModelFactory来简化。
