Reserva de Laboratório com React Native e Expo Snack
Reserva de Laboratório com React Native e Expo — Curso Técnico em Desenvolvimento de Sistemas
Curso Técnico · Desenvolvimento de Sistemas · Programação Mobile

Como construir um aplicativo mobile real para a escola pública usando JavaScript, sem instalar Android Studio — acessível no navegador desde o primeiro dia de aula.

Framework: React Native + Expo Linguagem: JavaScript / JSX Nível: Iniciante a intermediário Publicação: GitHub

Síntese do Artigo

Este guia apresenta a construção completa de um app Android de reserva de laboratório escolar usando React Native com Expo Snack — sem instalação de IDE, sem configuração de SDK, diretamente no navegador. O projeto é tecnicamente rigoroso, didaticamente estruturado e adequado ao currículo do Curso Técnico em Desenvolvimento de Sistemas.

Por que trocar Android Studio por Expo Snack?

Desenvolver para Android com Android Studio é tecnicamente legítimo. Mas no contexto da escola pública, enfrenta uma barreira imediata: infraestrutura. Instalação de 8 GB de SDK, emuladores que exigem virtualização ativada na BIOS, conexão de internet lenta, computadores com 4 GB de RAM. A aula começa antes mesmo de o ambiente estar pronto.

O Expo resolve esse problema estruturalmente. Com o Expo Snack, o aluno abre o navegador, acessa snack.expo.dev e já está escrevendo código React Native que roda em tempo real no celular via app Expo Go. Zero instalação. Zero configuração de ambiente. Foco imediato no que importa: a lógica do aplicativo.

Decisão de arquitetura

A substituição de Kotlin + Android Studio por JavaScript + React Native + Expo não é uma simplificação — é uma mudança de paradigma. O aluno aprende desenvolvimento mobile cross-platform, com uma linguagem de alta empregabilidade, em um ecossistema utilizado por empresas como Meta, Shopify e Microsoft.

Qual é a nova arquitetura do sistema?

A arquitetura mantém as mesmas responsabilidades funcionais da versão original, com mapeamento direto entre os componentes Android e seus equivalentes React Native.

Versão Android (original) Versão React Native + Expo Função
Android StudioExpo Snack (snack.expo.dev)Ambiente de desenvolvimento
KotlinJavaScript / JSXLinguagem de programação
Layout XMLComponentes JSX + StyleSheetInterface visual
ActivityScreen (componente React)Tela do aplicativo
MaterialCalendarViewreact-native-calendarsCalendário interativo
SharedPreferencesAsyncStorageArmazenamento local
ToastAlert.alert()Feedback ao usuário
Git localGitHub (via web ou Snack)Versionamento
Nota técnica

O Expo Snack possui integração nativa com o GitHub. O aluno pode exportar o projeto diretamente para um repositório GitHub a partir da interface do Snack, sem precisar usar a linha de comando — o que facilita a introdução ao versionamento antes de aprofundar os conceitos de Git.

Quais tecnologias compõem o projeto?

Tecnologia Função no projeto Acesso
Expo SnackIDE online, preview em tempo realsnack.expo.dev
Expo GoApp para rodar o projeto no celularPlay Store / App Store
React NativeFramework mobile cross-platformvia Expo
JavaScript (ES6+)Linguagem de programaçãonativo no Snack
react-native-calendarsComponente de calendáriovia npm no Snack
AsyncStoragePersistência local de dados@react-native-async-storage/async-storage
GitHubRepositório e portfólio do alunogithub.com

Como estruturar o projeto do início ao fim?

Passo 1 — Configurar o ambiente no Expo Snack

Nenhuma instalação é necessária. O fluxo de início é o seguinte:

1
Acessar snack.expo.dev O Snack cria automaticamente um projeto React Native com App.js, package.json e estrutura inicial pronta.
2
Instalar o Expo Go no celular Disponível gratuitamente na Play Store. O aluno escaneia o QR Code exibido no Snack e o app abre instantaneamente no celular.
3
Adicionar a biblioteca do calendário No painel de dependências do Snack, adicionar react-native-calendars. Nenhum comando npm install necessário.
4
Adicionar AsyncStorage Da mesma forma, adicionar @react-native-async-storage/async-storage nas dependências do Snack.
5
Nomear e salvar o projeto Definir o nome ReservaLaboratorio e salvar. O Snack gera uma URL pública compartilhável — útil para o professor acompanhar o progresso de cada aluno.

Passo 2 — Estrutura de componentes e interface

Em React Native, a interface é construída com componentes JavaScript, não com XML. A lógica e a apresentação coexistem no mesmo arquivo, o que reduz a fragmentação e facilita o aprendizado inicial.

JavaScript / JSX App.js
import React, { useState } from 'react';
import { View, Text, StyleSheet, FlatList, Alert } from 'react-native';
import { Calendar } from 'react-native-calendars';

export default function App() {
  const [reservas, setReservas] = useState({});
  const [dataSelecionada, setDataSelecionada] = useState(null);

  return (
    <View style={styles.container}>
      <Text style={styles.titulo}>Reserva do Laboratório</Text>

      <Calendar
        onDayPress={dia => {
          setDataSelecionada(dia.dateString);
          handleReserva(dia.dateString);
        }}
        markedDates={reservas}
        theme={{ todayTextColor: '#ff6b35' }}
      />

      <FlatList
        data={Object.entries(reservas)}
        keyExtractor={([data]) => data}
        renderItem={({ item: [data, info] }) => (
          <View style={styles.itemReserva}>
            <Text style={styles.itemData}>{data}</Text>
            <Text style={styles.itemProf}>{info.professor}</Text>
          </View>
        )}
      />
    </View>
  );
}

Passo 3 — Lógica de reserva com verificação de conflito

A função central do sistema é registrar uma reserva e impedir que duas reservas ocupem o mesmo dia. Em JavaScript, essa lógica é direta e mais legível do que o equivalente em Kotlin.

JavaScript App.js — função handleReserva
const handleReserva = (data) => {
  // Verifica se a data já possui reserva
  if (reservas[data]) {
    Alert.alert(
      'Conflito de Horário',
      `${data} já está reservado por ${reservas[data].professor}`
    );
    return;
  }

  // Solicita nome do professor via prompt nativo
  Alert.prompt(
    'Nova Reserva',
    'Nome do professor responsável:',
    (nome) => {
      if (!nome || nome.trim() === '') return;

      const novasReservas = {
        ...reservas,
        [data]: {
          marked: true,
          dotColor: '#ff6b35',
          professor: nome.trim()
        }
      };

      setReservas(novasReservas);
      salvarLocal(novasReservas); // persiste no AsyncStorage
    }
  );
};
Atenção

Alert.prompt funciona nativamente no iOS. No Android, é necessário criar um componente de modal customizado com TextInput para solicitar a entrada do usuário. Esse é um exercício didático relevante para a turma: demonstra a diferença de comportamento entre plataformas e o porquê do React Native usar abstrações cross-platform.

Passo 4 — Persistência com AsyncStorage

O AsyncStorage é o equivalente ao SharedPreferences do Android. A diferença fundamental é que as operações são assíncronas — um conceito-chave em JavaScript que os alunos precisarão dominar.

JavaScript App.js — funções de persistência
import AsyncStorage from '@react-native-async-storage/async-storage';

// Salvar reservas no armazenamento local
const salvarLocal = async (dados) => {
  try {
    const json = JSON.stringify(dados);
    await AsyncStorage.setItem('reservas', json);
  } catch (e) {
    console.error('Erro ao salvar:', e);
  }
};

// Carregar reservas ao abrir o app
const carregarLocal = async () => {
  try {
    const json = await AsyncStorage.getItem('reservas');
    if (json !== null) {
      setReservas(JSON.parse(json));
    }
  } catch (e) {
    console.error('Erro ao carregar:', e);
  }
};

