Navigation

Escopo: transversal. Aplica-se a qualquer linguagem ou stack do projeto.

Navigation (navegação) é o sistema que move o usuário de uma tela para outra. Em mobile ele funciona como uma pilha: cada tela nova cobre a anterior, o botão voltar remove a do topo, e o usuário espera reencontrar esse histórico quando volta ao app horas depois. O roteamento web, com uma URL trocando o conteúdo da página, funciona por outro modelo.

A estrutura de navegação comunica a hierarquia do produto: o que é principal, o que é secundário e o que é passageiro. Quando ela está confusa, o usuário se perde antes de chegar no conteúdo.

Conceitos fundamentais

ConceitoO que é
Stack (pilha de telas)Telas empilhadas; a nova tela cobre a anterior; voltar remove do topo
Tab bar (barra de abas)Navegação principal entre seções independentes; sem hierarquia entre elas
Modal (janela sobreposta)Tela que interrompe o fluxo atual; exige ação explícita para fechar
Bottom sheet (painel inferior)Painel que desliza de baixo; menos intrusivo que um modal completo
Deep link (link direto)URL ou intenção que abre o app diretamente em uma tela específica
Back stack (pilha de retorno)Histórico de telas navegadas; gerenciado pelo SO e pelo framework
Navigator (navegador)Componente responsável por gerenciar a pilha e executar transições
Route (rota)Identificador de uma tela; pode carregar parâmetros

Padrões de navegação

Stack: aprofundar o contexto

A pilha é o padrão base. Cada tela empilha sobre a anterior, e voltar remove a do topo e devolve o que estava embaixo.

Lista de produtos → Detalhe do produto → CheckoutConfirmação
                         ↑ voltar remove Checkout e restaura Detalhe

Serve para fluxos hierárquicos, onde cada toque leva o usuário mais fundo no mesmo assunto. A tela anterior continua em memória, então a volta é imediata.

Tab bar: seções que convivem lado a lado

A barra de abas organiza as seções independentes do produto. Cada aba guarda a sua própria pilha.

[Home] [Busca] [Pedidos] [Perfil]
  ↑ cada aba tem stack independente: mudar de aba não destrói o estado da anterior

Ela cabe nas seções principais do produto, em geral até 5 abas. Uma barra com oito abas divide a atenção do usuário e costuma indicar que o produto ainda não escolheu o que é principal.

Modal: interromper para decidir

O modal para o fluxo atual e pede uma resposta. O usuário fecha de propósito: deslizando para baixo, tocando em cancelar ou concluindo a ação.

Fluxo normal → Modal aberto → [Confirma / Cancela]Fluxo normal retomado

Cabe em ação destrutiva (confirmar exclusão), coleta rápida de dados (um formulário curto) e contexto que fica fora da hierarquia principal. Conteúdo que o usuário consulta o tempo todo pertence à pilha ou à barra de abas, onde ele consegue voltar sem fechar nada.

O deep link abre o app direto em uma tela específica, a partir de uma URL (Uniform Resource Locator · Localizador Uniforme de Recurso) ou de uma intenção vinda de fora. É por ele que chegam as notificações push, os e-mails e os links compartilhados.

Notificação push → deep link → app abre na tela de detalhe do pedido

Um deep link completo resolve dois cenários:

CenárioComportamento
App aberto (warm start)Navega para a tela destino mantendo o back stack existente
App fechado (cold start)Inicializa o app e reconstrói o back stack até a tela destino

O segundo cenário concentra os bugs. O usuário chega na tela de detalhe do pedido vindo de uma notificação, toca em voltar e precisa cair na lista de pedidos, com a pilha reconstruída por baixo dele. Sem isso, ele encontra uma tela vazia ou o app fecha na cara dele.

Passagem de parâmetros

Os parâmetros viajam junto com a rota quando a tela é empilhada. Existem dois padrões:

PadrãoQuando usar
Parâmetros leves na rota (ID, slug)Tela busca os dados do domínio ao montar
Objeto serializado na rotaQuando os dados já estão disponíveis e uma nova busca seria redundante

O ID na rota resiste melhor ao tempo. A tela destino busca o dado atual no domínio, e o usuário vê o preço de agora em vez do preço que estava na lista quando ele tocou no item.

Back stack e ciclo de vida

O sistema operacional e o framework cuidam da pilha de retorno. No toque em voltar, a tela do topo é destruída e a anterior volta a rodar.

Stack: [HomeListaDetalhe]
Voltar: [HomeLista]Detalhe destruída

A tela destruída devolve a memória que ocupava. As telas que continuam na pilha podem ser pausadas pelo sistema quando a memória fica curta. Vale a mesma regra do ciclo de vida: a tela anterior pode ter perdido o que tinha em memória, então restaure o estado dela ao retomar.

DoDocs v3.7.0 · Desenvolvido por @thiagocajadev · Baseado no trabalho de pmndrs/docs · Poimandres.