.NET MAUI: do zero ao seu primeiro app multiplataforma com C#

Rocketseat

Conheça o Rocketseat Para Empresas
Oferecemos soluções personalizadas para empresas de todos os portes.
Fala, Dev! 👋
Se você já pensou em criar um aplicativo, provavelmente se deparou com uma encruzilhada: desenvolvo para iOS ou para Android? A resposta tradicionalmente era dolorosa: aprender duas linguagens diferentes, dominar dois ambientes de desenvolvimento e manter duas bases de código separadas para alcançar todo o público. Parece um esforço dobrado, não é? E se a gente te dissesse que existe uma forma de unificar esses mundos, usando uma linguagem que você talvez já conheça e ama?
É aqui que entra o nosso trunfo: o .NET MAUI (Multi-platform App UI). É como a evolução natural e superpoderosa do que um dia foi o Xamarin.Forms, agora totalmente integrado ao ecossistema .NET moderno. A promessa é clara e poderosa: escreva seu código uma vez em C# e XAML e veja seu aplicativo rodar nativamente em Android, iOS, Windows e até macOS.
Nossa missão juntos, nesta jornada, é construir do zero um aplicativo de lista de tarefas (a famosa to-do list). Simples, mas funcional. Ao final, você terá um app rodando em emuladores de Android e iOS, tudo a partir de um único projeto e uma única base de código. Não se preocupe se você nunca tocou em desenvolvimento mobile antes.
Vamos juntos, passo a passo, explorar esse universo e colocar seu primeiro app no mundo. Bora codar? ⚡
Por que .NET MAUI? O poder do C# no seu bolso
Antes de colocarmos a mão na massa, é importante entender por que o .NET MAUI é uma escolha tão interessante hoje. Ele não é apenas uma ferramenta nova, mas o resultado de anos de aprendizado da Microsoft no mundo multiplataforma.
A jornada começou com o Xamarin.Forms, que foi um grande passo, mas o .NET MAUI eleva o jogo. Ele foi reconstruído do zero, com foco total em performance e produtividade, integrando-se de forma profunda ao ecossistema .NET. Vamos ver as vantagens que fazem a diferença no dia a dia.
Vantagem 1: projeto único para dominar todos
Quem trabalhou com Xamarin lembra da estrutura com múltiplos projetos: um para o código compartilhado, um para Android, um para iOS. Era uma organização que funcionava, mas que podia se tornar complexa. O .NET MAUI simplifica isso drasticamente com o conceito de single project (projeto único).
Agora, tudo vive em um único projeto. Recursos como imagens, fontes e ícones são colocados em uma única pasta (Resources) e o próprio MAUI se encarrega de adaptá-los para cada plataforma. O código específico de cada sistema, se for preciso, fica organizado em subpastas dentro de Platforms, mantendo tudo limpo e centralizado.
Vantagem 2: performance nativa de verdade
Uma dúvida comum sobre frameworks multiplataforma é a performance. "Isso não vai deixar meu app lento?". Com o .NET MAUI, a resposta é não. Ele não cria uma visualização web (uma webview) para rodar seu app. Em vez disso, seu código C# e sua interface descrita em XAML são compilados para controles e APIs 100% nativas de cada plataforma.
Uma das grandes mudanças técnicas por trás disso é a mudança da arquitetura de renderers (usada no Xamarin) para handlers. Os handlers são uma abordagem mais leve, desacoplada e performática para "desenhar" os componentes na tela, o que resulta em apps mais rápidos e uma arquitetura mais fácil de customizar.
Vantagem 3: produtividade com .NET hot reload
Essa funcionalidade parece mágica e acelera o desenvolvimento de uma forma incrível. Com o .NET hot reload (recarga rápida), você pode fazer alterações no seu código, tanto na interface (XAML) quanto na lógica (C#), com o aplicativo rodando no emulador. Ao salvar o arquivo, as mudanças aparecem instantaneamente, sem a necessidade de parar, recompilar e iniciar o app de novo. Isso permite experimentar com layouts, cores e lógicas de forma muito mais fluida e rápida.
E o melhor de tudo: você faz isso usando C# e todo o poder do ecossistema .NET que já conhecemos do backend e do desktop. Precisa consumir uma API? O
HttpClient está lá. Precisa de acesso a um banco de dados? Bibliotecas como o Entity Framework Core ou SQLite funcionam perfeitamente. O C# se torna a linguagem universal para construir qualquer tipo de aplicação.Xamarin.Forms vs. .NET MAUI: a evolução em resumo tabelado
Para deixar as diferenças mais claras, veja uma comparação da evolução do Xamarin.Forms para o .NET MAUI.
característica | Xamarin.Forms | .NET MAUI |
Estrutura do projeto | Múltiplos projetos (um compartilhado + um por plataforma) | Projeto único com pastas para código específico da plataforma |
Arquitetura de UI | Renderers (fortemente acoplados) | Handlers (leves, desacoplados e mais performáticos) |
Inicialização do app | Específica por plataforma (ex: MainActivity.cs no Android) | Ponto de entrada unificado (MauiProgram.cs) |
Gerenciamento de recursos | Recursos (imagens, fontes) duplicados em cada projeto de plataforma | Repositório único de recursos na pasta Resources com redimensionamento automático |
APIs de dispositivo | Biblioteca separada (Xamarin.Essentials) | Integrado nativamente no framework (Microsoft.Maui.Essentials) |
Hot reload | Suporte limitado/experimental para C# | Suporte completo para XAML e .NET hot reload |
Configurando seu ambiente
Toda jornada começa com o primeiro passo, e no nosso caso, é garantir que o ambiente de desenvolvimento esteja pronto. A configuração pode, às vezes, ser a parte mais desafiadora, mas vamos passar por ela juntos.
Pré-requisitos
Você vai precisar do Visual Studio (a versão Community é gratuita e perfeita para começar) instalado no Windows. Se você usa macOS, pode usar o Visual Studio Code com as extensões C# Dev Kit e .NET MAUI. Além disso, certifique-se de ter o SDK do .NET mais recente instalado.
Passo a passo no Visual Studio (Windows)
Este é o caminho mais direto para quem está no Windows.
- Abra o Visual Studio Installer (você pode procurá-lo no menu iniciar).
- Encontre sua instalação do Visual Studio 2022 e clique em modificar.
- Na tela que abrir, vá para a aba cargas de trabalho.
- Marque a caixa "Desenvolvimento de interface do usuário de aplicativo multiplataforma .NET". As dependências importantes, como os SDKs do Android, serão selecionadas automaticamente.
- Clique em modificar no canto inferior direito e aguarde a instalação terminar.
Alternativa: instalação via linha de comando
Se você prefere o terminal ou está usando o VS Code, pode instalar a carga de trabalho do MAUI com um simples comando.
- Abra seu terminal de preferência (prompt de comando, PowerShell, Windows Terminal).
- Digite o seguinte comando e pressione Enter:
dotnet workload install maui
Este comando vai baixar e instalar tudo que é preciso para compilar projetos .NET MAUI. Para ter certeza de que tudo correu bem, você pode rodar
dotnet workload list e verificar se maui aparece na lista de cargas de trabalho instaladas.Atenção: se você está no Windows e usa o Visual Studio, o método recomendado é usar o Visual Studio Installer. Misturar instalações via installer e via linha de comando pode, em alguns casos, criar conflitos e fazer com que o Visual Studio não encontre os pacotes corretamente. Use um método ou outro para garantir a consistência.
Criando nosso primeiro projeto
Com o ambiente pronto, vamos criar o esqueleto do nosso app.
- No Visual Studio: vá em arquivo > novo > projeto. Na janela de criação, filtre os modelos por "MAUI" e selecione a opção Aplicativo .NET MAUI. Dê um nome para o seu projeto, como
MinhaListaDeTarefas, e clique em criar.
- Via linha de comando: navegue pelo terminal até a pasta onde você quer criar o projeto e rode o comando:
dotnet new maui -n MinhaListaDeTarefas
Pronto! A estrutura inicial do nosso app está criada. Se algo deu errado até aqui, não desista! Problemas de configuração são comuns e fazem parte da vida de quem desenvolve. Respire fundo, revise os passos e lembre-se que a comunidade de C# e .NET é gigante e sempre disposta a ajudar.
Anatomia de um app .NET MAUI: o que acontece por baixo do capô?
Ao abrir o projeto recém-criado, você verá uma série de pastas e arquivos. Vamos dar uma olhada nos mais importantes para entender como a mágica acontece.
MauiProgram.cs: este é o centro e o ponto de partida do seu aplicativo. É onde o aplicativo é configurado; a execução inicia em pontos específicos por plataforma que chamam essa configuração. É aqui, usando um padrão de builder muito familiar para quem vem do ASP.NET Core, que o app é configurado. Registramos fontes, configuramos serviços para injeção de dependência e dizemos ao MAUI qual é a página inicial da nossa aplicação. Essa familiaridade é proposital, unificando a experiência de desenvolvimento em todo o ecossistema .NET.
- Pasta Platforms: Imagine esta pasta como sua "saída de emergência". 95% do tempo, você não vai precisar mexer aqui. Mas se um dia você precisar escrever um código que só funciona em Android ou que acessa uma API específica do iOS, é aqui que esse código vai morar.
- Pasta Resources: este é o nosso baú de tesouros compartilhados. Tudo que é visual e comum a todas as plataformas fica aqui.
- Images: coloque suas imagens aqui, de preferência em formato SVG. O .NET MAUI faz algo fantástico: ele pega esse único arquivo SVG e, durante a compilação, gera automaticamente todas as versões e tamanhos adequados para cada densidade de tela do Android e do iOS. Adeus, trabalho manual e repetitivo!
- Fonts: para adicionar fontes customizadas ao seu app.
- Styles: um local para centralizar estilos, como cores e tamanhos de fonte, garantindo uma identidade visual consistente.
A dupla dinâmica: MainPage.xaml e MainPage.xaml.cs
MainPage.xaml: este é o arquivo que descreve a aparência da sua tela. Ele usa uma linguagem de marcação chamada XAML, que é muito parecida com HTML. É aqui que vamos "desenhar" nossa interface, adicionando botões, campos de texto e a lista.
MainPage.xaml.cs: este é o "cérebro" por trás da interface, também conhecido como code-behind. É um arquivo C# onde escrevemos a lógica. O que acontece quando um botão é clicado? A resposta para essa pergunta estará no código deste arquivo.
Mão na massa: construindo nossa to-do list
Chegou a hora mais esperada! Vamos transformar aquele projeto vazio em um aplicativo de lista de tarefas funcional.
Parte 1: desenhando a interface em XAML
Abra o arquivo
MainPage.xaml e substitua todo o conteúdo que veio no template pelo código abaixo. Ele vai criar a estrutura visual da nossa to-do list.<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MinhaListaDeTarefas.MainPage" Title="Minha Lista de Tarefas"> <VerticalStackLayout Spacing="10" Padding="20"> <Label Text="Minhas Tarefas 📝" FontSize="24" FontAttributes="Bold" HorizontalOptions="Center" /> <HorizontalStackLayout Spacing="10"> <Entry x:Name="NovaTarefaEntry" Placeholder="Digite uma nova tarefa" HorizontalOptions="FillAndExpand" /> <Button Text="Adicionar" Clicked="OnAddTaskClicked" WidthRequest="100"/> </HorizontalStackLayout> <CollectionView x:Name="TarefasCollectionView"> <CollectionView.ItemTemplate> <DataTemplate> <Grid Padding="5" ColumnDefinitions="*,Auto"> <Label Text="{Binding Texto}" VerticalOptions="Center"/> <Button Grid.Column="1" Text="Remover" Clicked="OnRemoveTaskClicked" CommandParameter="{Binding .}"/> </Grid> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> </VerticalStackLayout> </ContentPage>
O que fizemos aqui?
- Usamos um
VerticalStackLayoutpara empilhar os elementos verticalmente.
- Adicionamos um
Entry(campo de entrada) chamadoNovaTarefaEntrypara a pessoa usuária digitar a tarefa.
- Um
Button(botão) que, ao ser clicado (Clicked), vai chamar um métodoOnAddTaskClickedno nosso código C#.
- Um
CollectionView, que é o componente perfeito para mostrar listas de dados.
- Dentro dele, definimos um
ItemTemplatepara dizer como cada item da lista deve ser exibido: umLabel(rótulo) com o texto da tarefa e um botão "Remover".
Note o
{Binding Texto}. Isso é data binding (vinculação de dados), a "cola" que vai conectar este label a uma propriedade chamada Texto no nosso objeto de tarefa em C#.Parte 2: dando vida com C# 😂
Agora, vamos para o
MainPage.xaml.cs. É aqui que a mágica da interatividade acontece.Primeiro, precisamos de um modelo para representar uma tarefa. Crie uma nova classe no seu projeto chamada
Tarefa.cs:// Tarefa.cs public class Tarefa { public int Id { get; set; } public string Texto { get; set; } }
Agora, vamos ao
MainPage.xaml.cs. Apague o código de exemplo e substitua pelo seguinte:// MainPage.xaml.cs using System.Collections.ObjectModel; namespace MinhaListaDeTarefas; public partial class MainPage : ContentPage { // Usamos ObservableCollection para que a UI atualize automaticamente public ObservableCollection<Tarefa> Tarefas { get; set; } private int proximoId = 1; public MainPage() { InitializeComponent(); // Inicializamos a coleção Tarefas = new ObservableCollection<Tarefa>(); // Conectamos a coleção à nossa CollectionView no XAML TarefasCollectionView.ItemsSource = Tarefas; } private void OnAddTaskClicked(object sender, EventArgs e) { // A Laís pediu para adicionar essa validação :) if (!string.IsNullOrWhiteSpace(NovaTarefaEntry.Text)) { // Adicionamos a nova tarefa à coleção Tarefas.Add(new Tarefa { Id = proximoId++, Texto = NovaTarefaEntry.Text }); // Limpamos o campo de entrada NovaTarefaEntry.Text = string.Empty; } } private void OnRemoveTaskClicked(object sender, EventArgs e) { // Pegamos o botão que foi clicado var botao = sender as Button; // O CommandParameter que definimos no XAML nos dá o objeto Tarefa var tarefaParaRemover = botao?.CommandParameter as Tarefa; if (tarefaParaRemover != null) { Tarefas.Remove(tarefaParaRemover); } } }
Por que ObservableCollection?
Você deve ter notado que não usamos uma
List<Tarefa>, mas sim uma ObservableCollection<Tarefa>. Por quê? Uma lista comum não notifica a interface quando algo muda. Se usássemos uma List, teríamos que escrever código manual para atualizar a CollectionView toda vez que uma tarefa fosse adicionada ou removida.A
ObservableCollection é uma lista "inteligente". Ela implementa interfaces especiais (como INotifyCollectionChanged) que disparam um evento sempre que a coleção é alterada. O CollectionView do .NET MAUI "ouve" esses eventos e se atualiza na tela automaticamente. É isso que cria a experiência fluida que a pessoa usuária espera.Este é o primeiro passo para arquiteturas mais robustas como o MVVM (Model-View-ViewModel), um padrão muito usado em .NET MAUI que separa a lógica de apresentação (o ViewModel) da interface (a View). A
ObservableCollection é a peça-chave que permite essa separação.Testando em duas telas: a mágica do multiplataforma
Agora vem a parte mais legal: ver nosso código único rodando em dois sistemas operacionais diferentes.
Rodando no Android
- Na barra de ferramentas do Visual Studio, encontre o menu suspenso de depuração (geralmente mostra "windows machine").
- Clique nele e vá em emuladores Android > emulador Android. Se for a primeira vez, o Visual Studio pode pedir para criar um emulador padrão para você. Aceite e aguarde o processo, que pode demorar um pouco.
- Com o emulador selecionado, clique no botão verde de "play" (iniciar).
O Visual Studio vai compilar o projeto, iniciar o emulador e instalar seu aplicativo. Em instantes, você verá sua to-do list funcionando!
Rodando no iOS (a partir do Windows)
Para compilar e testar em um simulador de iOS a partir do Windows, existe um pré-requisito importante: você precisa de um Mac na mesma rede que o seu computador Windows. Isso acontece porque a compilação final de um app iOS exige ferramentas da Apple (como o Xcode) que só rodam no macOS.
- No Visual Studio, vá em ferramentas > iOS > emparelhar com Mac. Siga as instruções para conectar o VS ao seu Mac.
- Uma vez conectado, volte para o menu suspenso de depuração. Agora você verá a opção simuladores de iOS.
- Escolha um simulador da lista, como um iPhone 14.
- Clique no botão de "play".
O Visual Studio vai enviar o código para o Mac, que fará a compilação, e então o simulador do iOS vai abrir diretamente na sua tela do Windows, graças ao Remote iOS Simulator. É uma experiência fantástica! 🤩
Dica rápida de debug
Se algo não estiver funcionando como esperado, você pode usar breakpoints (pontos de interrupção). Clique na margem cinza à esquerda do seu código C#, ao lado de uma linha (por exemplo, dentro do método
OnAddTaskClicked). Uma bolinha vermelha vai aparecer. Quando você rodar o app e a execução chegar naquela linha, tudo vai pausar. Você poderá então passar o mouse sobre as variáveis (como NovaTarefaEntry.Text) para inspecionar seus valores e entender o que está acontecendo.Conclusão: você deu o primeiro passo!
Parabéns, Dev! 👏 Você conseguiu!
Você não apenas aprendeu sobre .NET MAUI, você construiu, do zero, um aplicativo que funciona em Android e iOS.
Nesta jornada, nós configuramos o ambiente, entendemos a estrutura de um projeto MAUI, construímos uma interface com XAML, programamos a lógica com C# e
ObservableCollection, e testemunhamos a mágica do desenvolvimento multiplataforma.Este projeto é a prova de que "é possível começar". O que parecia complexo agora são conceitos que você entende e aplicou. Este é o seu primeiro passo em uma jornada incrível no desenvolvimento mobile com C#.
E agora? Qual seria a primeira funcionalidade que você adicionaria a essa to-do list? Marcar tarefas como concluídas? Salvar os dados no dispositivo? Compartilhe suas ideias nos comentários abaixo!
Próximo nível: sua carreira com C# 🚀
Construir essa to-do list foi só o começo. O que você acabou de fazer foi mais do que um app: você usou suas habilidades C# — que talvez você já usasse no backend — para criar uma aplicação mobile nativa para iOS e Android. Você unificou os mundos.
Este é o poder do ecossistema .NET, e o mercado procura exatamente por esse profissional: o desenvolvedor C# completo, que domina do backend à nuvem e, agora, ao mobile.
A Formação em .NET MAUI da Rocketseat é o caminho completo para te levar do zero à maestria. Você não vai apenas assistir a aulas, vai aprender na prática desenvolvendo projetos que o mercado exige, dominando arquitetura em camadas, SOLID, testes e deploy na nuvem com Azure.
Se você quer deixar de ser um especialista em "partes" e se tornar um mestre da stack .NET completa, a Formação C# é o seu próximo nível. Bora juntos?
Conheça o Rocketseat Para Empresas
Oferecemos soluções personalizadas para empresas de todos os portes.
Artigos_
Explore conteúdos relacionados
Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.
NewsletterReceba conteúdos inéditos e novidades gratuitamente