Разница между viewmodelfactory и представлением модели представления с использованием модуля активности - PullRequest
0 голосов
/ 23 апреля 2020

Мне интересно, какой из следующих двух подходов лучше подходит для моего android приложения и причины для этого.

Первый использует viewmodelfactory pattern , а второй - 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

Пожалуйста, дайте мне знать, если что-то неясно, и я сделаю все возможное, чтобы ответить на него.

1 Ответ

0 голосов
/ 23 апреля 2020

ViewModelFactory - правильный способ создания ViewModels с параметрами конструктора. Он позаботится обо всем, что связано с ViewModel, в соответствии с его родительским Activity/Fragment Жизненным циклом.

Например, он сохранит тот же экземпляр во время изменений конфигурации, он автоматически вызовет onCleared, когда действие будет уничтожено.

При использовании метода инъекции вы будете нести ответственность за все, что связано с жизненным циклом ViewModel, например, когда создавать новый экземпляр, как / когда будет вызываться onCleared.

...