Android viewmodel转换映射不工作
我看到一个按钮- 我的视图代码-Android viewmodel转换映射不工作,android,kotlin,android-livedata,Android,Kotlin,Android Livedata,我看到一个按钮- 我的视图代码- private val viewModel: MyViewModel by viewModel() override fun onCreateView(...): View? { //Button click view.getMyData.setOnClickListener { viewModel.onGetDataClicked.observe(this, Observer {
private val viewModel: MyViewModel by viewModel()
override fun onCreateView(...): View? {
//Button click
view.getMyData.setOnClickListener {
viewModel.onGetDataClicked.observe(this, Observer {
view?.progressBar?.isVisible = it.loading
view?.description?.text = it.data.value
})
}
return view
}
我的视图模型代码-
val viewState = MyViewState()
val onGetDataClicked =
Transformations.map(myDomain.getData(MyAction.GetMyDataAction)) {
when (it) {
is MyResult.Loading -> viewState.copy(loading = true, error = null)
is MyResult.Success -> viewState.copy(
loading = false,
data = it.data,
error = null
)
is MyResult.Error -> viewState.copy(
loading = false,
error = it.error
)
else -> viewState.copy(loading = false)
}
}
以下是MyViewState()的代码-
当我打开应用程序并单击按钮时,调用转到viewmodel,然后从那里转到domain,然后我观察我的数据。但在第二次单击按钮时,viewmodel根本不会从我的视图中调用。可能是什么问题?在您的
视图.getMyData.setOnClickListener
中,您只观察了视图模型。OnGetDataClicks单击了
,没有触发对myDomain.getData
的新调用。你需要一种方法来触发你的域功能每用户点击
override fun onCreateView(...): View? {
onGetDataClicked.observe(this, Observer {
view?.progressBar?.isVisible = it.loading
view?.description?.text = it.data.value
})
view.getMyData.setOnClickListener {
getDataFromDomain()
}
return view
}
val onGetDataClicked = MediatorLiveData<MyViewState>()
fun getDataFromDomain(){
onGetDataClicked.addSource(myDomain.getData(MyAction.GetMyDataAction)){
when (it) {
is MyResult.Loading -> viewState.copy(loading = true, error = null)
is MyResult.Success -> viewState.copy(
loading = false,
data = it.data,
error = null
)
is MyResult.Error -> viewState.copy(
loading = false,
error = it.error
)
else -> viewState.copy(loading = false)
}
}
)
}
问题是如果你没有在你的实时数据上注册任何观察者,它将不会触发。因此,您无法在viewModel上调试或查看它。但它正在使用MediaLiveData…我想使用Transformations.map。此外,它在第一次点击时工作。当我做第二次点击时,它不起作用。我很确定它应该在多次点击时起作用。你测试过了吗?
override fun onCreateView(...): View? {
onGetDataClicked.observe(this, Observer {
view?.progressBar?.isVisible = it.loading
view?.description?.text = it.data.value
})
view.getMyData.setOnClickListener {
getDataFromDomain()
}
return view
}
val onGetDataClicked = MediatorLiveData<MyViewState>()
fun getDataFromDomain(){
onGetDataClicked.addSource(myDomain.getData(MyAction.GetMyDataAction)){
when (it) {
is MyResult.Loading -> viewState.copy(loading = true, error = null)
is MyResult.Success -> viewState.copy(
loading = false,
data = it.data,
error = null
)
is MyResult.Error -> viewState.copy(
loading = false,
error = it.error
)
else -> viewState.copy(loading = false)
}
}
)
}
val clickLiveData = MutableLiveData<Any>()
val dataFromDomainLiveData = Transformations.switchMap(clickLiveData){
Transformations.map(myDomain.getData(MyAction.GetMyDataAction)) {
when (it) {
is MyResult.Loading -> viewState.copy(loading = true, error = null)
is MyResult.Success -> viewState.copy(
loading = false,
data = it.data,
error = null
)
is MyResult.Error -> viewState.copy(
loading = false,
error = it.error
)
else -> viewState.copy(loading = false)
}
}
}
override fun onCreateView(...): View? {
view.getMyData.setOnClickListener {
clickLiveData.value = Any()
}
viewModel.dataFromDomainLiveData.observe(this, Observer {
view?.progressBar?.isVisible = it.loading
view?.description?.text = it.data.value
})
return view
}