在創建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來簡化。
