167 lines
5.1 KiB
Markdown
167 lines
5.1 KiB
Markdown
# 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:**
|
|
```typescript
|
|
// 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**
|
|
```typescript
|
|
// ANTES (INCORRETO)
|
|
navigation.navigate("CheckoutScreen" as any)
|
|
|
|
// DEPOIS (CORRETO)
|
|
navigation.navigate("DeliveriesStack", { screen: "Checkout" })
|
|
```
|
|
|
|
### **2. Explicação da Sintaxe:**
|
|
```typescript
|
|
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:**
|
|
```typescript
|
|
// 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)**
|
|
```typescript
|
|
navigation.navigate("DeliveriesStack", { screen: "Checkout" })
|
|
```
|
|
|
|
### **Opção 2: Navegação Direta (Seria necessário mover a tela)**
|
|
```typescript
|
|
// Seria necessário mover CheckoutScreen para o TabNavigator principal
|
|
navigation.navigate("Checkout")
|
|
```
|
|
|
|
### **Opção 3: Modal (Mais complexo)**
|
|
```typescript
|
|
// 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:**
|
|
```typescript
|
|
// No console do React Navigation
|
|
console.log('Telas disponíveis:', navigation.getState().routes)
|
|
```
|
|
|
|
### **Para Verificar Stack Atual:**
|
|
```typescript
|
|
// 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
|