Table of Contents
Desenvolvimento Multiplataforma com Flutter 📱💻
Capacite-se para desenvolver aplicações de alta performance utilizando Flutter e Dart, publicando para Android, Web e Desktop a partir de uma única base de código.
Foco do Curso
Metodologia: Aprendizado prático focado na construção de aplicações do mundo real, abordando desde fundamentos da linguagem Dart até a publicação em múltiplas plataformas.
🎯 O Que Você Vai Aprender
-
:material-language-dart: Linguagem Dart --- Domine o Dart do zero: variáveis, null safety, funções e programação assíncrona orientada a objetos. Ir para Módulo 1
-
Widgets & UI/UX --- Aprenda a criar interfaces modernas e responsivas utilizando a vasta biblioteca de Widgets do Flutter. Ver Interfaces
-
Lógica e Dados --- Gerenciamento de estado profissional (Provider), consumo de APIs REST e persistência de dados local (SQLite). Ver Dados
-
Multiplataforma --- Adapte e publique seu aplicativo para Android, Web, Windows e Linux com ajustes específicos de layout. Ver Projetos
📚 Jornada de Aprendizado (16 Aulas)
O curso é estruturado em quatro módulos progressivos.
🟢 Módulo 1: Fundamentos (Aulas 01-04)
- Aula 01 - Introdução ao Desenvolvimento Multiplataforma 🌍
- Aula 02 - Linguagem Dart para Iniciantes 🎯
- Aula 03 - Estrutura de um Projeto Flutter 🏗️
- Aula 04 - Widgets: A Base de Tudo 🧱
🟡 Módulo 2: Construção de Interfaces (Aulas 05-08)
- Aula 05 - Layouts e Organização Visual 🎨
- Aula 06 - Componentes Visuais 🖼️
- Aula 07 - Navegação entre Telas 🛣️
- Aula 08 - Formulários e Validação 📝
🔵 Módulo 3: Lógica e Dados (Aulas 09-12)
- Aula 09 - Gerenciamento de Estado 🔄
- Aula 10 - Consumo de APIs REST 📡
- Aula 11 - Persistência de Dados 💾
- Aula 12 - Organização Profissional do Projeto 🏛️
🟣 Módulo 4: Multiplataforma na Prática (Aulas 13-16)
- Aula 13 - Publicando para Android 🤖
- Aula 14 - Publicando para Web 🌐
- Aula 15 - Aplicações Desktop 💻
- Aula 16 - Projeto Final Integrador 🎓
Plano de Ensino 📅
Curso: Desenvolvimento Multiplataforma com Flutter (Mobile, Web & Desktop)
Ementa
- Módulo 1: Fundamentos: Ecossistema Flutter, Linguagem Dart básica, Estrutura de Projetos e Conceito de Widgets.
- Módulo 2: Interfaces UI/UX: Layouts (Column/Row), Componentes Visuais, Navegação e Formulários.
- Módulo 3: Lógica e Dados: Gerenciamento de Estado, Consumo de APIs REST, Persistência Local e Boas Práticas.
- Módulo 4: Multiplataforma na Prática: Builds para Android, Web, Desktop e Projeto Integrador.
Cronograma (16 Aulas)
🟢 Módulo 1: Fundamentos
- Aula 01: Introdução ao Desenvolvimento Multiplataforma
- Aula 02: Linguagem Dart para Iniciantes
- Aula 03: Estrutura de um Projeto Flutter
- Aula 04: Widgets: A Base de Tudo
🟡 Módulo 2: Construção de Interfaces UI/UX
- Aula 05: Layouts e Organização Visual
- Aula 06: Componentes Visuais (Text, Button, AppBar)
- Aula 07: Navegação entre Telas e Rotas
- Aula 08: Formulários, Validação e Controllers
🔵 Módulo 3: Lógica e Dados
- Aula 09: Gerenciamento de Estado (Provider)
- Aula 10: Consumo de APIs REST (HTTP/JSON)
- Aula 11: Persistência de Dados Local (SQLite/SharedPrefs)
- Aula 12: Organização Profissional e Boas Práticas
🟣 Módulo 4: Multiplataforma na Prática
- Aula 13: Publicando para Android (Build APK)
- Aula 14: Publicando para Web (Responsividade)
- Aula 15: Aplicações Desktop (Windows/Linux/Mac)
- Aula 16: Projeto Final Integrador
Avaliação
- Exercícios: 16 listas de exercícios (Básico, Intermediário, Desafio).
- Projetos: 16 mini-projetos práticos de fixação.
- Quizzes: 16 testes de conhecimento em cada aula.
- Projeto Final: Aplicativo completo (Lista de Tarefas ou Agenda) multiplataforma.
Aulas
Aula 01 - Introdução ao Desenvolvimento Multiplataforma 🌍
Conceito
O desenvolvimento multiplataforma permite que você escreva o código uma única vez e o execute em diferentes sistemas operacionais como Android, iOS, Web e Desktop.
1. O que é desenvolvimento multiplataforma? 🤔
Historicamente, para criar um app para Android e outro para iOS, você precisava de duas equipes e dois códigos diferentes (Java/Kotlin e Objective-C/Swift). Com o Flutter, usamos uma única base de código.
📱 Diferença entre Nativo e Híbrido
-
Nativo --- Código específico para a plataforma. Performance máxima, mas custo dobrado.
-
Híbrido (WebView) --- Roda dentro de um navegador interno. Lento e com interface que parece um site.
-
Flutter (Canvas) --- Desenha cada pixel na tela. Performance próxima ao nativo e interface idêntica em tudo.
2. Ecossistema Flutter 🎨
O Flutter é o framework do Google para criar interfaces bonitas e rápidas.
📊 Estrutura de Renderização
graph TD
A[App Flutter] --> B[Framework - Dart]
B --> C[Engine - C++]
C --> D[Skia/Impeller - Graphics]
D --> E[Plataforma - Android/iOS/Web]
3. Instalação e Ambiente 🛠️
Para começar, precisamos preparar o terreno:
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 3.19.0)
[√] Windows Version (Version 10.0.19045.3930)
[√] Android toolchain - develop for Android devices
[√] VS Code (version 1.86.1)
[√] Connected device (1 available)
Dica
Sempre execute o flutter doctor para verificar se há pendências na sua instalação.
4. Mini-Projeto: Olá Flutter! 🚀
Vamos criar seu primeiro projeto pelo terminal:
- Abra o terminal.
- Digite os comandos abaixo:
5. Exercício de Fixação 🧠
- Explique com suas palavras a maior vantagem do Flutter em relação ao desenvolvimento nativo tradicional.
- Qual a função do comando
flutter doctor? - O que significa dizer que o Flutter "desenha seus próprios widgets"?
Próxima Aula: Vamos aprender a Linguagem Dart para Iniciantes! 🎯
Aula 02 - Linguagem Dart para Iniciantes 🎯
O que é Dart?
Dart é a linguagem por trás do Flutter. Criada pelo Google, ela é otimizada para interfaces rápidas, possui tipagem forte e é muito produtiva.
1. Variáveis e Tipos de Dados 📦
No Dart, tudo é um objeto. Os tipos mais comuns são:
String nome = "Flutter";
int idade = 5;
double versao = 3.19;
bool isGratis = true;
// Inferência de tipo
var cidade = "São Paulo";
2. Estruturas de Controle 🚦
Condicionais (if/else)
Repetição (for)
3. Funções e Null Safety 🧠
O Dart possui Null Safety, o que significa que variáveis não podem ser nulas por padrão, evitando erros comuns.
// ? permite que a variável seja nula
String? nomeNulavel;
void saudar(String nome) {
print("Olá, $nome!");
}
4. Diagrama de Fluxo (Mermaid) 📊
graph TD
A[Início] --> B{Valor é nulo?}
B -- Sim --> C[Erro de Compilação]
B -- Não --> D[Executar Código]
D --> E[Fim]
5. Mini-Projeto: Calculadora de IMC Simples 🚀
Crie um arquivo imc.dart e execute-o com dart run:
void main() {
double peso = 80.0;
double altura = 1.80;
double imc = peso / (altura * altura);
print("Seu IMC é: ${imc.toStringAsFixed(2)}");
}
6. Exercício de Fixação 🧠
- Crie uma variável para armazenar o nome de um aplicativo e outra para a versão (ex: 1.0).
- Escreva uma estrutura que verifique se a versão é maior ou igual a 2.0 e imprima "Versão atualizada".
- O que acontece se você tentar atribuir
nulla uma variávelint x = 10;sem o operador??
Próxima Aula: Vamos entender a Estrutura de um Projeto Flutter! 🏗️
Aula 03 - Estrutura de um Projeto Flutter 🏗️
Dica
Compreender onde cada arquivo fica é fundamental para não se perder conforme o projeto cresce.
1. Arquivos e Pastas Principais 📂
Ao criar um projeto, o Flutter gera uma estrutura padrão:
lib/: Onde mora o código Dart. 99% do seu trabalho será aqui.android/,ios/,web/: Pastas que contêm o código específico de cada plataforma para o build.pubspec.yaml: O "RG" do projeto. Aqui definimos o nome, versão, dependências e assets (imagens/fontes).test/: Onde escrevemos os testes automatizados.
2. O arquivo pubspec.yaml 📝
Este é o arquivo de configuração mais importante do seu projeto.
name: meu_projeto
description: Um novo app Flutter.
version: 1.0.0+1
dependencies:
flutter:
sdk: flutter
http: ^1.1.0 # Exemplo de dependência externa
3. O arquivo main.dart 🚀
O ponto de entrada de qualquer aplicativo é a função main().
Árvore de Widgets (Mermaid) 📊
graph TD
A[runApp] --> B[MaterialApp]
B --> C[Scaffold]
C --> D[AppBar]
C --> E[Body]
E --> F[Center]
F --> G[Text]
4. Mini-Projeto: Adicionando Dependências 🚀
- Abra o
pubspec.yaml. - Adicione a dependência
google_fonts: ^6.1.0. - Rode
flutter pub getno terminal.
5. Exercício de Fixação 🧠
- Para que serve a pasta
lib? - Qual comando usamos para baixar novas dependências listadas no
pubspec.yaml? - Qual a função principal que inicia o aplicativo no Flutter?
Próxima Aula: Vamos mergulhar nos Widgets: A Base de Tudo! 🧱
Aula 04 - Widgets: A Base de Tudo 🧱
Conceito
No Flutter, tudo é um Widget. Um botão é um widget, uma cor é um widget, o próprio aplicativo é um widget.
1. O que são Widgets? 🤔
Widgets são as peças de Lego da interface. Existem dois tipos principais que você usará o tempo todo:
⚪ StatelessWidget (Estático)
Não muda de estado. Exemplo: Um texto fixo ou um ícone.
🔴 StatefulWidget (Dinâmico)
Pode mudar conforme a interação do usuário. Exemplo: Um contador ou uma caixa de checkout.
2. Árvore de Widgets 🌳
A interface do Flutter é organizada de forma hierárquica.
graph TD
A[MaterialApp] --> B[Scaffold]
B --> C[AppBar]
B --> D[Center]
D --> E[Column]
E --> F[Text]
E --> G[Icon]
3. Hot Reload: O Super Poder do Flutter ⚡
Diferente do desenvolvimento tradicional onde você precisa recompilar tudo para ver uma mudança, o Flutter tem o Hot Reload. Você salva o arquivo e a mudança aparece instantaneamente no emulador.
4. Estrutura Material Design 🎨
O Flutter já vem com o sistema de design do Google (Material) pronto para usar.
Scaffold(
appBar: AppBar(title: Text("Meu App")),
body: Center(child: Text("Olá mundo")),
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.add),
),
)
5. Mini-Projeto: Contador Colorido 🚀
- Crie um novo projeto.
- Altere a cor do
FloatingActionButtonnomain.dart. - Use o
Hot Reloadpara ver a cor mudar instantaneamente.
6. Exercício de Fixação 🧠
- Diferencie
StatelessWidgetdeStatefulWidget. - O que é a Árvore de Widgets?
- Como o
Hot Reloadacelera o desenvolvimento?
Próxima Aula: Vamos aprender sobre Layouts e Organização Visual! 🎨
Aula 05 - Layouts e Organização Visual 🎨
Dica
Um bom layout é o que separa um app amador de um profissional. O segredo está em saber alinhar os elementos.
1. Column e Row: A Base de Tudo 🏗️
A maioria das interfaces é composta por elementos empilhados verticalmente ou lado a lado.
- Column: Alinha widgets de cima para baixo.
- Row: Alinha widgets da esquerda para a direita.
Propriedades de Alinhamento
mainAxisAlignment: Alinha no eixo principal (vertical para Column, horizontal para Row).crossAxisAlignment: Alinha no eixo cruzado.
2. Container, Padding e Margin 📦
- Container: Funciona como uma caixa onde você pode definir cor de fundo, bordas e tamanho.
- Padding: Espaço interno.
- Margin: Espaço externo.
Container(
padding: EdgeInsets.all(16),
margin: EdgeInsets.symmetric(horizontal: 10),
color: Colors.blue,
child: Text("Conteúdo"),
)
3. Expanded e Flexible ↔️
Servem para controlar como os widgets ocupam o espaço disponível.
graph LR
A[Container Fixo]
B[Expanded - Ocupa o resto]
C[Container Fixo]
subgraph "Row"
A --- B --- C
end
4. Praticando Layouts (Termynal) 💻
$ flutter create layout_app
$ cd layout_app
# Substitua o body por uma Column com 3 Containers coloridos
$ flutter run
5. Mini-Projeto: Perfil de Usuário Simples 🚀
Crie uma interface que contenha:
1. Uma Column principal.
2. Uma CircleAvatar para a foto.
3. Um Text para o nome.
4. Uma Row com ícones de redes sociais.
6. Exercício de Fixação 🧠
- Qual a diferença entre
MainAxisAlignmenteCrossAxisAlignmentem umaColumn? - Para que serve o widget
Expanded? - Como adicionamos espaço interno a um
Container?
Próxima Aula: Vamos explorar os Componentes Visuais! 🖼️
Aula 06 - Componentes Visuais 🖼️
Material Design
O Flutter facilita o uso de componentes que seguem o padrão Material Design, garantindo consistência visual.
1. Text, Icon e Image 📸
Esses são os blocos básicos para exibir informação.
Text("Estilizado", style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
Icon(Icons.favorite, color: Colors.red),
Image.network("https://url-da-imagem.com"),
2. Buttons: Interação com o Usuário 🖱️
Existem diversos tipos de botões pré-estilizados:
- ElevatedButton: Botão com sombra e relevo.
- TextButton: Botão apenas com texto (para ações secundárias).
- OutlinedButton: Botão com borda contínua.
3. AppBar e Scaffold 🏗️
O Scaffold é o esqueleto da tela, e a AppBar é a barra de título superior.
graph TD
A[Scaffold] --> B[AppBar]
A --> C[body]
A --> D[FloatingActionButton]
A --> E[BottomNavigationBar]
4. Testando Componentes (Termynal) 💻
5. Mini-Projeto: Tela de Boas-Vindas 🚀
Crie uma tela que tenha: 1. Uma imagem centralizada. 2. Um texto de boas-vindas grande. 3. Um botão "Começar" no final da página.
6. Exercício de Fixação 🧠
- Como alteramos o tamanho da fonte em um widget
Text? - Cite três tipos de botões do Flutter.
- Para que serve o widget
Scaffold?
Próxima Aula: Vamos aprender a Navegação entre Telas! 🛣️
Aula 07 - Navegação entre Telas 🛣️
Conceito
Raramente um aplicativo tem apenas uma tela. A navegação permite que o usuário transite entre diferentes funcionalidades de forma fluida.
1. Navigator e Pilha de Telas 📚
O Flutter usa o conceito de Pilha (Stack) para navegação. Imagine uma pilha de pratos: * Push: Adiciona uma nova tela no topo. * Pop: Remove a tela atual e volta para a anterior.
// Indo para uma nova tela
Navigator.push(
context,
MaterialPageRoute(builder: (context) => OutraTela()),
);
// Voltando
Navigator.pop(context);
2. Rotas Nomeadas 🏷️
Para aplicativos maiores, é melhor organizar as rotas por nomes no MaterialApp.
MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => TelaHome(),
'/detalhes': (context) => TelaDetalhes(),
},
);
// Navegando
Navigator.pushNamed(context, '/detalhes');
3. Passagem de Parâmetros 📦
Podemos enviar dados de uma tela para outra através do construtor ou do ModalRoute.
Flow de Navegação (Mermaid) 📊
graph LR
A[Tela Lista] -- Clicar Item --> B[Tela Detalhes]
B -- Navigator.pop --> A
B -- Argumento: ID do Item --> B
4. Testando Rotas (Termynal) 💻
5. Mini-Projeto: App de Receitas 🚀
Crie duas telas: 1. Lista de Receitas: Uma lista com nomes de pratos. 2. Detalhe da Receita: Ao clicar em um prato, navegue para uma tela que mostre o nome da receita selecionada.
6. Exercício de Fixação 🧠
- O que acontece com a tela atual quando usamos
Navigator.push? - Qual a principal vantagem de usar "Rotas Nomeadas"?
- Como voltamos para a tela anterior sem fechar o app?
Próxima Aula: Vamos aprender a criar Formulários e Validação! 📝
Aula 08 - Formulários e Validação 📝
Interatividade
Formulários são a principal forma de capturar dados do usuário, seja para um cadastro, login ou busca.
1. TextField e Controllers ⌨️
O TextField é o widget básico de entrada de texto. Para capturar o que o usuário digita, usamos um TextEditingController.
final controller = TextEditingController();
TextField(
controller: controller,
decoration: InputDecoration(labelText: "Seu Nome"),
)
// Acessando o valor
print(controller.text);
2. Form e TextFormField 🧱
Para validações complexas, usamos o widget Form em conjunto com o TextFormField.
TextFormField(
validator: (value) {
if (value == null || value.isEmpty) {
return "Campo obrigatório";
}
return null;
},
)
3. Validação de Dados ✅
A validação garante que o usuário insira os dados no formato correto antes de enviarmos para um banco de dados ou API.
Fluxo de Validação (Mermaid) 📊
graph TD
A[Usuário clica em Enviar] --> B{Campos válidos?}
B -- Não --> C[Mostrar mensagens de erro]
B -- Sim --> D[Processar Dados]
D --> E[Mostrar Sucesso]
4. Máscaras Básicas 🎭
Podemos usar o pacote mask_text_input_formatter para campos de CPF, Telefone ou Data.
5. Mini-Projeto: Tela de Cadastro 🚀
Crie um formulário com:
1. Campo de E-mail (com validação de @).
2. Campo de Senha (mínimo 6 caracteres).
3. Botão que só exibe uma SnackBar de sucesso se os dados forem válidos.
6. Exercício de Fixação 🧠
- Para que serve o
TextEditingController? - Qual a diferença entre
TextFieldeTextFormField? - Como acionamos a validação de um formulário?
Próxima Aula: Vamos dominar o Gerenciamento de Estado! 🔄
Aula 09 - Gerenciamento de Estado 🔄
Atenção
Gerenciar o estado é um dos tópicos mais importantes. Se o estado estiver bagunçado, o app terá bugs visuais e perda de dados.
1. O que é Estado? 🤔
Estado é qualquer dado que pode mudar durante a vida do aplicativo e que precisa ser refletido na interface (ex: contador, itens no carrinho, se o usuário está logado).
2. setState: O Básico 🔴
Para mudanças simples dentro de um único widget, usamos o setState. Ele avisa ao Flutter: "Ei, algo mudou, redesenhe a tela!".
3. Introdução ao Provider 🔷
Conforme o app cresce, o setState fica difícil de gerenciar. O Provider é uma das soluções mais populares para gerenciar estado de forma global.
Ciclo de Vida do Estado (Mermaid) 📊
graph LR
A[Ação do Usuário] --> B[Modificar Dados]
B --> C[Notificar Widgets]
C --> D[Interface Atualiza]
4. Instalando o Provider (Termynal) 💻
5. Mini-Projeto: Lista de Favoritos 🚀
Crie um app onde:
1. O usuário pode clicar em um botão de "coração" em um item.
2. O estado do coração (preenchido ou vazio) deve ser persistido enquanto o app estiver aberto.
3. Use um ChangeNotifier para gerenciar essa lista.
6. Exercício de Fixação 🧠
- O que acontece com a interface quando chamamos
setState? - Por que não usamos
setStatepara tudo em apps grandes? - Qual o papel do
notifyListeners()no Provider?
Próxima Aula: Vamos aprender o Consumo de APIs REST! 📡
Aula 10 - Consumo de APIs REST 📡
Comunicação
A maioria dos aplicativos modernos depende de dados vindos da internet. Saber consumir uma API REST é essencial para qualquer desenvolvedor.
1. O que é uma API REST? 🌐
REST é um conjunto de regras que permite que o seu app converse com um servidor. Usamos o protocolo HTTP para enviar e receber dados, geralmente no formato JSON.
Principais Métodos
- GET: Buscar dados.
- POST: Enviar dados novos.
- PUT/PATCH: Atualizar dados.
- DELETE: Remover dados.
2. Pacote HTTP e JSON 📦
Para fazer requisições, usamos o pacote http.
import 'package:http/http.as http;
import 'dart:convert';
Future<void> buscarDados() async {
final response = await http.get(Uri.parse('https://api.exemplo.com/dados'));
if (response.statusCode == 200) {
var dados = jsonDecode(response.body);
print(dados['projeto']);
}
}
3. Future e Async/Await ⏳
Como a internet pode ser lenta, não podemos travar o app esperando a resposta. Usamos Programação Assíncrona.
Ciclo de Requisição (Mermaid) 📊
graph TD
A[App solicita dados] --> B[Aguardando resposta...]
B --> C{Sucesso?}
C -- Sim --> D[Converter JSON para Objeto]
C -- Não --> E[Tratar Erro]
D --> F[Atualizar Interface]
4. Instalando Dependências (Termynal) 💻
5. Mini-Projeto: App de CEP 🚀
Crie um app que:
1. Tenha um campo para digitar o CEP.
2. Consuma a API do ViaCEP (https://viacep.com.br/ws/CEP/json/).
3. Exiba o endereço na tela.
6. Exercício de Fixação 🧠
- Para que serve o comando
await? - O que é o
jsonDecode? - Por que usamos
Futureem requisições de rede?
Próxima Aula: Vamos aprender a Persistência de Dados! 💾
Aula 11 - Persistência de Dados 💾
Dados Locais
Nem tudo precisa de internet. Às vezes queremos salvar preferências do usuário ou dados que funcionem offline.
1. SharedPreferences 🔑
Ideal para salvar pequenas quantidades de dados, como configurações (Ex: tema escuro, se o usuário já viu o tutorial). Salva pares de Chave-Valor.
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('show_ads', false);
bool? showAds = prefs.getBool('show_ads');
2. Banco de Dados Local (SQLite) 🗄️
Para grandes volumes de dados (como uma lista de tarefas ou contatos), usamos o SQLite através do pacote sqflite.
Estrutura CRUD
- Create (Inserir)
- Read (Ler)
- Update (Atualizar)
- Delete (Excluir)
3. Fluxo de Dados Offline (Mermaid) 📊
graph LR
A[App] --> B{Tem Internet?}
B -- Sim --> C[Buscar na API]
B -- Não --> D[Buscar no Banco Local]
C --> E[Salvar no Banco Local]
D --> F[Mostrar na Tela]
E --> F
4. Instalando Pacotes (Termynal) 💻
5. Mini-Projeto: Bloco de Notas Simples 🚀
Crie um app que:
1. Permita escrever uma nota.
2. Salve a nota no SharedPreferences ao fechar o app.
3. Recupere a nota automaticamente ao abrir o app novamente.
6. Exercício de Fixação 🧠
- Quando devemos usar
SharedPreferencesem vez de um Banco de Dados SQL? - O que significa a sigla CRUD?
- Qual a principal vantagem de ter um banco de dados local no app?
Próxima Aula: Vamos aprender a Organização Profissional do Projeto! 🏛️
Aula 12 - Organização Profissional do Projeto 🏛️
Escalabilidade
Organizar bem o código é o que permite que um projeto dure anos e seja fácil de manter por vários desenvolvedores.
1. Separação por Camadas 🍰
Não devemos colocar tudo dentro da interface. Dividimos o código em responsabilidades:
- Model: Representa os dados (Classes Dart).
- Service: Lida com a comunicação externa (APIs, Banco de Dados).
- Controller/Provider: Gerencia a lógica de negócio e o estado.
- View: Apenas desenha a interface na tela.
2. Clean Architecture (Simplificada) 🏗️
A ideia é que a interface dependa da lógica, e não o contrário.
Diagrama de Dependências (Mermaid) 📊
graph BT
UI[View - Telas] --> CTR[Controller/Provider]
CTR --> SRV[Services]
SRV --> MDL[Models]
3. Boas Práticas de Código ✨
- Nomes Claros:
getUserData()é melhor quegetD(). - Don't Repeat Yourself (DRY): Se você está copiando e colando código, crie uma função ou widget reutilizável.
- Single Responsibility: Cada arquivo deve fazer apenas uma coisa bem feita.
4. Organizando Pastas (Termynal) 📂
$ mkdir lib/models lib/services lib/providers lib/views
$ ls lib/
models/
providers/
services/
views/
main.dart
5. Mini-Projeto: Refatorando o App de CEP 🚀
Pegue o projeto da Aula 10 e organize-o:
1. Crie uma classe EnderecoModel.
2. Crie um EnderecoService para a chamada HTTP.
3. Crie um EnderecoProvider para gerenciar o estado da busca.
6. Exercício de Fixação 🧠
- Por que não devemos fazer chamadas de API diretamente dentro do widget da tela?
- O que é um "Model" no contexto de camadas de software?
- Qual a vantagem de usar Widgets reutilizáveis?
Próxima Aula: Vamos aprender a Publicar para Android! 🤖
Aula 13 - Publicando para Android 🤖
O Ecossistema Android
Publicar para Android exige algumas configurações no Gradle e a geração de uma chave de assinatura (Keystore).
1. Configurações do SDK e Gradle 🛠️
O arquivo android/app/build.gradle controla as versões do Android suportadas pelo seu app.
- minSdkVersion: Versão mínima do Android que pode rodar o app.
- targetSdkVersion: Versão para a qual o app foi otimizado.
- versionCode: Número interno da versão (ex: 1, 2, 3).
- versionName: Versão amigável ao usuário (ex: 1.0.0).
2. Gerando o APK e o App Bundle 📦
APK (Android Package)
Usado para instalação direta no dispositivo.
App Bundle (AAB)
O formato obrigatório para a Google Play Store. O Google otimiza o tamanho do app para cada dispositivo.
3. Ícone e Nome do Aplicativo 🎨
Para trocar o ícone em todas as resoluções de forma automática, usamos o pacote flutter_launcher_icons.
Fluxo de Build (Mermaid) 📊
graph TD
A[Código Dart] --> B[Compilação AOT]
B --> C[Engine Flutter]
C --> D[Bundling de Assets]
D --> E[Assinatura do APK/AAB]
E --> F[Pronto para Instalação]
4. Testes em Dispositivo Físico (Termynal) 💻
Testar em um celular de verdade é essencial para validar a performance.
5. Mini-Projeto: Gerando seu primeiro APK 🚀
- Troque o nome do app no
AndroidManifest.xml. - Execute o comando
flutter build apk. - Localize o arquivo gerado em
build/app/outputs/flutter-apk/app-release.apk.
6. Exercício de Fixação 🧠
- Qual a diferença entre APK e App Bundle?
- Para que serve o
minSdkVersion? - Por que devemos testar em dispositivos físicos e não apenas em emuladores?
Próxima Aula: Vamos aprender a Publicar para Web! 🌐
Aula 14 - Publicando para Web 🌐
Flutter Web
O Flutter converte seu código Dart em HTML, CSS e JavaScript, permitindo que o app rode em qualquer navegador moderno.
1. Responsividade: O Desafio da Web 📱💻
Diferente do celular, na web o usuário pode redimensionar a janela a qualquer momento. Precisamos usar o widget LayoutBuilder ou pacotes como responsive_framework.
LayoutBuilder(
builder: (context, constraints) {
if (constraints.maxWidth > 800) {
return VistaDesktop();
} else {
return VistaMobile();
}
},
)
2. Compilação para Web 🏗️
O Flutter oferece dois motores de renderização para a web: * HTML: Menor tamanho de arquivo, melhor para SEO. * CanvasKit (WebAssembly): Melhor performance e fidelidade visual (idêntico ao mobile).
3. Deploy Simples 🚀
Após o build, o Flutter gera uma pasta build/web/. Você pode subir esses arquivos para o GitHub Pages, Firebase Hosting ou Netlify.
Fluxo de Deploy (Mermaid) 📊
graph LR
A[Build Web] --> B[Pasta build/web]
B --> C[Servidor Estático]
C --> D[Acesso via Navegador]
4. Rodando na Web (Termynal) 💻
5. Mini-Projeto: Portfólio Web 🚀
Adapte um dos seus mini-projetos anteriores para: 1. Ter uma barra de navegação lateral no desktop. 2. Ter uma barra de navegação inferior no mobile.
6. Exercício de Fixação 🧠
- Como o Flutter lida com diferentes tamanhos de tela na Web?
- Qual a pasta que contém o resultado final do build para web?
- Cite uma ferramenta de hospedagem gratuita para o Flutter Web.
Próxima Aula: Vamos explorar Aplicações Desktop! 💻
Aula 15 - Aplicações Desktop 💻
Windows, macOS e Linux
O Flutter permite criar aplicativos de desktop nativos com acesso total ao sistema de arquivos e periféricos.
1. Habilitando o suporte Desktop 🛠️
Dependendo do seu sistema operacional, você precisará instalar ferramentas extras (como o Visual Studio com C++ para Windows).
flutter config --enable-windows-desktop
flutter config --enable-macos-desktop
flutter config --enable-linux-desktop
2. Ajustes de Layout para Desktop 🖥️
No desktop, temos janelas que podem ser maximizadas. Usamos o mouse e o teclado como entradas principais, não o toque.
- Menus de Contexto: Clique com o botão direito.
- Hover: Efeitos ao passar o mouse por cima.
- Atalhos de Teclado: Ex: Ctrl+S para salvar.
3. Empacotamento Básico 📦
Para distribuir seu app desktop, você pode gerar um executável .exe (Windows), .app (macOS) ou um binário Linux.
Arquitetura Desktop (Mermaid) 📊
graph TD
A[App Flutter] --> B[Dart Runner]
B --> C[C++ Embedding]
C --> D[Plataforma Nativa - Win/Mac/Lin]
D --> E[Acesso ao Hardware/Arquivos]
4. Rodando Desktop (Termynal) 💻
5. Mini-Projeto: Editor de Texto Simples 🚀
Crie um app desktop que:
1. Tenha um campo TextField que ocupe a tela toda.
2. Tenha um botão de "Salvar em Arquivo" (use o pacote file_picker).
6. Exercício de Fixação 🧠
- Qual a principal diferença de input entre mobile e desktop?
- Como habilitamos o suporte para Windows no Flutter?
- Por que janelas redimensionáveis são importantes no desktop?
Próxima Aula: É hora do Projeto Final Integrador! 🎓
Aula 16 - Projeto Final Integrador 🎓
Objetivo Final
Parabéns por chegar até aqui! Agora é hora de unir todo o conhecimento em um único projeto profissional completo.
1. O Desafio Final 🏆
Você deverá desenvolver um aplicativo multiplataforma (Mobile, Web e Desktop) que resolva um problema real.
Sugestões de Temas
- Lista de Tarefas (ToDo): Com persistência local e categorias.
- Controle Financeiro Simples: Cadastro de gastos e receitas com gráficos.
- Agenda de Contatos: Com integração de foto e busca.
2. Requisitos Obrigatórios ✅
Para que o projeto seja considerado completo, ele deve conter:
- Arquitetura: Separação em camadas (Models, Services, Providers).
- UI/UX: Layout responsivo (funciona bem em telas grandes e pequenas).
- Navegação: Pelo menos duas telas.
- Dados: Consumo de uma API externa OU persistência local (SQLite/SharedPrefs).
- Formulários: Cadastro de dados com validação.
3. Estrutura do Projeto (Mermaid) 📊
graph TD
subgraph "Camada de UI"
V1[Home View]
V2[Form View]
end
subgraph "Camada de Lógica"
P[Provider de Dados]
end
subgraph "Camada de Dados"
S[Service API/Local]
M[Model de Dados]
end
V1 --> P
V2 --> P
P --> S
S --> M
4. Preparando para Apresentação 🚀
Um bom desenvolvedor também sabe apresentar seu trabalho.
- Faça o Build: Gere o APK, a versão Web e o executável Desktop.
- Repositório: Suba o código para o GitHub com um
README.mdbem escrito. - Vídeo/GIF: Grave o funcionamento do app em diferentes telas.
5. Próximos Passos na Carreira 🚀
O aprendizado não para aqui. Explore: * Gerenciamento de estado avançado (Bloc, Riverpod). * Testes Unitários e de Integração avançados. * Integração com Firebase (Auth, Firestore, Cloud Functions).
Certificação
Conclua o projeto, publique no seu portfólio e compartilhe sua conquista!
Fim da Jornada! Boas codificações! 📱💻🚀
Exercícios
Listas de Exercícios 🏋️
Pratique o que aprendeu com desafios graduais para cada aula.
-
Módulo 1: Fundamentos ---
-
Módulo 2: Interfaces ---
-
Módulo 3: Lógica ---
-
Módulo 4: Prática ---
Exercícios - Aula 01: Introdução ao Desenvolvimento Multiplataforma 🌍
🟢 Básicos (Fixação)
- Definição: Explique com suas palavras a principal diferença entre um aplicativo nativo e um aplicativo desenvolvido com Flutter.
- Diagnóstico: Qual o comando do Flutter SDK que usamos para verificar se o ambiente de desenvolvimento (Android Studio, VS Code, SDK) está configurado corretamente?
🟡 Intermediários (Aplicação)
- Arquitetura: O que significa dizer que o Flutter "não usa widgets nativos"? Qual o benefício dessa abordagem para a consistência visual entre Android e iOS?
- Instalação: Liste os 3 principais componentes de software que devem estar instalados na sua máquina para começar a programar em Flutter.
🔴 Desafio (Pesquisa/Prática)
- Comparativo: Pesquise sobre o motor de renderização "Impeller" do Flutter. Explique brevemente qual problema ele veio resolver em relação ao motor antigo (Skia) nas plataformas iOS e Android.
Exercícios - Aula 02: Linguagem Dart para Iniciantes 🎯
🟢 Básicos (Fixação)
- Variáveis: Crie um programa simples em Dart que declare três variáveis: uma String com o nome de um app, um int com a versão e um double com a nota da loja. Imprima os valores usando interpolação de string ($).
- Tipagem: Diferencie as palavras-chave
var,finaleconstno Dart. Quando devemos usar cada uma?
🟡 Intermediários (Aplicação)
- Condicionais: Escreva uma função que receba uma idade e imprima se a pessoa é "Maior de idade" ou "Menor de idade".
- Repetição: Use um laço
forpara imprimir todos os números pares de 0 a 20.
🔴 Desafio (Pesquisa/Prática)
- Null Safety: Explique o que é a "Null Safety" no Dart. Dê um exemplo de código que causaria um erro antes do Null Safety e como ele deve ser escrito agora usando o operador
?.
Exercícios - Aula 03: Estrutura de um Projeto Flutter 🏗️
🟢 Básicos (Fixação)
- Diretórios: Qual a função da pasta
lib/em um projeto Flutter? O que acontece se deletarmos o arquivomain.dart? - Configuração: Para que serve o arquivo
pubspec.yaml? Liste três tipos de informações que configuramos nele.
🟡 Intermediários (Aplicação)
- Dependências: Adicione o pacote
google_fontsao seu arquivopubspec.yaml. Qual comando você deve rodar no terminal para que o projeto reconheça a nova biblioteca? - EntryPoint: Explique o papel da função
main()e do comandorunApp(). Por que passamos um Widget para orunApp?
🔴 Desafio (Pesquisa/Prática)
- Platform Folders: Por que o Flutter gera pastas como
android/,ios/eweb/se escrevemos o código apenas em Dart? O que essas pastas contêm de essencial para o funcionamento do app?
Exercícios - Aula 04: Widgets: A Base de Tudo 🧱
🟢 Básicos (Fixação)
- Conceito: O que significa a frase "Tudo no Flutter é um Widget"? Dê 3 exemplos de coisas que são widgets mas que não são elementos visuais "clicáveis" (ex: cores, alinhamentos).
- Stateless vs Stateful: Explique a diferença de ciclo de vida entre um
StatelessWidgete umStatefulWidget.
🟡 Intermediários (Aplicação)
- Árvore de Widgets: Desenhe (em texto ou papel) a hierarquia de widgets de uma tela que tem: Um scaffold, uma appbar com título, e no corpo um texto centralizado.
- Hot Reload: Explique a diferença técnica entre "Hot Reload" e "Hot Restart". Em que situação o Hot Reload não é suficiente e precisamos dar um Restart?
🔴 Desafio (Pesquisa/Prática)
- Composição: Crie um pequeno código Dart que implemente um
StatelessWidgetchamadoCartaoBoasVindas. Ele deve receber um parâmetroString nomeno construtor e exibir um texto "Olá, $nome!" dentro de um widget de sua escolha.
Exercícios - Aula 05: Layouts e Organização Visual 🎨
🟢 Básicos (Fixação)
- Eixos: Em uma
Column, qual a diferença entreMainAxisAlignmenteCrossAxisAlignment? - Caixas: Para que serve o widget
Container? Imagine 3 propriedades que você poderia mudar nele para destacar um título da tela.
🟡 Intermediários (Aplicação)
- Espaçamento: Diferencie
PaddingdeMargin. Se você quiser afastar um botão das bordas de um cartão, qual dos dois deve usar dentro do cartão? - Expansão: Para que serve o widget
Expanded? O que acontece se colocarmos dois widgetsExpandeddentro da mesmaRow?
🔴 Desafio (Pesquisa/Prática)
- Responsividade: Como você faria para que uma lista de itens aparecesse em 1 coluna no celular (vertical) mas em 3 colunas em um tablet (horizontal)? Pesquise sobre
LayoutBuilderouMediaQuery.
Exercícios - Aula 06: Componentes Visuais 🖼️
🟢 Básicos (Fixação)
- Text: Como você mudaria a cor de um texto para vermelho e o tamanho para 24 usando
TextStyle? - Botões: Cite os 3 tipos principais de botões do Material Design no Flutter e dê um exemplo de uso para cada um.
🟡 Intermediários (Aplicação)
- Imagens: Qual a diferença entre carregar uma imagem via
Image.asseteImage.network? Qual delas exige configuração nopubspec.yaml? - Ícones: Como você adicionaria um ícone de "coração" vermelho ao lado de um texto em uma
Row?
🔴 Desafio (Pesquisa/Prática)
- Iteração: Pesquise como funciona o widget
ListView.builder. Por que ele é mais eficiente que apenas colocar umaColumndentro de umSingleChildScrollViewquando temos 1000 itens?
Exercícios - Aula 07: Navegação entre Telas 🛣️
🟢 Básicos (Fixação)
- Pilha: O que acontece com a memória do app quando usamos
Navigator.pushsucessivas vezes sem nunca usar opop? - Voltar: Qual comando usamos para fechar a tela atual e retornar à anterior? Ele precisa de algum parâmetro obrigatório?
🟡 Intermediários (Aplicação)
- Parâmetros: Descreva como você passaria o ID de um produto da "Tela de Listagem" para a "Tela de Detalhes".
- Rotas: Qual a vantagem de usar
initialRouteem vez do parâmetrohomeno seuMaterialApp?
🔴 Desafio (Pesquisa/Prática)
- UX de Navegação: O que faz o método
Navigator.pushAndRemoveUntil? Dê um exemplo prático de onde ele seria essencial em um aplicativo (ex: Logout).
Exercícios - Aula 08: Formulários e Validação 📝
🟢 Básicos (Fixação)
- Input: Qual a diferença entre
TextFieldeTextFormFieldno contexto do Flutter? - Captura: Para que serve o
TextEditingController? Onde ele deve ser declarado?
🟡 Intermediários (Aplicação)
- Validação: Escreva uma função de validação (validator) para um campo de e-mail que verifique se o texto contém pelo menos um "@" e um ".".
- Teclado: Como você mudaria o teclado para mostrar apenas números quando o usuário clicar em um campo de "Telefone"?
🔴 Desafio (Pesquisa/Prática)
- Feedback: Além de mudar a cor do texto para vermelho, pesquise como podemos usar o widget
SnackBarpara mostrar uma mensagem de erro geral caso o usuário tente enviar um formulário com campos vazios.
Exercícios - Aula 09: Gerenciamento de Estado 🔄
🟢 Básicos (Fixação)
- Estado: Dê 3 exemplos de dados em um aplicativo que seriam considerados "Estado" (que precisam ser atualizados na tela quando mudam).
- setState: O que acontece se você mudar o valor de uma variável em um
StatefulWidgetmas esquecer de chamar osetState()?
🟡 Intermediários (Aplicação)
- Injeção: Para que serve o widget
ChangeNotifierProvider? Onde ele deve ser posicionado na árvore de widgets? - Escuta: Qual a diferença entre usar
context.watch<T>()econtext.read<T>()dentro de um métodobuild?
🔴 Desafio (Pesquisa/Prática)
- Performance: Pesquise sobre o widget
Consumerdo pacote Provider. Como ele ajuda a otimizar a performance do aplicativo em comparação com o uso dowatchno topo do método build?
Exercícios - Aula 10: Consumo de APIs REST 📡
🟢 Básicos (Fixação)
- JSON: O que é um arquivo JSON e por que ele é preferido em vez de XML no desenvolvimento mobile atual?
- HTTP: Liste os 4 verbos HTTP principais e descreva brevemente para que cada um serve em uma API de "Cadastro de Usuários".
🟡 Intermediários (Aplicação)
- Async: Explique com um exemplo do mundo real por que usamos
asynceawaitao fazer uma chamada de rede, em vez de travar o app até a resposta chegar. - Parsing: Para que serve a função
jsonDecode()? O que ela devolve no Dart se o JSON for uma lista de objetos{...}?
🔴 Desafio (Pesquisa/Prática)
- Erros: Como você trataria um cenário onde o usuário tenta buscar um CEP (Aula 10), mas está sem internet? Pesquise sobre blocos
try-catche como verificar ostatusCodeda resposta.
Exercícios - Aula 11: Persistência de Dados 💾
🟢 Básicos (Fixação)
- Armazenamento: Qual pacote você escolheria para salvar se o usuário prefere o app em "Modo Escuro" ou "Modo Claro"? Justifique.
- SQLite: O SQLite é considerado um banco de dados relacional ou não-relacional (NoSQL)?
🟡 Intermediários (Aplicação)
- CRUD: Escreva o comando SQL necessário para criar uma tabela chamada
tarefascom as colunasid(inteiro),titulo(texto) econcluida(inteiro 0 ou 1). - Camadas: Por que não é boa prática abrir a conexão com o banco de dados diretamente dentro do método
buildda sua tela?
🔴 Desafio (Pesquisa/Prática)
- Sincronização: Imagine um app que funciona offline mas precisa enviar os dados para a nuvem quando a internet volta. Pesquise e explique brevemente como você organizaria esse fluxo de dados.
Exercícios - Aula 12: Organização Profissional do Projeto 🏛️
🟢 Básicos (Fixação)
- Responsabilidades: Em um projeto organizado, o que deve ficar dentro da pasta
services/? - Modelos: Por que criamos classes "Model" em vez de usar apenas
Map<String, dynamic>para manipular os dados da API em todo o app?
🟡 Intermediários (Aplicação)
- DRY: O que significa o princípio DRY? Dê um exemplo de como você o aplicaria ao notar que 3 telas diferentes possuem o mesmo botão azul arredondado.
- Singleton: Pesquise o que é o padrão de projeto "Singleton" e por que ele é útil para gerenciar a conexão com o banco de dados SQLite.
🔴 Desafio (Pesquisa/Prática)
- Arquitetura: Pesquise sobre o padrão MVVM (Model-View-ViewModel). Como o
Providerse encaixa nesse padrão para separar a lógica (ViewModel) da tela (View)?
Exercícios - Aula 13: Publicando para Android 🤖
🟢 Básicos (Fixação)
- Gradle: Onde definimos o
versionNamee oversionCodedo nosso aplicativo Android? - Build: Qual o comando usado para gerar um
App Bundle(.aab) para a Google Play Store?
🟡 Intermediários (Aplicação)
- Assinatura: O que é uma
Keystoree por que ela é obrigatória para publicar um app na loja oficial? O que acontece se você perder esse arquivo? - Permissões: Cite duas permissões comuns que devem ser declaradas no
AndroidManifest.xml(ex: Internet, Câmera).
🔴 Desafio (Pesquisa/Prática)
- Distribuição: Pesquise sobre o "Internal App Sharing" da Google Play. Como ele ajuda no processo de teste antes de liberar o app para o público geral?
Exercícios - Aula 14: Publicando para Web 🌐
🟢 Básicos (Fixação)
- Plataforma: Qual comando usamos para rodar o projeto especificamente no navegador Chrome?
- Saída: Após rodar
flutter build web, qual a pasta que contém os arquivos prontos para subir no servidor?
🟡 Intermediários (Aplicação)
- Renderizadores: Explique a diferença entre usar o renderizador
HTMLe oCanvasKit. Em qual situação você escolheria o HTML? - PWA: O que é um PWA (Progressive Web App)? Cite um benefício de transformar seu app Flutter Web em um PWA.
🔴 Desafio (Pesquisa/Prática)
- Hospedagem: Pesquise como realizar o deploy de um app Flutter Web no GitHub Pages. Quais são os passos básicos após gerar a pasta build?
Exercícios - Aula 15: Aplicações Desktop 💻
🟢 Básicos (Fixação)
- Desktop: Qual comando habilita o suporte para desenvolvimento Windows no seu SDK do Flutter?
- Input: Cite uma diferença fundamental de interação entre um app mobile (toque) e um app desktop (mouse/teclado).
🟡 Intermediários (Aplicação)
- Responsividade: Como você garantiria que um app desktop não fique com o texto minúsculo ao ser aberto em um monitor 4K?
- Periféricos: Pesquise como poderíamos detectar um comando de "Atalho de Teclado" (ex: Ctrl + S) para salvar um arquivo no Flutter Desktop.
🔴 Desafio (Pesquisa/Prática)
- Ambiente: Quais são os requisitos de software obrigatórios para compilar um app Flutter para Windows (ex: C++, IDE)?
Exercícios - Aula 16: Projeto Final Integrador 🎓
🟢 Básicos (Fixação)
- Escopo: Escolha um dos temas sugeridos (ToDo, Finanças ou Agenda) e descreva 3 funcionalidades principais que seu app terá.
- Arquitetura: Desenhe ou descreva como você organizará suas pastas para este projeto final.
🟡 Intermediários (Aplicação)
- UI: Como você planeja tornar seu app responsivo para que ele funcione bem tanto no celular quanto no navegador?
- Dados: Você usará uma API externa (como a de CEP) ou salvará os dados localmente (SQLite)? Justifique sua escolha baseado no tema escolhido.
🔴 Desafio (Pesquisa/Prática)
- Pitch: Escreva um pequeno parágrafo (3 a 5 linhas) vendendo a ideia do seu aplicativo. Qual problema ele resolve e por que usar Flutter foi a escolha certa para construí-lo?
Projetos
Projetos Práticos 🚀
Transforme teoria em prática com desafios progressivos que compõem seu portfólio.
-
Módulo 1: Fundamentos ---
-
Módulo 2: Interfaces ---
-
Módulo 3: Lógica ---
-
Módulo 4: Prática ---
Projeto 01 - Hello Flutter 🚀
🎯 Objetivo
Criar seu primeiro projeto Flutter e rodá-lo no emulador ou dispositivo físico.
📝 Descrição
Neste projeto, você vai validar sua instalação do Flutter criando o projeto padrão e realizando pequenas modificações visuais para entender como o framework reage.
🛠️ Requisitos
- Criar o projeto via terminal ou IDE.
- Trocar o título da
AppBar. - Trocar a cor do tema principal no
MaterialApp. - Entender o funcionamento do contador padrão.
💡 Dica
Use o comando flutter run no terminal para ver o app em ação pela primeira vez.
Projeto 02 - CLI Dart 🎯
🎯 Objetivo
Praticar a lógica da linguagem Dart sem a complexidade visual do Flutter.
📝 Descrição
Desenvolva um pequeno programa de linha de comando (CLI) que receba dados do usuário pelo terminal e realize cálculos matemáticos simples.
🛠️ Requisitos
- Receber o nome do usuário.
- Solicitar dois números.
- Exibir a soma, subtração e média dos números.
- Usar
Null Safetycorretamente.
💡 Dica
Utilize stdin.readLineSync() do pacote dart:io para ler dados do teclado.
Projeto 03 - Blueprints de App 🏗️
🎯 Objetivo
Entender a anatomia de um projeto comercial e organizar o pubspec.yaml.
📝 Descrição
Configure a estrutura inicial de um aplicativo fictício, adicionando pastas organizadas e registrando assets e fontes personalizadas.
🛠️ Requisitos
- Organizar a pasta
lib/em subpastas (models,views,widgets). - Adicionar uma imagem de logo à pasta
assets/. - Registrar a imagem no
pubspec.yaml. - Trocar a fonte padrão do sistema pela fonte
Google Sans(via pacotegoogle_fonts).
💡 Dica
Mantenha os caminhos das imagens curtos e sem caracteres especiais para evitar erros no build.
Projeto 04 - Primeiro App Visual 🏆
🎯 Objetivo
Construir uma interface estática atraente usando widgets básicos.
📝 Descrição
Crie uma "Tela de Apresentação" (Landing Page) para um aplicativo, focando totalmente no layout e nos componentes visuais do Material Design.
🛠️ Requisitos
- Usar um
ScaffoldcomAppBar. - Exibir um texto de "Boas-vindas" estilizado.
- Adicionar uma imagem centralizada.
- Incluir um botão que, ao ser clicado, imprime uma mensagem no console.
💡 Dica
Explore o widget Center e Column para organizar os elementos no meio da tela.
Projeto 05 - Dashboard Pessoal 🎨
🎯 Objetivo
Dominar widgets de layout como Column, Row e Expanded.
📝 Descrição
Crie uma tela de painel (Dashboard) que exiba informações resumidas de um usuário, como nome, saldo fictício e uma grade de ícones de navegação rápida.
🛠️ Requisitos
- Cabeçalho com foto (CircleAvatar) e nome.
- Um cartão centralizado com um saldo estilizado.
- Uma grade 2x2 de botões/ícones usando
RoweColumn. - Uso correto de
Paddingpara evitar que os elementos toquem as bordas da tela.
💡 Dica
Utilize o widget Card para dar um efeito de elevação e bordas aos seus elementos.
Projeto 06 - Galeria de Fotos 📸
🎯 Objetivo
Trabalhar com componentes de imagem e rolagem de conteúdo.
📝 Descrição
Desenvolva uma galeria que exiba fotos vindas da internet. O foco aqui é carregar imagens de forma eficiente e garantir que a interface seja rolável.
🛠️ Requisitos
- Uso de
Image.networkcom imagens reais. - Implementação de
SingleChildScrollViewouListView. - Adição de legendas abaixo de cada foto usando
Textestilizado. - Efeito de carregamento (placeholder) enquanto a imagem baixa.
💡 Dica
O site unsplash.com oferece URLs de imagens aleatórias ótimas para testes.
Projeto 07 - App de Receitas 🛣️
🎯 Objetivo
Implementar navegação entre múltiplas telas e passagem de parâmetros.
📝 Descrição
Crie um aplicativo com duas telas: uma lista de receitas e uma tela de detalhes que mostra os ingredientes quando uma receita é clicada.
🛠️ Requisitos
- Tela 01: Lista de Receitas (mínimo 3).
- Tela 02: Detalhes da Receita selecionada.
- Uso de
Navigator.pushpara transição. - Botão de voltar na tela de detalhes.
💡 Dica
Crie uma classe Receita para organizar os dados que serão passados de uma tela para outra.
Projeto 08 - Form de Login 🏆
🎯 Objetivo
Construir formulários robustos com validação de dados em tempo real.
📝 Descrição
Desenvolva uma tela de login profissional, com campos para e-mail e senha, tratando erros de digitação e exibindo mensagens de feedback.
🛠️ Requisitos
- Widget
FormcomGlobalKey. - Campos
TextFormFieldcom validação (e-mail válido e senha curta). - Uso de
obscureTextpara a senha. - Exibição de uma
SnackBarde sucesso caso tudo esteja correto.
💡 Dica
Não esqueça de usar um TextEditingController para limpar os campos após o login.
Projeto 09 - Lista de Desejos 🔄
🎯 Objetivo
Aplicar o gerenciamento de estado global usando o pacote Provider.
📝 Descrição
Crie um aplicativo onde o usuário pode visualizar uma lista de produtos e "favoritar" aqueles que deseja. O estado do coração deve ser compartilhado entre diferentes widgets.
🛠️ Requisitos
- Instalação e configuração do pacote
Provider. - Criação de um
ChangeNotifierpara gerenciar a lista de favoritos. - Uso de
context.watch()para exibir o contador de favoritos. - Uso de
context.read()para adicionar/remover itens.
💡 Dica
Lembre-se de envolver seu MaterialApp com o ChangeNotifierProvider no arquivo main.dart.
Projeto 10 - Consulta de CEP 📡
🎯 Objetivo
Consumir dados de uma API externa e tratar processos assíncronos.
📝 Descrição
Desenvolva um buscador de endereços. O usuário digita o CEP e o aplicativo busca as informações (Rua, Bairro, Cidade) usando a API do ViaCEP.
🛠️ Requisitos
- Uso do pacote
http. - Chamada assíncrona (
async/await) para a API. - Tratamento de erro (caso o CEP não exista).
- Exibição de um
CircularProgressIndicatordurante a busca.
💡 Dica
A URL da API é: https://viacep.com.br/ws/01001000/json/. Substitua o número pelo valor digitado pelo usuário.
Projeto 11 - Bloco de Notas SQL 💾
🎯 Objetivo
Persistir dados de forma permanente usando o banco de dados SQLite.
📝 Descrição
Crie um aplicativo de bloco de notas onde as anotações do usuário não desapareçam quando o app for fechado.
🛠️ Requisitos
- Uso do pacote
sqflite. - Criação da tabela no banco de dados local.
- Operações de Inserir e Listar notas.
- Funcionalidade de deletar uma nota.
💡 Dica
Crie um arquivo database_helper.dart para concentrar toda a lógica do SQLite em um só lugar.
Projeto 12 - Refatoração Profissional 🏆
🎯 Objetivo
Organizar o código seguindo padrões de arquitetura e boas práticas.
📝 Descrição
Pegue um dos projetos anteriores (como a Consulta de CEP) e reorganize-o totalmente, separando a interface da lógica de negócio.
🛠️ Requisitos
- Criação de uma pasta
models/com a classe de dados. - Criação de uma pasta
services/para a chamada da API. - Criação de uma pasta
providers/para o gerenciamento de estado. - Limpeza do arquivo
main.dart(deixando apenas as rotas e tema).
💡 Dica
O objetivo não é adicionar funções novas, mas sim deixar o código "limpo" e fácil de ler para outro desenvolvedor.
Projeto 13 - App Android Final 🤖
🎯 Objetivo
Gerar a versão de produção para dispositivos Android.
📝 Descrição
Neste projeto, você vai preparar o seu aplicativo (pode ser o da Aula 12) para o mundo real. Você irá configurar o nome oficial, o ícone e realizar o build de produção.
🛠️ Requisitos
- Trocar o ícone do aplicativo usando
flutter_launcher_icons. - Configurar o nome do app no
AndroidManifest.xml. - Aumentar o
versionCodenobuild.gradle. - Gerar o arquivo APK assinado.
💡 Dica
Sempre use o comando flutter build apk --release para garantir que o seu arquivo final seja o menor possível.
Projeto 14 - Portfólio Web 🌐
🎯 Objetivo
Hospedar seu primeiro aplicativo na internet.
📝 Descrição
Transforme um de seus apps em uma versão Web e realize o deploy em um servidor gratuito. O objetivo é que qualquer pessoa com o link possa acessar seu trabalho pelo navegador.
🛠️ Requisitos
- Habilitar o suporte Web no projeto.
- Garantir que o layout não quebre ao ser aberto no computador.
- Gerar o build com
flutter build web. - Realizar o deploy no GitHub Pages (ou Firebase Hosting).
💡 Dica
Use o widget LayoutBuilder para remover elementos desnecessários (como botões gigantes) quando a tela for muito larga.
Projeto 15 - Editor de Texto Desktop 💻
🎯 Objetivo
Criar uma aplicação funcional para computadores (Windows/macOS/Linux).
📝 Descrição
Desenvolva um editor de notas simples que rode como uma janela nativa no seu computador, permitindo escrever textos longos.
🛠️ Requisitos
- Ajustar o layout para janelas redimensionáveis.
- Uso de um
TextFieldcom múltiplas linhas (maxLines: null). - Adição de um botão "Copiar Texto" (use o pacote
clipboard). - Gerar o executável nativo do sistema.
💡 Dica
Lembre-se que no desktop o usuário tem mouse, então você pode adicionar efeitos de hover nos botões.
Projeto 16 - Super App Multitela 🎓
🎯 Objetivo
Consolidar todo o aprendizado em um projeto final completo e profissional.
📝 Descrição
Este é o seu TCC do curso. Você deve construir um aplicativo que consuma uma API, salve dados localmente e tenha um login funcional, rodando tanto em Mobile quanto em Web.
🛠️ Requisitos
- Persistência de Dados (SQLite ou SharedPreferences).
- Consumo de API (HTTP).
- Gerenciamento de Estado Global (Provider).
- Navegação com Rotas Nomeadas.
- Layout Responsivo (Mobile + Web).
💡 Dica
Documente bem o seu código e faça um bom README.md no seu GitHub explicando como rodar o projeto. Isso conta muito no seu portfólio!
Quizzes
Quizzes Interativos 🧠
Teste seus conhecimentos rapidamente ao final de cada aula.
-
Módulo 1: Fundamentos ---
-
Módulo 2: Interfaces ---
-
Módulo 3: Lógica ---
-
Módulo 4: Prática ---
Quiz 01
Quiz 02
Quiz 03
Quiz 04
Quiz 05
Quiz 06
Quiz 07
Quiz 08
Quiz 09
Quiz 10
Quiz 11
Quiz 12
Quiz 13
Quiz 14
Quiz 15
Quiz 16
Slides
Slides 📺
Material visual para acompanhamento das vídeo-aulas.
-
Módulo 1 ---
-
Módulo 2 ---
-
Módulo 3 ---
-
Módulo 4 ---
Configuração
Ambientes de Desenvolvimento 🛠️
Guias para configurar seu computador para o desenvolvimento mobile.
-
Android --- Instalação do Android Studio, SDK e emuladores.
-
iOS (Opcional/Referência) --- Configuração básica de Xcode e ferramentas Mac.
-
Ferramentas de Apoio --- Git, Terminais e Postman/Insomnia para testes de API.
Setup 01: Android Studio 🤖
O Android Studio é a IDE oficial para o desenvolvimento Android.
1. Requisitos de Sistema
- RAM: Mínimo 8GB (Sugerido 16GB+).
- Espaço: Mínimo 10GB para IDE + SDKs.
- Processador: Intel Core i5 ou equivalente.
2. Instalação
- Acesse o site oficial: developer.android.com/studio.
- Baixe a versão mais recente para o seu Sistema Operacional.
- Execute o instalador e escolha a opção "Standard" na configuração inicial.
3. Configurando o SDK
- Após a instalação, vá em Settings > Languages & Frameworks > Android SDK.
- Certifique-se de que a versão mais recente do Android (estável) esteja instalada.
- Na aba SDK Tools, instale o "Android Emulator" e o "Intel x86 Emulator Accelerator (HAXM)" se estiver no Windows com Intel.
4. Criando um Emulador (AVD)
- Abra o Device Manager.
- Clique em Create Device.
- Escolha um dispositivo (ex: Pixel 7).
- Selecione uma imagem de sistema (ex: Level 34 - Android 14).
- Finalize e clique no "Play" para iniciar o celular virtual.
5. Solução de Problemas ⚠️
- VT-x is disabled: Você precisa habilitar a virtualização na BIOS do seu computador.
- Studio muito lento: Adicione a pasta do projeto e as pastas do Android SDK nas exclusões do seu Antivírus.
Setup 02: Xcode (iOS Foundation) 🍎
O Xcode é a ferramenta necessária para compilar e testar apps iOS.
[!IMPORTANT] O Xcode requer um computador Mac (macOS).
1. Instalação
- Abra a App Store no seu Mac.
- Pesquise por Xcode.
- Clique em Obter/Instalar.
- Após o download, abra o Xcode para carregar os componentes adicionais do macOS.
2. Configurando Simuladores
- Vá em Settings > Platforms.
- Verifique se o componente "iOS" está baixado.
- Se não estiver, clique em "GET" para baixar a versão mais estável.
3. Comandos de Linha (CLI)
Para que ferramentas de automação funcionem, você precisa instalar os Command Line Tools:
4. Opcional: CocoaPods
Muitos projetos iOS antigos ainda usam CocoaPods para dependências:
5. Solução de Problemas ⚠️
- Espaço em Disco: O Xcode é muito grande. Garanta pelo menos 40GB de espaço livre para ele e os simuladores.
- Build Lento: Use simuladores de modelos mais simples (ex: iPhone SE) para poupar memória RAM se necessário.
Sobre
Sobre o Curso
🎓 Desenvolvimento Multiplataforma Profissional
Este curso foi projetado para capacitar desenvolvedores na criação de aplicações modernas utilizando o Flutter, focando na produtividade de manter uma única base de código para Mobile, Web e Desktop.
🎯 Objetivos do Curso
-
:material-language-dart: Domínio do Dart --- Compreender a sintaxe moderna, null safety e programação assíncrona necessária para o Flutter.
-
Padrões de Widgets --- Dominar a composição de interfaces reativas utilizando Widgets Stateless e Stateful.
-
Gestão de Estado & Dados --- Implementar fluxos de dados eficientes com Provider e integração com bases de dados locais e remotas.
-
Entrega Multiplataforma --- Aprender as nuances de build e publicação para Android, Web, Windows e Linux.
📚 O Que Você Vai Aprender
🟢 Módulo 1 – Fundamentos (Base Técnica)
- Ecossistema Flutter e Instalação
- Linguagem Dart para Iniciantes
- Estrutura de Projetos e Pubspec
- Widgets: A Base de Tudo
🟡 Módulo 2 – Construção de Interfaces (UI/UX)
- Layouts (Column, Row, Container)
- Componentes Visuais do Material Design
- Navegação entre Telas e Parâmetros
- Formulários, Validação e Controllers
🔵 Módulo 3 – Lógica e Dados
- Gerenciamento de Estado com Provider
- Consumo de APIs REST (HTTP & JSON)
- Persistência com SQLite e SharedPrefs
- Organização Profissional (Layers)
🟣 Módulo 4 – Multiplataforma na Prática
- Publicando para Android (Build APK)
- Flutter Web e Responsividade
- Aplicações Desktop e Empacotamento
- Projeto Final Integrador
🛠️ Metodologia
Foco 100% prático e orientado a projetos. Cada aula apresenta um desafio real que culmina em mini-projetos funcionais, preparando o aluno para o mercado de trabalho multiplataforma.
Pronto para dominar o Flutter? Começar Agora
Roadmap do Projeto: Flutter Multiplataforma 🚀
Este documento rastreia a evolução e manutenção do curso.
✅ Fase 1: Planejamento (Concluído)
- [x] Definição Syllabus (16 Aulas)
- [x] Estrutura Multiplataforma (Mobile, Web, Desktop)
- [x] Configuração MkDocs Material com RevealJS
[/] Fase 2: Conteúdo Base (Em Progresso)
- [x] Estruturação das 16 Aulas (Markdown)
- [ ] Refatoração Visual (Mermaid, Termynal, Admonitions)
- [ ] Tradução e Revisão 100% PT-BR
- [ ] Validação de Quizzes e Exercícios
🚀 Fase 3: Validação e Lançamento
- [ ] Build Strict sem erros
- [ ] Teste de links e renderização MathJax
- [ ] Deploy GitHub Pages (Branch gh-pages)
Status Atual: Migração de Conteúdo / Refatoração Última Atualização: 21/02/2026
Materiais Complementares 📚
Bem-vindo à seção de materiais complementares do curso de Desenvolvimento Multiplataforma com Flutter. Aqui você encontra recursos adicionais para apoiar seus estudos.
-
- Acompanhe o conteúdo teórico com slides dinâmicos em RevealJS.
-
- Pratique Dart e Flutter com desafios progressivos.
-
- Valide seu aprendizado com testes rápidos interativos.
-
- Construa aplicativos reais para seu portfólio.
-
- Guias de instalação (Flutter SDK, VS Code, Emuladores).
Versão para Impressão
Esta página foi gerada automaticamente para impressão.