Кнопка возврата в архитектуре MVVM в Android - PullRequest
0 голосов
/ 15 октября 2019

У меня есть два фрагмента A & B, настроенных с помощью компонента навигации Android. Фрагмент A содержит представление recycler, в котором при щелчке элемента будет переход к фрагменту B.

Проблема заключается в том, что, когда я нажимаю кнопку вверх / назад внутри фрагмента B, он не возвращается к фрагменту A, а перезагружает фрагмент Aи B. Я до сих пор вижу фрагмент B.

Во фрагменте A у меня также есть кнопка плавающего действия, которая перемещается к Fagment B, и она отлично работает.

Я также использую ViewModel + DataBinding для RecyclerView.

Вот как я реализовал навигацию: Макет для элемента Recyclerview

<layout>
<data>
    <import type="android.view.View"/>
    <variable
        name="position"
        type="java.lang.Integer" />
    <variable
        name="viewModel"
        type="SmsListViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
   ...
    android:onClick="@{() -> viewModel.onItemClick(position)}">
</androidx.constraintlayout.widget.ConstraintLayout>
<layout>

ViewModel:

private var clicked = MutableLiveData<Long>()
fun getClicked(): MutableLiveData<Long> {
    return clicked
}

fun onItemClick(index: Int) {
    val threadId = smsList.value!!.get(index).threadId
    clicked.value = threadId
}

Фрагмент A

smsListViewModel.getClicked().observe(this, Observer<Long> { clicked ->
        if (clicked != null) {
            val action = SmsListFragmentDirections.actionListSmsToConservation(clicked)
            findNavController().navigate(action)
        }
    })

И код для кнопки во Фрагменте A, которая работает: Когда я перехожу к Фрагменту B и нажимаю кнопку вверх / назад, я возвращаюсь к Фрагменту A.

floating_action_button.setOnClickListener { view ->
        view.findNavController().navigate(R.id.nav_conservation)
    }

Где проблема? Я стараюсь без класса Directions, но не помогло.

1 Ответ

0 голосов
/ 15 октября 2019

Ваш объект Viewmodel (smsListViewModel) нажал! = Null. Он перезагружается с этим свойством и снова вызывается Observer. Сделайте что-нибудь вроде:

smsListViewModel.getClicked().observe(this, Observer<Long> { clicked ->
    if (clicked != null) {
        val action = SmsListFragmentDirections.actionListSmsToConservation(clicked)
        smsListViewModel.setClicked(null)
        findNavController().navigate(action)
    }
})

Возможно, вам понадобится

fun setClicked(value: Int?){
  clicked.value = value
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...