todo-mvvm-xxx - связь между моделями представления - PullRequest
0 голосов
/ 27 июня 2018

Проблема:

У меня есть действие, в котором есть кнопка с общим доступом, общий заголовок, панель общего процесса и контейнер в середине экрана, где заменены фрагменты.

, поэтому у меня есть viewmodel of acitivty - ActivityViewModel и внутри него есть наблюдаемые:

val mNavigationToMainActivity = CompletableSubject.create()
val mNavigationToUsername = PublishSubject.create<Any>()
val mNavigationToPassword = PublishSubject.create<Any>()
val mNavigationToChangePassword = PublishSubject.create<LoginItem>()


val mProcessBar = PublishSubject.create<Int>()
val mContinueButtonEnabled = BehaviorSubject.createDefault(false)
val mContinueClick = PublishSubject.create<Any>()
val mChangeTitleSubject = BehaviorSubject.createDefault(false)
val mLoadingIndicatorSubject = BehaviorSubject.createDefault(false)

и между фрагментом, который вызывает FragmentViewModel, есть общая модель представления. весь фрагмент использует одну и ту же модель представления

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

или, например, чтобы включить кнопку, когда ввод действителен

так вот что я сделал, чтобы общаться между ними:

fun <T> PublishSubject<T>.bind(subject: PublishSubject<T>): Disposable {
    return subscribe({ subject.onNext(it) }, { throwable -> subject.onError(throwable) })
}

fun <T> BehaviorSubject<T>.bind(subject: BehaviorSubject<T>): Disposable {
    return subscribe({ subject.onNext(it) }, { throwable -> subject.onError(throwable) })
}

fun CompletableSubject.bind(subject: CompletableSubject): Disposable {
    return subscribe({ subject.onComplete() }, { throwable -> subject.onError(throwable) })
}

я позволил посмотреть модель фрагмента, чтобы расширить модель вида базовой видовой модели

так что это модель представления активности

открытый класс IntroViewModel: BaseViewModel () {

val mNavigationToMainActivity = CompletableSubject.create()
val mNavigationToUsername = PublishSubject.create<Any>()
val mNavigationToPassword = PublishSubject.create<Any>()
val mNavigationToChangePassword = PublishSubject.create<LoginItem>()


val mProcessBar = PublishSubject.create<Int>()
val mContinueButtonEnabled = BehaviorSubject.createDefault(false)
val mContinueClick = PublishSubject.create<Any>()
val mChangeTitleSubject = BehaviorSubject.createDefault(false)


fun bind(introViewModel: IntroViewModel){
    mNavigationToUsername.bind(introViewModel.mNavigationToUsername).addDisposable()
    mNavigationToPassword.bind(introViewModel.mNavigationToPassword).addDisposable()
    mNavigationToChangePassword.bind(introViewModel.mNavigationToChangePassword).addDisposable()
    mNavigationToMainActivity.bind(introViewModel.mNavigationToMainActivity).addDisposable()
    mProcessBar.bind(introViewModel.mProcessBar).addDisposable()
    mContinueButtonEnabled.bind(introViewModel.mContinueButtonEnabled).addDisposable()
}

fun continueClicked() {
    mContinueClick.onNext(Any())
}

} и это фрагмент

class ChangePasswordViewModel(private val userRepository: UserRepository)
    : IntroViewModel() {

и внутри каждого фрагмента я связал модель представления активности с моделью просмотра фрагмента

 viewModel = ViewModelProviders.of(activity!!, viewModelFactory).get(ChangePasswordViewModel::class.java)
        viewModel.start(2,arguments?.getParcelable(LoginItem::class.simpleName))
    ViewModelProviders.of(activity!!, viewModelFactory).get(IntroViewModel::class.java).apply {
        viewModel.bind(this)
    }

это противно, и мне это не очень нравится. Можете ли вы помочь мне с этим ??

...