entregas_app/docs/CORRECAO_NAVEGACAO_CHECKOUT...

5.1 KiB

Correção da Navegação para CheckoutScreen

🚨 Problema Identificado

O botão "Sincronizar Dados" no ProfileScreen.tsx estava tentando navegar para uma tela chamada "CheckoutScreen", mas essa tela não estava registrada no navegador com esse nome.

Erro Encontrado:

ERROR  The action 'NAVIGATE' with payload {"name":"CheckoutScreen"} was not handled by any navigator.
Do you have a screen named 'CheckoutScreen'?

Causa Raiz:

A CheckoutScreen está registrada no DeliveriesStack com o nome "Checkout", não "CheckoutScreen".

🔍 Análise da Estrutura de Navegação

Estrutura Atual:

// src/navigation/index.tsx
const DeliveriesNavigator = () => {
  return (
    <DeliveriesStack.Navigator>
      <DeliveriesStack.Screen name="DeliveriesList" component={DeliveriesScreen} />
      <DeliveriesStack.Screen name="DeliveryDetail" component={DeliveryDetailScreen} />
      <DeliveriesStack.Screen name="CompleteDelivery" component={CompleteDeliveryScreen} />
      <DeliveriesStack.Screen name="RescheduleDelivery" component={RescheduleDeliveryScreen} />
      <DeliveriesStack.Screen name="DeliverySuccess" component={DeliverySuccess} />
      <DeliveriesStack.Screen name="Checkout" component={CheckoutScreen} /> // ← Nome correto
    </DeliveriesStack.Navigator>
  )
}

const TabNavigator = () => {
  return (
    <Tab.Navigator>
      <Tab.Screen name="Home" component={HomeScreen} />
      <Tab.Screen name="Routes" component={RoutesScreen} />
      <Tab.Screen name="DeliveriesStack" component={DeliveriesNavigator} /> // ← Stack aninhado
      <Tab.Screen name="Profile" component={ProfileScreen} />
    </Tab.Navigator>
  )
}

Problema:

  • ProfileScreen está no TabNavigator
  • CheckoutScreen está no DeliveriesStack (aninhado)
  • Navegação direta "CheckoutScreen" não funciona porque a tela está em um stack aninhado

Soluções Implementadas

1. Correção da Navegação Aninhada

// ANTES (INCORRETO)
navigation.navigate("CheckoutScreen" as any)

// DEPOIS (CORRETO)
navigation.navigate("DeliveriesStack", { screen: "Checkout" })

2. Explicação da Sintaxe:

navigation.navigate("DeliveriesStack", { screen: "Checkout" })
//                    ↑                    ↑
//              Nome do Tab            Nome da tela no Stack

🎯 Como Funciona a Navegação Aninhada

Estrutura Hierárquica:

TabNavigator (Principal)
├── Home
├── Routes  
├── DeliveriesStack (Stack aninhado)
│   ├── DeliveriesList
│   ├── DeliveryDetail
│   ├── CompleteDelivery
│   ├── RescheduleDelivery
│   ├── DeliverySuccess
│   └── Checkout ← CheckoutScreen está aqui
└── Profile ← ProfileScreen está aqui

Navegação Correta:

// Para navegar de ProfileScreen para CheckoutScreen:
navigation.navigate("DeliveriesStack", { screen: "Checkout" })

// Equivale a:
// 1. Ir para o Tab "DeliveriesStack"
// 2. Dentro do Stack, ir para a tela "Checkout"

📱 Fluxo de Navegação Corrigido

1. Usuário clica "Sincronizar Dados":

  • Verifica conectividade
  • Navega para DeliveriesStackCheckout

2. CheckoutScreen é exibida:

  • Tela de sincronização carregada
  • Usuário pode escolher opções de sincronização

3. Após sincronização:

  • Usuário pode voltar para ProfileScreen
  • Estatísticas são atualizadas

🔧 Alternativas de Navegação

Opção 1: Navegação Aninhada (Implementada)

navigation.navigate("DeliveriesStack", { screen: "Checkout" })

Opção 2: Navegação Direta (Seria necessário mover a tela)

// Seria necessário mover CheckoutScreen para o TabNavigator principal
navigation.navigate("Checkout")

Opção 3: Modal (Mais complexo)

// Seria necessário configurar como modal no Stack principal
navigation.navigate("CheckoutModal")

📝 Arquivos Modificados

  • src/screens/main/ProfileScreen.tsx
    • Corrigida navegação de "CheckoutScreen" para "DeliveriesStack" com { screen: "Checkout" }

🚀 Teste

Para Verificar a Correção:

  1. Abrir ProfileScreen - tela de perfil
  2. Clicar "Sincronizar Dados" - botão azul
  3. Verificar navegação - deve ir para CheckoutScreen sem erro
  4. Confirmar funcionalidade - tela de sincronização deve carregar

Logs Esperados:

✅ Navegação bem-sucedida para CheckoutScreen
❌ Sem mais erros de "screen not found"

🔍 Debugging de Navegação

Para Verificar Telas Disponíveis:

// No console do React Navigation
console.log('Telas disponíveis:', navigation.getState().routes)

Para Verificar Stack Atual:

// Verificar qual stack está ativo
console.log('Stack atual:', navigation.getState().index)

Data: 2024-01-16
Status: Resolvido
Impacto: Navegação para CheckoutScreen funcionando corretamente via stack aninhado