美文网首页Android控件使用篇Android专题
MVVM中的布局复用:viewModel传递

MVVM中的布局复用:viewModel传递

作者: 千夜零一 | 来源:发表于2021-04-19 11:46 被阅读0次

遇到问题:

MVVM模式下需要用到ViewModel加载网络请求数据拿到数据,通过DataBinding绑定数据源到布局中,但当UI布局比较复杂时,需要抽出可复用的UI组件,使用<include>标签进行布局引入,进行ui优化。
但当需要填充同一viewModel的数据源时,如果两个布局同时引入该viewModel,并不能进行数据同步,反而是用了两个互不影响的viewModel数据源,无法进行数据共享。

解决方法:

实现思路:将主布局的viewModel传递给子布局,共用一个ViewModel实例对象。

<include layout="@layout/injuries_drug_view"
    app:viewModelChild="@{viewModel}"/>

需要注意:

Activity对应的主layout文件中的viewModel对应需要被引入的文件的viewModel:activity_injuries_layout.xml

<data>
    <variable
        name="viewModel"
        type="com.chiatai.iorder.module.breedmanagement.injuries.InjuriesViewModel" />
</data>

其中:app:viewModel对应布局injuries_drug_view引入的viewModel

<data>
    <variable
        name="viewModelChild"
        type="com.chiatai.iorder.module.breedmanagement.injuries.InjuriesViewModel" />
</data>

app:viewModelChild = injuries_drug_view中引入的com.chiatai.iorder.module.breedmanagement.injuries.InjuriesViewModel的name

@{viewModel} 表明将Activity中的主layout的viewModel传递给子布局中的app:viewModel(name)。

实现目标

这样,在子布局中的ViewModel和主布局就能拿到同样的数据源,从而进行相关操作。例如:injuries_drug_view.xml中

<TextView
    android:id="@+id/chooseUseDrug"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_marginStart="12dp"
    android:background="@drawable/shape_border_gray"
    android:gravity="center_vertical"
    android:paddingLeft="12dp"
    android:text='@{!viewModel.isSelectedSymptomDesc?"请选择":viewModel.selectSymptomDesc.productName}'
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@id/useDrug"
    app:layout_constraintTop_toTopOf="parent"
    tools:text="请选择" />

相关文章

网友评论

    本文标题:MVVM中的布局复用:viewModel传递

    本文链接:https://www.haomeiwen.com/subject/tmrilltx.html