Вот официальное решение, предложенное Яном Лейком в видео по навигации от 23 июля 2020 г. на Android Developers канал YouTube. Решение основано на версии 2.3, которая представила возможность вернуть результат в предыдущий пункт назначения.
В нашем случае фрагмент входа в систему возвращает LOGIN_SUCCESSFUL
состояние предыдущему месту назначения, это может быть фрагмент профиля или любой другой фрагмент, требующий входа в систему.
class LoginFragment : Fragment(R.layout.login) {
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val navController = findNavController()
val savedStateHandle = navController.previousBackStackEntry?.savedStateHandle
?: throw IllegalStateException("the login fragment must not be a start destination")
savedStateHandle.set(LOGIN_SUCCESSFUL, false)
// Hook up your UI, ask for login
userRepository.addLoginSuccessListener {
savedStateHandle.set(LOGIN_SUCCESSFUL, true)
navController.popBackStack()
}
}
}
Фрагмент профиля подписывается на состояние LOGIN_SUCCESSFUL
и обрабатывает его. Обратите внимание, что лямбда-выражение наблюдателя не будет вызываться до тех пор, пока фрагмент входа в систему не поместит результат и не вернется обратно к фрагменту профиля.
class ProfileFragment : Fragment(R.layout.profile) {
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val navController = findNavController()
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
userRepository.userFlow.collect { user ->
if (user == null) {
navController.navigate(R.id.login)
}
}
}
val savedStateHandle = navController.currentBackStackEntry?.savedStateHandle
?: throw IllegalStateException()
savedStateHandle.getLiveData<Boolean>(LOGIN_SUCCESSFUL)
.observe(viewLifecycleOwner) { success ->
if (!success) {
// do whathever we want, just for an example go to
// the start destination which doesn't require login
val startDestination = navController.graph.startDestination
navController.navigate(startDestination, navOptions {
popUpTo(startDestination {
inclusive = true
})
})
}
}
}
}
person
Valeriy Katkov
schedule
04.11.2020