Я приведу пример, чтобы легко объяснить мою проблему.
Рассмотрим FragmentA
с ViewModelA
и FragmentB
с ViewModelB
, используемым в моем приложении.
У меня есть BottomSheetSample
, который должен использоваться как в FragmentA
, так и в FragmentB
, поскольку нижний лист делает очень мало, например, выбирая значение, которое я хочу поделиться ViewModel фрагмента, на котором отображается нижний лист вместо того, чтобы иметь отдельную ViewModel и передавать данные в ViewModel
из fragment
. Я привязываю ViewModel
вот так к графу навигации.
Внутри FragmentA
private val viewModel: ViewModelA by navGraphViewModels(R.id.nav_A_graph) { viewModelFactory }
Внутри BottomSheetSample
private val viewModel: ViewModelA by navGraphViewModels(R.id.nav_A_graph) { viewModelFactory }
Я передаю ViewModel
в XML, чтобы использовать его с привязкой данных:
val binding: BottomSheetSampleBinding =
DataBindingUtil.inflate(inflater, R.layout.bottomSheet, container, false)
binding.viewModel = viewModel
образец нижнего листа XML:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="com.ui.fragmenta.ViewModelA" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.oneSelected()} />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.twoSelected()} />
</LinearLayout>
</layout>
Теперь проблема в том, что Я также должен использовать тот же нижний лист (BottomSheetSample
) в FragmentB
. Поскольку я передаю ViewModel
в XML для привязки данных, я не могу использовать тот же самый нижний лист, поскольку текущий BottomSheetSampleBinding
ожидает объект ViewModelA
.
В итоге я создаю новый BottomSheetSampleB
, который делает то же самое, что и BottomSheetSample
, и просто меняю ViewModel в новом XML на ViewModelB
:
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="viewModel"
type="com.ui.fragmentb.ViewModelB" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.oneSelected()} />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{()->viewModel.twoSelected()} />
</LinearLayout>
</layout>
Теперь, если мне нужно использовать тот же самый BottomSheet в третьем фрагменте, мне нужно скопировать BottomSheetSample и проделать все это снова. Это выглядит излишним, поскольку один и тот же нижний лист копируется снова и снова. Но я не знаю, как этого избежать. Может ли кто-нибудь подсказать мне, как это сделать?
Надеюсь, я понимаю мою проблему.