MΓ³dulo 6 Β· Engenharia de Software Β· ES06 Β· Aula 6 de 10
FrontEnd Mobile
Arquitetura MVVM com React Native
View ⇄ ViewModel β†’ Model Β· hooks como ViewModels Β· do app Γ  API de recomendaΓ§Γ£o
πŸ“± React Native
πŸ›οΈ MVVM
πŸͺ Custom Hooks
πŸ“‘ fetch + offline
πŸ› οΈ Hands-on em sala
DAILY Β· 15 MIN
15:00
πŸ“± 1 app mobile que uso e admiro
πŸ›οΈ 1 problema do MVC que MVVM resolve
πŸͺ 1 dΓΊvida sobre custom hooks
🀝 Preciso de ajuda?
Cada aluno em 1 minuto Β· comeΓ§amos em ordem alfabΓ©tica
Autoestudos Β· PrΓ©-aula πŸ“š
3 tarefas para chegar pronto + leituras sugeridas
πŸ“–
Tarefa 1 Β· Leitura
Material da Aula 6
Leitura completa do material. Saia com o vocabulΓ‘rio do dia: View, ViewModel, Model, binding, custom hook.
πŸ“– Material da aula
βš™οΈ
Tarefa 2 Β· Setup
Expo Go + projeto React Native
Instale o Expo Go no celular e crie um projeto vazio com npx create-expo-app. Rode no celular antes da aula.
πŸ“± Expo Go
πŸ§ͺ
Tarefa 3 Β· Pesquisa
React Native Β· 5 componentes core
Estude View, Text, FlatList, TouchableOpacity, ActivityIndicator nos docs oficiais.
Abrir docs β†—

πŸ“š Leituras sugeridas

πŸ“Œ Material de chegada: Expo Go instalado + projeto rodando no celular + 1 dΓΊvida sobre custom hooks. Esses 3 itens alimentam o daily de abertura.

Agenda da Aula
2 horas Β· teoria + live coding TSX + atividade prΓ‘tica em sala (sem ponderada)
⏱️ 40 min
TEORIA + LIVE CODING

πŸ“± React Native + MVVM em hooks

Mobile-first, RN em 1 slide, padrΓ£o MVVM e a anatomia Model / ViewModel / View em TypeScript real.

  • Por que mobile-first em recomendaΓ§Γ£o
  • MVVM vs MVC Β· binding bidirecional
  • Custom hook como ViewModel
  • Estado, navegaΓ§Γ£o, performance
⏱️ 1h05
PRÁTICA · INDIVIDUAL · MR

πŸ§±β†’πŸ§© Refatorar para MVVM

Receber um componente "tudo num arquivo" e separar em Model + useEspetaculosViewModel + EspetaculosScreen. MR individual.

  • Branch feat/espetaculos-mvvm
  • Separar fetch (Model), estado (ViewModel), UI (View)
  • View sem fetch nem useEffect
  • Diff + "o que ficou testΓ‘vel?" no MR

🎯 SaΓ­da do dia: MR individual com o refactor nos 3 arquivos (model, viewmodel, view) + 1 frase sobre o que ficou testΓ‘vel. Sem ponderada hoje β€” prepara o terreno pro TDD da aula 7.

Por que mobile-first em recomendaΓ§Γ£o πŸ“±
Contexto de uso do espetΓ‘culo Β· sessΓ£o curta Β· em movimento Β· push notification

🧭 Contexto de uso favorece mobile

  • Em movimento: usuΓ‘rio decide a saΓ­da no metrΓ΄, na fila do cafΓ©.
  • SessΓ£o curta: 30s a 2min β€” interface tem que ser rΓ‘pida.
  • Push notification: recomendaΓ§Γ£o proativa (novo espetΓ‘culo, desconto).
  • GeolocalizaΓ§Γ£o: "espetΓ‘culos perto de mim hoje Γ  noite".
  • CΓ’mera + leitor de QR: ingresso digital na entrada.

⚠️ Limitaçáes que mudam a arquitetura

  • Bateria: evitar polling agressivo, usar push.
  • Rede instΓ‘vel: cache offline obrigatΓ³rio (TanStack Query, AsyncStorage).
  • Tela pequena: hierarquia forte, scroll vertical, top-K curto.
  • RAM/CPU limitados: FlatList virtualizada, imagens otimizadas.
  • VersΓ£o de SO fragmentada: testar em iOS + Android antigos.
~88%
trΓ‘fego mobile
Em e-commerce de eventos no Brasil (Statista 2024).
3s
tempo atΓ© abandono
Se a primeira tela demora > 3s para responder.
10Γ—
push vs e-mail
Taxa de abertura aproximada (relatΓ³rios de mercado).
React Native em 1 slide βš›οΈ
JS rodando em runtime nativo Β· bridge JSI Β· componentes nativos reais

🧠 O que é

Framework do Meta para construir apps mobile iOS e Android com JavaScript/TypeScript. Os componentes (<View>, <Text>) sΓ£o traduzidos em componentes nativos (UIView, android.view.View) β€” nΓ£o sΓ£o WebView.

πŸŒ‰ Arquitetura: bridge antiga β†’ JSI

  • Antiga (bridge): JS ⇄ JSON serializado ⇄ nativo. Lento.
  • Nova (JSI Β· 2024+): JS chama C++ direto via JavaScript Interface. Sem serializaΓ§Γ£o.
  • Hermes: motor JS otimizado para mobile (startup menor).
  • Fabric + Turbo Modules: renderizaΓ§Γ£o e mΓ³dulos sob a JSI.

