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) {
....
}
}
我有一个具有 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) {
....
}
}