onClick с dataBinding не работает ViewModel - PullRequest
0 голосов
/ 16 января 2020

Я работаю над проектом и внедряю модель MVVM с databinding и navigation. My button на fragment, который открывается с drawer menu item, дело в том, что когда я нажимаю на кнопку, она ничего не делает, отладчик не go не входит в метод навигации, я действительно не знаю, что Я сделал не так, может кто-нибудь помочь?

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
    }


}

MYACCVIEWMODEL


class MyAccountViewModel constructor() : BaseViewModel() {

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

и в xml я реализовал

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

Я использую этот шаблон для всех моих Fragments и ViewModels, и я действительно не знаю, почему он ничего не делает, vm инициализирует. На другом drawermenu fragment у меня также есть метод onClick, и он переходит к другому фрагменту. Так что, если кто-нибудь знает решение, которое будет полезно, заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 16 января 2020

ответ был в инициализации viewModel.

метод onClick в xml находится в content_layout, который включен в frag_layout, и вместо binding.viewModel = vm мне пришлось сделать привязку. content_layout.viewModel = vm.

 private fun subscribeUi(binding: FragmentMyAccountBinding) {
        binding.contentMyAccount.viewModel = vm
    }
0 голосов
/ 16 января 2020

Вы забыли установить LifecycleOwner, возможно, это проблема.

 binding.lifecycleOwner = this
0 голосов
/ 16 января 2020

ViewModel не должен обрабатывать какую-либо навигацию, он просто получит событие от пользовательского интерфейса и передаст его контроллеру (который может быть фрагментом или действием), а последний будет обрабатывать навигацию ...

Итак, Один из способов для решения вашей проблемы заключается в следующем:

ViewModel

   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
})

Надеюсь, это поможет,

...