Привязка данных Android. Кнопка onClick не работает

#android #kotlin #android-databinding #android-architecture-components

#Android #kotlin #android-привязка данных #android-архитектура-компоненты

Вопрос:

Я застрял здесь, помогите.

У меня есть следующий код:

Фрагмент профиля:

     @AndroidEntryPoint
    class ProfileFragment : Fragment() {
        private val profileViewModel: ProfileViewModel by viewModels()
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            val binding = FragmentProfileBinding.inflate(inflater, container, false)
            binding.viewModel = profileViewModel
            binding.lifecycleOwner = viewLifecycleOwner
    
            return binding.root
        }
    }
  

ProfileViewModel:

 class ProfileViewModel @ViewModelInject constructor(
    @ApplicationContext private val context: Context,
    private val profileRepository: ProfileRepository
) : ViewModel() {

   fun getUser() {
     ....
   } 
}
  

fragment_profile.xml:

  <data>

    <variable
        name="viewModel"
        type="my.app.viewmodel.ProfileViewModel" />

</data>

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:layout_width="match_parent"
            android:layout_height="55dp"
            android:onClick="@{()->viewModel.getUser()}" />

</LinearLayout>
  

Проблема в том, что onClick никогда не срабатывает, независимо от того, что я делаю и как я пытаюсь.
Однако, как только я делаю это так ProfileFragment , он работает просто отлично:

 binding.myButton.setOnClickListener {
   profileViewModel.getUser()
}
  

Есть идеи? Потому что я застрял здесь

Комментарии:

1. Я думаю, что ваша проблема связана с этой строкой: private val profileViewModel: ProfileViewModel by viewModels() . поскольку вы параметризовали конструктор для модели представления, фрагмент не может сохранить этот экземпляр для вас, потому что вы, возможно, не предоставляете ViewModelProvider.Factory его. Не уверен в вашем базовом DI.

2. @JeelVankhede к сожалению, то, что вы описали, не связано с моей проблемой.

Ответ №1:

Я не уверен, что эта проблема все еще существует или нет, но если вы используете привязку данных и hilt для внедрения зависимостей, пожалуйста, добавьте строки ниже в свой фрагмент onViewCreated

 binding.lifecycleOwner = this
binding.viewModel = profileViewModel
  

Ответ №2:

Что исправило эту проблему для меня, так это добавление ссылки на фрагмент к самому себе в onCreateView:

 binding.<fragment_name> = this
  

Вот так:

 override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        Log.v(TAG, "onCreateView")
        binding = FragmentSettingsBinding.inflate(inflater, container, false)        
        binding.settingsFragment = this  <---
        binding.lifecycleOwner = viewLifecycleOwner
        return binding.root
}