将 Fragments/Bottomsheets 与 viewModel 重用为数据绑定变量

Reusing Fragments/Bottomsheets with viewModel as data binding variable

我举个例子,方便说明我的问题。

考虑在我的应用中使用 FragmentAViewModelA 以及 FragmentBViewModelB

我有一个 BottomSheetSample 用于 FragmentAFragmentB 因为底部 sheet 做的很少,比如选择我想要的值共享显示底部 sheet 的片段的 ViewModel,而不是使用单独的 ViewModel 并将数据传输到 fragmentViewModel。我将这样的 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

样本底部 sheet 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>

现在的问题是我还必须在 FragmentB 中使用相同的底部 Sheet(BottomSheetSample)。由于我将 ViewModel 传递给 XML 以进行数据绑定,因此我无法使用与当前 BottomSheetSampleBinding 期望对象 [=] 相同的底部 sheet 17=]。

所以我最终做的是创建一个新的 BottomSheetSampleB,它做的事情与 BottomSheetSample 完全相同,只需将新的 XML 中的 ViewModel 更改为 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 并再次执行整个操作。这看起来是多余的,因为同一个底部 sheet 被一次又一次地复制。但我不知道如何避免这样做。谁能告诉我正确的方法吗?

希望我清楚我的问题。

创建一个 BaseViewModel(任何名称)并将底部 sheet 所需的所有内容保留在 BaseViewModel 中。在底部使用这个 BaseViewModel Sheet

<layout>

    <data>

        <variable
            name="viewModel"
            type="com.ui.fragmentb.BaseViewModel" />
    </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>

BaseViewModel

扩展您的 ViewModelA,ViewModelB