Повторное использование фрагментов / нижних листов с viewModel в качестве переменной привязки данных - PullRequest
4 голосов
/ 30 мая 2020

Я приведу пример, чтобы легко объяснить мою проблему.

Рассмотрим 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 и проделать все это снова. Это выглядит излишним, поскольку один и тот же нижний лист копируется снова и снова. Но я не знаю, как этого избежать. Может ли кто-нибудь подсказать мне, как это сделать?

Надеюсь, я понимаю мою проблему.

...