美文网首页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