// Chamar ao iniciar o componente
useEffect(() => {
  carregarLocal();
}, []);

Passo 5 — Estilização com StyleSheet

No React Native, não existe CSS. A estilização usa um objeto JavaScript que imita a sintaxe do CSS, mas com regras específicas da plataforma mobile. É uma oportunidade de conectar o conhecimento de CSS dos alunos a um novo paradigma.

JavaScript App.js — StyleSheet
const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#f9f7f4',
    paddingTop: 48,
    paddingHorizontal: 16
  },
  titulo: {
    fontSize: 22,
    fontWeight: '700',
    color: '#0f0e17',
    marginBottom: 20,
    textAlign: 'center'
  },
  itemReserva: {
    backgroundColor: '#fff',
    borderRadius: 8,
    padding: 14,
    marginTop: 10,
    flexDirection: 'row',
    justifyContent: 'space-between',
    shadowColor: '#000',
    shadowOpacity: 0.06,
    shadowRadius: 6
  },
  itemData: { fontWeight: '600', color: '#1a1a2e' },
  itemProf: { color: '#888', fontSize: 14 }
});

Como publicar o projeto no GitHub sem usar a linha de comando?

O Expo Snack oferece exportação direta para o GitHub. O processo é didaticamente importante: o aluno cria o repositório antes de entender profundamente como o Git funciona, o que reduz a barreira de entrada sem sacrificar a cultura de versionamento.

1
Criar conta no GitHub Cada aluno cria sua conta em github.com. O nome de usuário já é parte do portfólio profissional.
2
Criar repositório vazio Nome sugerido: reserva-lab-reactnative. Marcar como público. Adicionar README.
3
Exportar do Snack para GitHub No menu do Snack: Export → Export to GitHub. Autorizar o Snack a acessar a conta GitHub. Selecionar o repositório criado.
4
Verificar os arquivos no repositório O repositório terá App.js, package.json e app.json — a estrutura mínima de um projeto Expo.
5
Atualizar a cada entrega A cada evolução do projeto, o aluno re-exporta. Isso simula o comportamento de commit, preparando o terreno para o aprendizado de Git em aulas futuras.
Estratégia pedagógica

Introduzir o GitHub antes do Git é uma decisão deliberada. O aluno compreende o valor do repositório como portfólio antes de entender o mecanismo de versionamento. Quando o Git for ensinado formalmente, o repositório já existirá — o que dá contexto concreto ao aprendizado de git add, git commit e git push.

Qual é a estrutura final do projeto?

Estrutura de diretórios ReservaLaboratorio (Expo Snack)
ReservaLaboratorio/
│
├── App.js                   ← componente principal
├── app.json                 ← configuração do Expo
├── package.json             ← dependências
│
└── assets/
    └── icon.png             ← ícone do app (opcional)

Dependências principais:
├── react-native-calendars
└── @react-native-async-storage/async-storage

Como isso se aplica na rotina escolar real?

O contexto do projeto não é fictício. Laboratórios de informática, salas de maker, laboratórios de ciências — qualquer espaço compartilhado na escola sofre com o problema de sobreposição de reservas, controle por papel ou planilha desatualizada, sem visibilidade para professores de outras disciplinas.

O app que os alunos constroem resolve um problema que seus próprios professores enfrentam. Esse detalhe não é trivial: ele transforma o projeto de exercício acadêmico em produto com destinatário real. A motivação muda. A responsabilidade muda.

Caso aplicado

No laboratório de educação digital da escola, o mesmo espaço é disputado por turmas de diferentes anos e componentes. Um app de reserva desenvolvido pelos próprios alunos do curso técnico — e eventualmente instalado pelos professores da escola — fecha o ciclo entre aprendizagem técnica e impacto institucional real.

Quais são as versões evolutivas do projeto?

Versão 1
MVP funcional

Calendário, registro de reserva, persistência local com AsyncStorage.

Versão 2
Login do professor

