PDM · DAW 2

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

Próxima aula a calcular…

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

Segunda
Terça
Quarta
Sexta
Semana 321 a 25 set4 aulas · 8hDart e Flutter: bases
A0116:00-18:00 · 2h

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.

A0208:30-10:30 · 2h

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.

A0316:00-18:00 · 2h

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.

A0408:30-10:30 · 2h

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.

Semana 428 set a 2 out3 aulas · 6hWidgets e layouts
A0516:00-18:00 · 2h

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.

pdm-aula-05

A0608:30-10:30 · 2h

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.

pdm-aula-06

A0716:00-18:00 · 2h

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).

pdm-aula-06

Semana 55 a 9 out2 aulas · 5hEstado e navegação
Feriado

Implantação da República

A0808:30-11:30 · 3h

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.

pdm-aula-08

A0916:00-18:00 · 2h

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.

pdm-aula-09

Semana 612 a 16 out3 aulas · 6hMini-projeto, qualidade, rede
A1016:00-18:00 · 2h

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.

pdm-aula-10

A1108:30-10:30 · 2h

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.

pdm-aula-11

A1216:00-18:00 · 2h

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.

Semana 719 a 23 out3 aulas · 6hArquitetura, resiliência · kickoff
A1316:00-18:00 · 2h

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.

pdm-aula-13

A1408:30-10:30 · 2h

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.

pdm-aula-14

A1516:00-18:00 · 2h

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.

Semana 826 a 30 out3 aulas · 6hSprint 1 · persistência, auth, segurança
A1616:00-18:00 · 2h

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.

pdm-aula-16

A1708:30-10:30 · 2h

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.

pdm-aula-17

A1816:00-18:00 · 2h

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.

Semana 92 a 6 nov3 aulas · 8hTeste 1 · sprint 2 · mapas
A1916:00-18:00 · 2h

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.

A2016:00-18:00 · 2h

Teste escrito 1

Teste escrito de escolha múltipla sobre a componente teórica das aulas 1 a 19.

A2108:30-12:30 · 4h

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.

pdm-aula-21

Semana 109 a 13 nov3 aulas · 6hSprint 2 · plataforma
A2216:00-18:00 · 2h

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.

pdm-aula-22

A2308:30-10:30 · 2h

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.

A2416:00-18:00 · 2h

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.

Semana 1116 a 20 nov3 aulas · 8hTestes, CI, distribuição
A2516:00-18:00 · 2h

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.

pdm-aula-25

A2616:00-18:00 · 2h

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.

A2708:30-12:30 · 4h

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.

pdm-aula-27

Semana 1223 a 27 nov3 aulas · 6hSprint 3 · plataforma e lojas
A2816:00-18:00 · 2h

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.

pdm-aula-28

A2908:30-10:30 · 2h

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.

A3016:00-18:00 · 2h

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.

Semana 1330 nov a 4 dez3 aulas · 8hSprint 3 · release
A3116:00-18:00 · 2h

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.

pdm-aula-31

Feriado

Restauração da Independência

A3216:30-18:30 · 2h

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.

A3308:30-12:30 · 4h

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.

Semana 147 a 11 dez2 aulas · 4hTeste 2 · freeze
A3416:00-18:00 · 2h

Teste escrito 2

Teste escrito de escolha múltipla sobre a componente teórica das aulas 21 a 32.

Feriado

Imaculada Conceição

A3516:30-18:30 · 2h

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.

Semana 1514 a 18 dez2 aulas · 4hDefesas
A3616:00-18:00 · 2h

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.

A3708:30-10:30 · 2h

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

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).