Я работаю с архитектурой MVVM.
Код
Когда я нажимаю кнопку, запускается метод orderAction. Он просто публикует перечисление (будет добавлена дальнейшая логика).
Модель представления
class DashboardUserViewModel(application: Application) : SessionViewModel(application) {
enum class Action {
QRCODE,
ORDER,
TOILETTE
}
val action: LiveData<Action>
get() = mutableAction
private val mutableAction = MutableLiveData<Action>()
init {
}
fun orderAction() {
viewModelScope.launch(Dispatchers.IO) {
// Some queries before the postValue
mutableAction.postValue(Action.QRCODE)
}
}
}
Фрагмент наблюдает за объектом LiveData и вызывает метод, открывающий новый фрагмент. Здесь я использую навигатор, но не думаю, что подробности о нем полезны в данном контексте. Обратите внимание, что я использую viewLifecycleOwner.
Фрагмент
class DashboardFragment : Fragment() {
lateinit var binding: FragmentDashboardBinding
private val viewModel: DashboardUserViewModel by lazy {
ViewModelProvider(this).get(DashboardUserViewModel::class.java)
}
private val observer = Observer<DashboardUserViewModel.Action> {
// Tried but I would like to have a more elegant solution
//if (viewLifecycleOwner.lifecycle.currentState == Lifecycle.State.RESUMED)
it?.let {
when (it) {
DashboardUserViewModel.Action.QRCODE -> navigateToQRScanner()
DashboardUserViewModel.Action.ORDER -> TODO()
DashboardUserViewModel.Action.TOILETTE -> TODO()
}
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentDashboardBinding.inflate(inflater, container, false)
binding.viewModel = viewModel
binding.lifecycleOwner = this
viewModel.action.observe(viewLifecycleOwner, observer)
// Tried but still having the issue
//viewModel.action.reObserve(viewLifecycleOwner, observer)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
// Tried but still having the issue
//viewModel.action.removeObserver(observer)
}
private fun navigateToQRScanner() {
log("START QR SCANNER")
findNavController().navigate(LoginFragmentDirections.actionLoginToPrivacy())
}
}
Проблема
Когда я закрываю открытый фрагмент (используя findNavController().navigateUp()), немедленно вызывается Observe.onChanged из DashboardFragment, и фрагмент снова открывается.
Я уже проверил этот вопрос и попытался все предлагаемые решения в упомянутой ссылке (как вы можно увидеть в закомментированном коде). Сработало только это решение, но оно не очень элегантно и заставляет меня каждый раз выполнять эту проверку.
Хотелось бы попробовать более солидное и оптимальное решение.
Имейте в виду, что в этом потоке не было реализации жизненного цикла.