Suporte a várias backstacks

O componente Navigation funciona com o sistema operacional Android para manter a backstack conforme o usuário navega pelo app. Em alguns casos, pode ser útil manter várias backstacks ao mesmo tempo, com o usuário se movendo entre elas. Por exemplo, se o app incluir uma navegação na parte de baixo da tela ou uma gaveta de navegação, o suporte a várias backstacks vai permitir que os usuários alternem livremente entre os fluxos do app sem se perder.

O componente Navigation fornece APIs com suporte a várias backstacks ao salvar e restaurar o estado dos destinos no gráfico de navegação. A classe NavigationUI inclui métodos que processam tudo isso automaticamente, mas também é possível usar as APIs manualmente para personalizar a implementação.

Implementar o suporte automaticamente com a NavigationUI

A classe NavigationUI inclui APIs que salvam e restauram automaticamente o estado dos itens de menu conforme o usuário navega entre eles. Por padrão, essas APIs implementam o suporte a várias backstacks nos seguintes casos:

Essas APIs não exigem mais mudanças de código para implementar o suporte a várias backstacks e são a maneira recomendada de oferecer suporte a várias backstacks no app.

Implementar o suporte manualmente com APIs

Se os elementos fornecidos pela NavigationUI não atenderem aos seus requisitos, você vai poder usar as APIs para salvar e restaurar backstacks por uma das outras superfícies da API do componente Navigation.

No XML de navegação, os elementos <action> no gráfico de navegação podem usar o atributo app:popUpToSaveState para salvar o estado de todos os destinos que a ação abriu usando app:popUpTo. Eles também podem usar o atributo app:restoreState para restaurar qualquer estado salvo anteriormente para o destino definido no atributo app:destination.

Você pode usar esses atributos para oferecer suporte a várias backstacks. Quando uma ação de navegação precisa mover o usuário de uma backstack para outra, defina app:popUpToSaveState e app:restoreState como true no elemento <action> correspondente. Dessa forma, a ação salva o estado da backstack atual e restaura o estado da backstack de destino salvo anteriormente, se houver.

O exemplo a seguir mostra uma ação que usa esses dois atributos:

<action
  android:id=”@+id/swap_stack”
  app:destination=”@id/second_stack”
  app:restoreState=”true”
  app:popUpTo=”@id/first_stack_start_destination”
  app:popUpToSaveState=”true” />

A classe NavOptions permite que você transmita opções de navegação especiais para salvar e restaurar backstacks ao navegar usando um NavController. Isso ocorre independentemente de você criar sua instância de NavOptions usando a DSL do Kotlin ou o NavOptions.Builder:

Kotlin

// Use the navigate() method that takes a navOptions DSL Builder
navController.navigate(selectedBottomNavRoute) {
  launchSingleTop = true
  restoreState = true
  popUpTo(navController.graph.findStartDestination().id) {
    saveState = true
  }
}

Java

NavOptions navOptions = new NavOptions.Builder()
  .setLaunchSingleTop(true)
  .setRestoreState(true)
  .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(),
    false, // inclusive
    true) // saveState
  .build();
navController.navigate(selectedBottomNavId, null, navOptions);

Para saber mais sobre a transmissão de opções de navegação, consulte Aplicar NavOptions de maneira programática.

Outros recursos

Para saber mais sobre o suporte a várias backstacks no componente Navigation, consulte os seguintes recursos extras:

Postagens do blog (em inglês)

Exemplos (em inglês)