πŸ†š RN vs Flutter β€” diferenΓ§a em 1 linha

RN usa os componentes nativos do SO (UIButton, Material). Flutter desenha tudo num canvas prΓ³prio (Skia) β€” visual 100% controlado, mas sem look-and-feel nativo automΓ‘tico.

MVVM Β· O padrΓ£o arquitetural πŸ›οΈ
View ⇄ ViewModel β†’ Model Β· binding bidirecional Β· View nΓ£o conhece o Model
View

O que o usuΓ‘rio vΓͺ

Componente puro de UI. NΓ£o tem lΓ³gica de negΓ³cio. Renderiza estado e dispara eventos.

  • JSX / TSX
  • NΓ£o conhece o Model
  • Reage a mudanΓ§as do VM
ViewModel

Estado + aΓ§Γ΅es da tela

MantΓ©m o estado da View, chama o Model, expΓ΅e aΓ§Γ΅es. Sem JSX. Em React: um custom hook.

  • useState / useReducer
  • Faz orquestraΓ§Γ£o
  • TestΓ‘vel sem UI
Model

Dados + regras de domΓ­nio

Tipos, validaΓ§Γ£o, fetch da API. NΓ£o conhece a View nem o ViewModel. ReusΓ‘vel em qualquer tela.

  • type / interface
  • fetch / axios
  • Camada de domΓ­nio

πŸ†š MVVM vs MVC

No MVC clΓ‘ssico a Controller orquestra tudo e a View conhece o Model. No MVVM a ViewModel isola β€” a View sΓ³ sabe falar com o VM. Reduz acoplamento, ganha testabilidade.

πŸ” Binding bidirecional

View β†’ VM: input do usuΓ‘rio muda estado (ex.: digitou no campo). VM β†’ View: estado novo re-renderiza a UI. Em React isso Γ© o ciclo natural de useState + re-render.

Implementação · Model 🧩
Tipo de domΓ­nio + funΓ§Γ£o de fetch Β· sem React, sem UI
ImplementaΓ§Γ£o Β· ViewModel (custom hook) πŸͺ
MantΓ©m estado, chama o Model, expΓ΅e aΓ§Γ΅es Β· sem JSX
ImplementaΓ§Γ£o Β· View (componente RN) πŸ“±
Consome o hook Β· sΓ³ renderiza Β· sem fetch, sem state local de domΓ­nio
Estado, navegaΓ§Γ£o e cache πŸ—‚οΈ
As 3 decisΓ΅es que toda tela mobile resolve antes de virar produΓ§Γ£o

🧠 Estado · do local ao global

  • useState Β· estado local simples
  • useReducer Β· transiΓ§Γ΅es complexas
  • Context Β· estado de tela compartilhado
  • Zustand Β· global leve (sem boilerplate)
  • Redux Toolkit Β· time-travel, devtools

🧭 Navegação · React Navigation

  • Stack: push/pop entre telas
  • Tab: abas inferiores
  • Drawer: menu lateral
  • Deep linking aventura://espetaculo/42
  • Tipagem com RootStackParamList

πŸ’Ύ Cache + offline

  • AsyncStorage Β· key-value local
  • TanStack Query Β· cache + refetch + retry
  • SWR Β· stale-while-revalidate
  • NetInfo para detectar offline
  • EstratΓ©gia: stale-cache + revalidate

πŸ“Œ Regra de bolso: comece com useState dentro do hook ViewModel. Promova para Zustand quando 2+ telas compartilharem o mesmo estado. NΓ£o use Redux sΓ³ porque Γ© famoso.

Hands-on Β· Refatorar para MVVM πŸ§±β†’πŸ§©
Receber um componente "tudo num arquivo sΓ³" e separar nas 3 camadas β€” sem montar UI nova, sem escrever teste

🎯 Sua missão

Quebre o arquivo ao lado nas 3 camadas que vocΓͺ viu nos slides 8–10:

  • model/Espetaculo.ts β€” tipo + fetchEspetaculos()
  • viewmodels/useEspetaculosViewModel.ts β€” items, loading, error, reload
  • views/EspetaculosScreen.tsx β€” sΓ³ consome o hook

Regra: a View nΓ£o pode ter fetch nem useEffect. Pode usar IA pra acelerar.

🧩 Abrir pΓ‘gina do desafio (cΓ³digo + setup) β†—

πŸ“¦ Entrega Β· MR individual

  • Branch feat/espetaculos-mvvm
  • Diff do refactor (3 arquivos)
  • 1 frase: "o que ficou testΓ‘vel agora?"

πŸ”— Ponte pra aula 7: o ViewModel que vocΓͺ isolou hoje Γ© exatamente o que vamos testar com TDD na prΓ³xima aula β€” sem montar a UI. Hoje vocΓͺ o tornou testΓ‘vel; lΓ‘ escrevemos os testes.

🎯
A aula 6 me ensinou que...
MVVM nΓ£o Γ© cerimΓ΄nia: Γ© separar dados, estado e UI em arquivos diferentes. Na aula 7 entramos em OO + TDD β€” escrever os testes antes de o ViewModel existir.
βœ… Mobile-first em recomendaΓ§Γ£o
βœ… React Native via JSI
βœ… MVVM Β· 3 camadas
βœ… Custom hook = ViewModel
βœ… Model puro, sem React
βœ… View consome sΓ³ o hook
βœ… FlatList + estados
βœ… Cache offline
βœ… Ponte para TDD Β· aula 7
MΓ³dulo 6 Β· Engenharia de Software Β· Aula 6 de 10 Β· 25/05/2026