关于by viewModels的实际实现方式


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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM