5.1 KiB
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
DeliveriesStack→Checkout
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" }
- Corrigida navegação de
🚀 Teste
Para Verificar a Correção:
- Abrir ProfileScreen - tela de perfil
- Clicar "Sincronizar Dados" - botão azul
- Verificar navegação - deve ir para CheckoutScreen sem erro
- 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