viewmodelfactory 和使用 activity 模块的视图模型注入之间的区别

Difference between viewmodelfactory and view model injection using activity module

我想知道以下两种方法中哪一种更适合我的 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)
    }
}

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

viewModelStoreProvider.getViewModel { ConfigViewModel(firebaseRemoteConfigRepository)}

第二种方法:

基础视图模型class:

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

如有不明之处请告诉我,我会尽力解答。

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

例如配置更改时会保持同一个实例,当activity销毁时会自动调用onCleared

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