簡體   English   中英

onClick 與 dataBinding ViewModel 不起作用

[英]onClick with dataBinding an ViewModel doesn't work

我正在處理一個項目並使用databindingnavigation實現 MVVM 模型。 My button在一個用drawer menu item打開的fragment上,問題是當我點擊按鈕時它什么也不做,調試器沒有進入導航方法,我真的不知道我做錯了什么,可以有人幫忙嗎?

MYACCOUNT CLASS

class MyAccountFragment : BaseFragment() {

    private val vm: MyAccountViewModel by viewModel()


    override fun getViewModel(): BaseViewModel = vm

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = FragmentMyAccountBinding.inflate(inflater, container, false)
        context ?: return binding.root
        injectFeature()

        setToolbar(binding)
        subscribeUi(binding)

        return binding.root
    }

    /**
     * set toolbar
     * **/
    private fun setToolbar(binding: FragmentMyAccountBinding) {

        binding.appBarLayout.backClickListener = (activity as MainActivity).createOnBackClickListener()
    }

    /**
     * set ui
     * **/
    private fun subscribeUi(binding: FragmentMyAccountBinding) {
        binding.viewModel = vm
    }


}

MYACCVIEW模型


class MyAccountViewModel constructor() : BaseViewModel() {

    fun onAddRoomClick()
    {
        navigate(MyAccountFragmentDirections.actionMyAccountFragmentToAddRoomFragment())
    }
}

在 xml 中我實現了

android:onClick="@{() -> viewModel.onAddRoomClick()}"

我對我所有的FragmentsViewModels都使用這種模式,我真的不知道為什么它什么都不做,vm 初始化。 在另一個drawermenu fragment我也有 onClick 方法,它導航到另一個片段。 因此,如果有人知道有幫助的解決方案,請提前致謝。

答案是在 viewModel 的初始化中。

xml 中的 onClick 方法在包含在 fragment_layout 中的 content_layout 中,而不是 binding.viewModel = vm 我必須做 binding.content_layout.viewModel = vm。

 private fun subscribeUi(binding: FragmentMyAccountBinding) {
        binding.contentMyAccount.viewModel = vm
    }

ViewModel 不應該處理任何類型的導航,它只會從 UI 接收事件並將其傳遞給控制器​​(可能是片段或活動),后者將處理導航......

因此,解決您的問題的一種方法是執行以下操作:

視圖模型

   class MyAccountViewModel constructor() : BaseViewModel() {
private val _navigateToRoomFragEvent = MutableLiveData<Boolean>(false)
val navigateToRoomFragEvent:LiveData<Boolean>
    get()=_navigateToRoomFragEvent

fun onAddRoomClick()
{
    _navigateToRoomFragEvent.value=true
}
fun resetNavigation(){
    _navigateToRoomFragEvent.value=false
}

}

控制器(活動或片段)

**onCreate() 內部(如果是活動)**

viewModel.navigateToRoomFragEvent.observe(this,Observer{navigate->
//boolean value
if(navigate){
navController.navigate(//action)
}
viewModel.resetNavigation() //don't forget to reset the event
})

onActivityCreated(如果是片段)

viewModel.navigateToRoomFragEvent.observe(viewLifeCycleOwner,Observer{navigate->
//boolean value
if(navigate){
navController.navigate(//action)
}
viewModel.resetNavigation() //don't forget to reset the event
})

希望能幫助到你,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM