CTeSP DAW · 2.º ano · 1.º semestre 2026/27 · ESTA, Universidade dos Açores
Programação para Dispositivos Móveis
13 semanas · 37 aulas · 81 horas · Seg e Qua 16:00-18:00 · Ter 08:30-10:30 · Sex 08:30-12:30 nas semanas 9, 11 e 13 · Flutter · projeto em grupo sobre uma API pública (proposta: IPMA) · um ou dois testes escritos, datas previstas 04/11 e 07/12 · avaliação · instalação · API do curso
Calendário
Cada célula é uma aula: número, hora, título com link para os slides, e o sumário. A cor indica o peso entre teoria e prática.
Mais teóricaTeoria + prática no repositórioMais prática: workshop, sprint, projetoAvaliação: teste, defesasFeriado
Panorama mobile e install party
Apresentação da unidade curricular: programa, funcionamento das aulas, projeto e avaliação. Panorama do desenvolvimento mobile: restrições próprias das apps móveis, iOS vs Android, abordagens nativa, cross-platform, híbrida e PWA. Início da instalação do ambiente de desenvolvimento (Android Studio, Git, VS Code, Flutter SDK) e criação da conta GitHub.
Como o Flutter funciona, e Dart I
Arquitetura do Flutter: framework, engine e embedder; widgets, método build e árvores de widgets, elements e render objects; hot reload e hot restart; porquê Dart. Início da prática de Dart no DartPad: variáveis e tipos, null safety e funções com parâmetros nomeados.
Dart I (continuação) e primeiro repositório no GitHub
Continuação da prática de Dart no DartPad: coleções List, Map e Set com where, map e reduce, classes e construtores, enums e switch com padrões. Primeiro repositório no GitHub: clone, commit e push a partir do VS Code.
Ciclo de vida, assincronia e Dart II
Ciclo de vida de uma aplicação móvel em Android e iOS e implicações para o programador. Modelo de execução: main thread, event loop, jank e orçamento de 16 ms por frame. Dart II: programação assíncrona com Future, async/await e Stream; tratamento de erros; serialização JSON manual; enums com valores e métodos; extensões. Verificação do ambiente: flutter doctor e telemóvel reconhecido.
Anatomia de um projeto Flutter e primeira app
Estrutura de um projeto Flutter: pastas lib, test, android, ios e web; pubspec.yaml e gestão de packages; modos de compilação debug, profile e release; ferramentas de linha de comandos e DevTools. Anatomia de uma app: main, runApp, MaterialApp, Scaffold e widgets básicos. Trabalho no repositório da aula: primeira app Tempo Açores.
UX mobile e layouts
Princípios de UX para mobile: Material 3 e Human Interface Guidelines, gestos, padrões de navegação, áreas de toque, densidade e legibilidade. Início da prática de layout em Flutter: o modelo de constraints, Row, Column, Expanded e Flexible, Stack e Positioned.
Layouts (continuação): Stack, listas e widgets próprios
Continuação da prática de layout em Flutter no ecrã de previsão da Tempo Açores: Stack e Positioned para texto sobre imagem, ListView, ListView.builder e ListView.separated, listas horizontais, GridView, e escrita e extração de widgets próprios (DayChip e IslandCard).
Implantação da República
Estado: do setState às arquiteturas
O que é estado numa app e onde vive: estado efémero vs estado de aplicação; comparação de abordagens setState, ChangeNotifier/Provider, BLoC e Riverpod; fluxo de dados unidirecional e imutabilidade. Prática: StatefulWidget, setState, ciclo de vida de um State, formulários com validação e pesquisa em lista.
Navegação
Navegação em aplicações móveis: pilha de ecrãs, separadores com pilhas independentes, rotas e parâmetros, botão de retroceder, deep links (introdução). Prática: Navigator push/pop com resultado, go_router com rotas e parâmetros, NavigationBar com StatefulShellRoute.
Navegação a fundo e mini-projeto
Revisão da navegação com go_router: as rotas como uma árvore, rotas filhas e parâmetros, context.push e context.go, e o StatefulShellRoute com uma pilha por separador. Mini-projeto individual avaliado: acrescentar à Tempo Açores um separador de trilhos pedestres, com lista, detalhe e os trilhos de cada ilha.
Acessibilidade e mini-projeto
Acessibilidade em aplicações móveis, a alto nível: porque é obrigatória, para quem é (deficiências permanentes, temporárias e situacionais), as quatro regras que mais contam (letra grande, leitor de ecrã, botões com nome, cor e contraste) e como se testa. Vídeo sobre acessibilidade. Continuação do mini-projeto Trilhos.
Futures, HTTP e JSON
Programação assíncrona em Dart: Future, async e await. HTTP: pedido e resposta, métodos e idempotência, códigos de estado e erros; REST, GraphQL, gRPC e WebSockets em visão geral. A API do curso: autenticação com token e endpoints; leitura da documentação Swagger e do contrato OpenAPI (operações, parâmetros, respostas, schemas e erros) e pedidos experimentados no browser; caça aos erros de um backend que não cumpre o contrato. JSON em objetos Dart com fromJson e os erros de parsing mais comuns; FutureBuilder com os estados de carregamento, erro e dados. Future e Stream.
Arquitetura por camadas e gestão de estado
Arquitetura de aplicações móveis: camadas de apresentação, domínio e dados; padrão repository; injeção de dependências; arquitetura simples vs complexa e quando escalar. Prática: separação da UI da rede com repository e ChangeNotifier, Provider e Consumer, injeção por construtor.
Resiliência: estados de UI, retry e modo caos
Resiliência em aplicações móveis: falhas de rede, offline-first, cache HTTP com ETag e Cache-Control, paginação e rate limiting. Prática: modelação dos estados de interface (loading, erro, vazio, dados), retry com backoff, pull-to-refresh e teste da app com o modo caos da API ligado.
Kickoff do projeto Tempo Açores
Metodologia de projeto mobile: MVP, backlog, definição de pronto, trabalho por pull requests e revisão entre pares. Arranque do projeto de grupo Tempo Açores: enunciado, requisitos mínimos e extras, formação de grupos, criação dos repositórios no GitHub Classroom, client-id da API e planeamento da sprint 1.
Persistência local e cache offline
Persistência de dados em mobile: preferências chave-valor, bases de dados SQLite, bases NoSQL locais, ficheiros e armazenamento seguro com Keychain e Keystore; critérios de escolha. Prática: shared_preferences para definições, base de dados local para cache de previsões com estratégia cache-first e indicação de antiguidade dos dados.
Autenticação com token e favoritos sincronizados
Autenticação em mobile: OAuth2 e OpenID Connect, JWT, tokens de acesso e refresh, sessões, biometria e sign-in com Google e Apple. Prática: obtenção do token do grupo, armazenamento seguro, cliente HTTP com Bearer e renovação em 401, favoritos sincronizados com o backend.
Segurança, performance e sprint 1
Segurança em aplicações móveis: OWASP Mobile Top 10, armazenamento de segredos, tokens e sessões, certificate pinning, permissões mínimas, ofuscação, privacidade e RGPD, App Tracking Transparency e privacy labels. Concorrência e desempenho em Flutter: isolates e compute, rebuilds e const, listas grandes, imagens e memória, consumo de bateria; ferramentas de diagnóstico no DevTools. Acompanhamento da sprint 1 do projeto.
Push notifications, review da sprint 1 e revisão para o teste 1
Notificações push: arquitetura APNs e FCM, tokens de dispositivo, payloads, permissões, notificações locais vs remotas, canais no Android, notificações silenciosas e ricas, boas práticas. Review da sprint 1 com demonstração de cada grupo, retrospetiva e planeamento da sprint 2. Revisão da matéria teórica das aulas 1 a 19 com perguntas-tipo de escolha múltipla.
Teste escrito 1
Teste escrito de escolha múltipla sobre a componente teórica das aulas 1 a 19.
Workshop: localização, mapas e permissões
Localização em mobile: fontes e precisão, consumo de bateria, localização em primeiro e segundo plano, geofencing; mapas em apps móveis: Google Maps, Apple Maps e OpenStreetMap, custos e licenças. Workshop: posição atual com geolocator e permissões, mapa com flutter_map, marcadores das localidades, localidade mais próxima.
Deep links e notificações locais
Deep links: URL schemes personalizados, Universal Links e App Links, verificação de domínio com ficheiros AASA e assetlinks, deferred deep links e campanhas. Prática: notificações locais com flutter_local_notifications para avisos meteorológicos, rotas de deep link com go_router e abertura da app num ecrã específico a partir da notificação.
Trabalho em background e sprint 2
Execução em segundo plano em mobile: WorkManager e BGTaskScheduler, restrições de bateria como Doze e App Standby, limites do iOS, background fetch, isolates em segundo plano; boas práticas. Acompanhamento da sprint 2.
Hardware e sensores, e sprint 2
Acesso a hardware em mobile: câmara e galeria, sensores de movimento, NFC (leitura e escrita de tags, emulação de cartão), Bluetooth Low Energy, biometria, vibração e haptics, widgets de ecrã inicial; permissões e limitações por plataforma. Acompanhamento da sprint 2.
Testes automatizados e CI
Testes em aplicações móveis: pirâmide de testes, testes unitários, de widget e de integração, golden tests, mocks e fakes, integração contínua. Prática: testes unitários de modelos e repositórios com mocktail, testes de widget com pumpWidget, workflow do GitHub Actions com analyze e test.
Observabilidade e review da sprint 2
Observabilidade em produção: relatórios de crashes com Crashlytics e Sentry, analytics de produto, feature flags e remote config, testes A/B, métricas como crash-free users e ANR, registo de logs. Review da sprint 2, retrospetiva e planeamento da sprint 3.
Workshop: polish de UI e primeira distribuição a testers
Distribuição de aplicações a testers: Firebase App Distribution, TestFlight e testes internos do Google Play; fluxo, limites e boas práticas. Workshop: tema claro e escuro, internacionalização pt e en, ícone e splash, build de release para Android e distribuição do APK aos colegas via Firebase App Distribution; demonstração do TestFlight.
Platform channels, plugins e API v2
Integração com código nativo: platform channels, plugins e FFI; como avaliar packages no pub.dev; versionamento de APIs e gestão de alterações incompatíveis. Prática: MethodChannel para ler o nível da bateria, e migração da app para a versão 2 da API do curso.
Lojas e monetização, e sprint 3
Lojas de aplicações e monetização: modelos de negócio, compras in-app e subscrições, regras de pagamento das lojas, publicidade, regras de revisão e motivos comuns de rejeição, ASO. Acompanhamento da sprint 3.
Tamanho, arranque e atualizações, e sprint 3
Tamanho da aplicação e tempo de arranque: app bundles, split por ABI, tree shaking, recursos e fontes, deferred loading; atualizações: OTA e code push, forced update, compatibilidade com versões antigas. Acompanhamento da sprint 3.
Build e assinatura
Compilação e assinatura de aplicações: keystore e app bundle no Android, certificados e provisioning profiles no iOS, versionamento com versionName e build number, flavors e ambientes, segredos de build. Prática: assinatura de release Android, geração do app bundle, versionamento e flavors dev e prod.
Restauração da Independência
Consolas das lojas e review da sprint 3
Google Play Console e App Store Connect: criação da ficha da app, metadata e screenshots, declarações de privacidade e segurança de dados, classificação etária, tracks de teste e produção, staged rollout, revisão e resposta a rejeições. Review da sprint 3, retrospetiva final e lista de pendentes para o freeze.
Revisão para o teste 2 e workshop de finalização
Revisão da matéria teórica das aulas 21 a 32 com perguntas-tipo. Workshop de finalização do projeto: correção de erros, polimento, README e documentação, build final assinado e distribuição via Firebase App Distribution ou TestFlight, checklist de entrega.
Teste escrito 2
Teste escrito de escolha múltipla sobre a componente teórica das aulas 21 a 32.
Imaculada Conceição
Como defender um projeto, freeze e ensaio
Como apresentar e defender um projeto técnico: estrutura de uma apresentação de 10 minutos, demonstração ao vivo no telemóvel, plano B, perguntas típicas e como responder. Freeze do projeto, sorteio da ordem das defesas e ensaio.
Apresentações e defesas (I)
Apresentação e defesa dos projetos de grupo (primeira parte): demonstração da aplicação, discussão das decisões técnicas e perguntas individuais.
Apresentações e defesas (II) e encerramento
Apresentação e defesa dos projetos de grupo (segunda parte). Balanço da unidade curricular e caminhos para quem quer continuar em mobile.
Como funciona
- Cada aula: 30 a 40 minutos de teoria sobre um tópico de mobile, depois prática no repositório da aula (
starter/com TODOs e testes,solucao/com o estado final). - Projeto: app em grupos de 2 a 3 sobre uma API pública (proposta principal: Tempo Açores, sobre a API do IPMA via API do curso), em três sprints com review em aula (02/11, 18/11, 02/12), freeze a 09/12, defesas a 14 e 16/12.
- Avaliação: projeto final em grupo com nota individual (PRs e defesa) e um ou dois testes escritos de escolha múltipla sobre a teoria, com datas previstas a 04/11 (aulas 1 a 19) e 07/12 (aulas 21 a 32), a confirmar. Pesos e rubrica em Avaliação.
- Material necessário em todas as aulas: portátil com Flutter instalado, telemóvel Android com cabo, conta GitHub.
Recursos
Documentação Flutter · Dart · DartPad · pub.dev · Material 3 · Human Interface Guidelines · API do IPMA · API do curso
Docente: Tiago Rocha. Dúvidas nas aulas, no fórum do Moodle ou por email (a indicar na primeira aula).