【问题标题】:Difference between viewmodelfactory and view model injection using activity moduleviewmodelfactory 和使用活动模块的视图模型注入之间的区别
【发布时间】:2020-04-22 21:16:59
【问题描述】:

我想知道以下两种方法中哪一种更适合我的 android 应用程序及其原因。

首先是使用 viewmodelfactory 模式,其次是 viewModelStoreProvider。任何人都可以阐明这些方法吗?

第一种方法:

@Singleton
class BaseViewModelFactory<T>(val creator: () -> T) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return creator() as T
    }

2.ViewModelStoreOwner code :
class ViewModelStoreProvider
    constructor(viewModelProvider: ViewModelStoreOwner) {

    var viewModelStore: ViewModelStoreOwner = viewModelProvider

    inline fun <reified T : ViewModel> getViewModel(noinline creator: (() -> T)? = null): T {
        return if (creator == null)
            ViewModelProvider(viewModelStore).get(T::class.java)
        else
            ViewModelProvider(viewModelStore, BaseViewModelFactory(creator)).get(T::class.java)
    }
}

并在应用程序(应用程序、活动、片段)的任何位置使用以下代码创建视图模型实例

viewModelStoreProvider.getViewModel { ConfigViewModel(firebaseRemoteConfigRepository)}

第二种方法:

BaseViewModel 类:

open class BaseViewModel<N>(
    val dataManager: DataManager,
    val schedulerProvider: SchedulerProvider
) : ViewModel() {
    open var navigator: N? = null
    val compositeDisposable: CompositeDisposable

    init {
        this.compositeDisposable = CompositeDisposable()
    }

    override fun onCleared() {
        compositeDisposable.dispose()
        super.onCleared()
    }
}

class LoginViewModel(dataManager: DataManager, schedulerProvider: SchedulerProvider) :
    BaseViewModel<LoginNavigator>(dataManager, schedulerProvider) {

    override var navigator: LoginNavigator?
        get() = super.navigator
        set(navigator) {
            super.navigator = navigator
        }

    public override fun onCleared() {
        super.onCleared()
    }
}

@Module
class LoginActivityModule {
    @Provides
    internal fun provideLoginViewModel(
        dataManager: DataManager,
        schedulerProvider: SchedulerProvider
    ): LoginViewModel {
        return LoginViewModel(dataManager, schedulerProvider)
    }
}

我们使用

在 Activity 中注入视图模型
@Inject
override lateinit var viewModel: LoginViewModel
    internal set

如果有不清楚的地方请告诉我,我会尽力回答。

【问题讨论】:

    标签: java android kotlin androidx android-mvvm


    【解决方案1】:

    ViewModelFactory 是使用构造函数参数创建ViewModels 的正确方法。它将根据其父级 Activity/Fragment Lifecycle 处理与 ViewModel 相关的所有内容。

    例如在配置更改时会保持相同的实例,在activity销毁时会自动调用onCleared

    使用注入方法,您将负责与ViewModel 的生命周期相关的所有事情,例如何时创建新实例、如何/何时调用onCleared

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2011-01-30
      • 2014-04-19
      • 2020-09-17
      • 2013-01-01
      相关资源
      最近更新 更多