I am developing an android app using Jetpack library:
- Hilt
 - Navigation
 - ViewModel
 - DataBinding
 
Actually, I am familiar with MVP pattern.
I am trying to study MVVP pattern (Databinding and Jetpack ViewModel)
I have 2 fragments (A and B).
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 {
            this@AFragment.viewModel.doAction()
        }
    }
    viewModel.result.observe(viewLifecycleOwner) { result ->
        findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment(result))
    }
  }
}
And here is 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)
    }
}
It shows BFragment correctly.
But If I touch Back Button on BFragment, it still shows BFragment.
Actually, It went to back AFragment, but it comes again to BFragment.
When I touch Back Button on BFragment,
- AFragment is started again (I checked onViewCreated() is called again)
 - Below observe code is called again:
 
viewModel.result.observe(viewLifecycleOwner) { result ->
    findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment(result))
}
Why this code is called again?
And do I write code correctly?
What is the best practice?
Now, I found a solution.
In AFragment:
viewModel.result.observe(viewLifecycleOwner) { result ->
    if (result != null) {
        findNavController().navigate(AFragmentDirections.actionAFragmentToBFragment(result))
        viewModel.resetResult()
    }
}
and In AViewModel:
fun resetResult() {
    _result.postValue(null)
}
With this code, it works fine.
Yes... But I don't like this code...
It's... so weird...
I don't know what is the best practice...