Как реализовать условную навигацию в компонентах архитектуры навигации
Как реализовать условную навигацию в новом компоненте архитектуры навигации?
В настоящее время у меня есть одно действие с LoginFragment и HomeFragment. Основываясь на определенном login_flag, я использовал для вызова любого фрагмента из MainActivity. Поскольку LoginFragment вызывается только один раз, я установил startDestination в HomeFragment, и навигация загружает этот HomeFragment. Есть ли способ проверить флажок login_flag, прежде чем навигация загружает HomeFragment.
3 ответа
Вот как я справляюсь с условной навигацией:
- Установить HomeFragment в качестве начального пункта назначения
Создать глобальное действие для LoginFragment
<action android:id="@+id/action_global_loginFragment" app:destination="@id/loginFragment" app:launchSingleTop="false" app:popUpTo="@+id/nav_graph" app:popUpToInclusive="true" />
Выполнить условную навигацию внутри
onViewCreated
:// HomeFragment.kt override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if(!appAuth.isAuthenticated()) { view.findNavController().navigate(R.id.action_global_loginFragment) } }
Вы можете добавить прослушиватель навигации внутри своей деятельности и оттуда перейти к LoginFragment в зависимости от ваших условий, например:
findNavController(nav_host_fragment).addOnNavigatedListener { controller, destination ->
when(destination.id) {
R.id.HomeFragment-> {
if(someCondition) {
//Navigate to LoginFragment
}
}
}
Хочу добавить, что для этого есть на сайте developer.android.comкодовая лаборатория .
Во всех требуемых фрагментах вы определяете "next_action" (идентификаторы, очевидно, не обязательно должны быть уникальными) следующим образом:
<action
android:id="@+id/next_action"
app:popUpTo="@id/home_dest">
</action>
Затем, условно, вы можете установить onClickListeners в своем коде:
view.findViewById<Button>(R.id.navigate_action_button)?.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.next_action, null)
)