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

Rocketseat

Rocketseat

9 min de leitura
CSharp
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.
  1. Abra o Visual Studio Installer (você pode procurá-lo no menu iniciar).
  1. Encontre sua instalação do Visual Studio 2022 e clique em modificar.
  1. Na tela que abrir, vá para a aba cargas de trabalho.
  1. 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.
  1. 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.
  1. Abra seu terminal de preferência (prompt de comando, PowerShell, Windows Terminal).
  1. 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 VerticalStackLayout para empilhar os elementos verticalmente.
  • Adicionamos um Entry (campo de entrada) chamado NovaTarefaEntry para a pessoa usuária digitar a tarefa.
  • Um Button (botão) que, ao ser clicado (Clicked), vai chamar um método OnAddTaskClicked no nosso código C#.
  • Um CollectionView, que é o componente perfeito para mostrar listas de dados.
  • Dentro dele, definimos um ItemTemplate para dizer como cada item da lista deve ser exibido: um Label (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

  1. Na barra de ferramentas do Visual Studio, encontre o menu suspenso de depuração (geralmente mostra "windows machine").
  1. 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.
  1. 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.
  1. No Visual Studio, vá em ferramentas > iOS > emparelhar com Mac. Siga as instruções para conectar o VS ao seu Mac.
  1. Uma vez conectado, volte para o menu suspenso de depuração. Agora você verá a opção simuladores de iOS.
  1. Escolha um simulador da lista, como um iPhone 14.
  1. 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.

Rocketseat

Rocketseat

Ecossistema de educação contínua referência em programação e Inteligência Artificial.

Artigos_

Explore conteúdos relacionados

Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.

Imagem contendo uma carta e um símbolo de check
NewsletterReceba conteúdos inéditos e novidades gratuitamente