使用活动模块的视图模型工厂和视图模型注入之间的差异

问题描述 投票:0回答:1

我想知道以下两种方法中的哪一种更适合我的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个回答
0
投票

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

例如,它将在配置更改期间保留相同的实例,当活动被破坏时,它将自动调用onCleared

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

© www.soinside.com 2019 - 2024. All rights reserved.