Android 将查询参数传递给视图模型

Android passing query parameter to viewmodel

我有一个具有 2 个功能的视图和视图模型 -

1) 单击视图中的按钮并获取数据。

2) 一个微调器,您可以在其中 select 一个项目并要求视图模型获取该项目的数据作为查询参数。

第一点我已经实现了-

MyView代码-

viewModel.onGetDataClicked.observe(this, Observer {
    //....
})

我的 ViewModel 代码 -

private val viewState = MyViewState()

    val onGetDataClicked =
        Transformations.map(dataDomain.getData(MyAction.GetDataAction)) {
            when (it) {
                ....
            }
        }

MyAction 代码-

sealed class MyAction : Action {
    object GetDataAction : MyAction()
}

我的问题是如何将微调器值从视图传递到视图模型?因为在视图模型中我有一个 val onGetDataClicked 而不是一个函数。

您好,您可以使用视图中的 selectedItemPosition 属性并将位置传递给 viewModel,因此您可以使用该位置映射项目。

layout.xml

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data class="FeedbackBinding">

        <variable
            name="vm"
            type="com.ec.service.ServiceViewModel" />
    </data>
            <androidx.appcompat.widget.AppCompatSpinner
                android:id="@+id/unitAET"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:selectedItemPosition="@={vm.selectedUnitPosition}"
                app:entries="@{vm.unitNames}"
                app:layout_constraintEnd_toEndOf="@+id/textView10"
                app:layout_constraintStart_toStartOf="@+id/textView10"
                app:layout_constraintTop_toBottomOf="@+id/textView10" />

        </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

selectedUnitPosition 是一个 MutableLeveData

fragment.kt

在您的片段中初始化 vm (viewModel)

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    withViewModel<ServiceViewModel>(factory) {
        binding.vm = this
    }
}

首先,您应该在视图本身中获取项目值,然后将项目值传递给 ViewModel 中所需的方法,然后从 ViewModel 传递到存储库(您从中查询数据)。

    // in view
    viewModel.onGetDataClicked(item:DataType).observe(this, Observer {
        //....
    })

    //in viewmodel
    private val viewState = MyViewState()

        val onGetDataClicked:(item:DataType) =
          Transformations.map(dataDomain.getData(MyAction.GetDataAction)) {

    //you have item here, pass it where you require
                when (it) {
                    ....
                }
            }