Я разрабатываю приложение для Android, используя библиотеку Jetpack:
- Рукоять
- Навигация
- ViewModel
- привязка данных
На самом деле, я знаком с шаблоном MVP.
Я пытаюсь изучить шаблон MVVP (Databinding и Jetpack ViewModel)
У меня есть 2 фрагмента (А и Б).
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
@AndroidEntryPoint
class AFragment {
private val viewModel: AViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.viewModel = viewModel
with(binding) {
button.setOnClickListener {
[email protected]()
}
}
viewModel.result.observe(viewLifecycleOwner) { result ->
findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment(result))
}
}
}
А вот и AViewModel:
@HiltViewModel
class AViewModel @Inject constructor(): ViewModel() {
private val _result: MutableLiveData<Int> = MutableLiveData()
val result: LiveData<Int>
get() = _result
fun doAction() {
_result.postValue(SOME_ACTION_RESULT)
}
}
Он правильно показывает BFragment. Но если я коснусь Back Button
на BFragment, он все равно покажет BFragment. На самом деле, он вернулся к AFragment, но снова возвращается к BFragment.
Когда я касаюсь Back Button
на BFragment,
- AFragment снова запускается (я проверил, что onViewCreated() снова вызывается)
- Ниже код наблюдения вызывается снова:
viewModel.result.observe(viewLifecycleOwner) { result ->
findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment(result))
}
Почему этот код вызывается снова?
И правильно ли я пишу код?
Какова наилучшая практика?
Теперь я нашел решение.
Во фрагменте:
viewModel.result.observe(viewLifecycleOwner) { result ->
if (result != null) {
findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment(result))
viewModel.resetResult()
}
}
и в AViewModel:
fun resetResult() {
_result.postValue(null)
}
С этим кодом все работает.
Да... Но мне не нравится этот код...
Это... так странно...
Я не знаю, что является лучшей практикой...