在创建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来简化。