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
}