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 - Introdução ao Desenvolvimento Multiplataforma 📱
Quiz 02 - Linguagem Dart para Iniciantes 🎯
nome for nulo.">Fornecer um valor padrão caso o operando da esquerda seja nulo.nome for nulo.">Forçar uma variável a ser nula.nome for nulo.">Multiplicar dois valores.Quiz 03 - Estrutura de um Projeto Flutter 🏗️
Quiz 04 - Widgets Básicos 🧱
Quiz 05 - Layouts e Organização Visual 🎨
Quiz 06 - Componentes Visuais 🖼️
GestureDetector ou InkWell.makeClickable: true.Quiz 07 - Navegação entre Telas 🛣️
Quiz 08 - Formulários e Validação 📝
Quiz 09 - Gerenciamento de Estado 🔄
Quiz 10 - Consumo de APIs REST 📡
Quiz 11 - Persistência de Dados 💾
Quiz 12 - Organização Profissional do Projeto 🏛️
Quiz 13 - Publicando para Android 🤖
Quiz 14 - Publicando para Web 🌐
Quiz 15 - Aplicações Desktop 💻
Quiz 16 - Revisão Final 🎓
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.