Использование LiveData вместо ада обратного вызова для взаимодействия между фрагментами - PullRequest
0 голосов
/ 11 декабря 2019

Давным-давно нормальным и предлагаемым способом взаимодействия между фрагментами было создание интерфейса, расширенного в Activity. По сути, если я хотел получить данные из фрагмента B во фрагмент C, мне нужно было сделать фрагмент B для MainActivity, а затем MainActivity для фрагмента C. На мой взгляд - полный беспорядок.

Просто начал использовать LiveDataи подумал об использовании его вместо обратных вызовов - например:

FragmentInteraction.kt

val onOkayButtonClicked = SingleLiveEvent<Void>()
val onCancelButtonClicked = SingleLiveEvent<Void>()

FragmentA.kt

onOkayButtonClicked.call()

FragmentB.kt

onOkayButtonClicked.observe(viewLifecycleOwner, Observer {
    // do whatever u want
})

Есть ли у этого подхода недостатки? Есть ли более простой / элегантный способ подойти к этому?

1 Ответ

0 голосов
/ 11 декабря 2019

У вас может быть только одна ViewModel (lifecycleOwner = активность), которая будет иметь все liveDataEvents, необходимые для взаимодействия. Вы будете работать с liveData из событий onClick:

okayButton.setOnClickListener { viewModel.onOkayButtonClicked() }

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

Все эти переходы я рекомендую делать на уровне активности.

...