Tela de autenticação simples. Identifica quem registrou cada reserva.

Versão 3
Múltiplos espaços

Seleção de laboratório. Calendários independentes por sala.

Versão 4
Firebase Firestore

Banco de dados em nuvem. Dados sincronizados entre dispositivos.

Versão 5
API REST + Backend

Node.js, Express, autenticação JWT. Estrutura de produto completo.

Versão 6
TCC

App + sistema web + backend + documentação técnica. Produto de curso completo.

Quais competências técnicas o projeto desenvolve?

Mobile
React Native
Linguagem
JavaScript ES6+
Conceito
Async / Await
Estado
React Hooks
Interface
JSX + StyleSheet
Dados
AsyncStorage
Portfólio
GitHub
Produto
App real para escola

Qual é o potencial estratégico desse projeto no curso técnico?

O projeto de Reserva de Laboratório tem uma característica rara em projetos didáticos: ele é ao mesmo tempo simples o suficiente para iniciantes e extensível o suficiente para se tornar um TCC de curso técnico em Desenvolvimento de Sistemas.

A escolha de React Native com Expo tem implicações que ultrapassam a sala de aula. O aluno que domina esse ecossistema pode publicar aplicativos reais na Play Store, construir portfólio técnico relevante para o mercado de trabalho e ingressar em processos seletivos com um projeto concreto para apresentar — não apenas um diploma.

Expansão estratégica

Na versão profissional, o projeto se transforma em um sistema completo: backend em Node.js com API REST, banco de dados relacional ou NoSQL, autenticação por JWT, app mobile com React Native e painel web com React. Esse conjunto é, tecnicamente, o stack de desenvolvimento full-stack mais contratado pelo mercado brasileiro atualmente. O aluno que percorre esse caminho sai do ensino médio com um produto e um stack.


Perguntas frequentes sobre o projeto

O Expo Snack funciona sem internet na escola?
Não. O Snack é uma plataforma online e requer conexão de internet para funcionar. O Expo Go no celular também precisa de rede para se conectar ao Snack. Para ambientes offline, a alternativa é instalar o Expo CLI localmente com Node.js, o que exige mais configuração de ambiente mas permite trabalho sem conexão.
O app criado no Snack pode ser instalado no celular dos professores?
Diretamente, o app roda apenas pelo Expo Go. Para gerar um APK instalável sem o Expo Go, é necessário usar o Expo EAS Build — um serviço do Expo que compila o app e gera o arquivo de instalação. Essa etapa pode ser incorporada à versão final do projeto como objetivo de entrega do TCC.
Por que usar AsyncStorage em vez de um banco de dados desde o início?
O AsyncStorage cobre o MVP funcional com complexidade técnica gerenciável para iniciantes. O conceito de persistência local deve ser dominado antes do conceito de banco de dados remoto. A progressão AsyncStorage → Firebase → API REST é uma rampa de aprendizado, não uma limitação de design.
React Native é mais difícil que Kotlin para mobile?
Para alunos sem experiência prévia, React Native com JavaScript tende a ter uma curva de entrada menor — especialmente se já tiveram contato com lógica de programação ou desenvolvimento web. Kotlin é uma linguagem mais robusta e fortemente tipada, o que gera mais segurança em projetos maiores, mas exige mais configuração de ambiente e mais conceitos iniciais.
É possível conectar este projeto ao currículo da BNCC para o ensino técnico?
Sim. O projeto desenvolve diretamente competências de pensamento computacional, resolução de problemas reais, trabalho colaborativo com versionamento e criação de produtos digitais com impacto social — todos alinhados às diretrizes do Catálogo Nacional de Cursos Técnicos (CNCT) para Desenvolvimento de Sistemas.

Construa o projeto com sua turma hoje

O código completo, a estrutura de aulas e o roadmap de versões estão documentados no blog. Acesse, adapte e aplique.

Publicado em professorcomia.com.br — POED · Laboratório de Educação Digital · Curso Técnico em Desenvolvimento de Sistemas