MaterialApp é o widget raiz no Flutter que configura o Material Design para toda a aplicação. Ele fornece configuração centralizada de roteamento, tematização, localização e navegação, adicionando automaticamente componentes como Navigator, Theme e MediaQuery à Widget Tree. De acordo com a Referência da API Flutter, 2025, o MaterialApp é um widget obrigatório para qualquer aplicação Flutter que utilize Material Design e define configurações globais disponíveis em toda a árvore de widgets.
Pontos principais
MaterialApp é um widget wrapper que inicializa o Material Design numa aplicação Flutter. É a raiz da Widget Tree e fornece aos widgets filhos acesso a serviços do sistema: navegação, tema, media queries e localização. Sem MaterialApp, a aplicação não terá o estilo Material padrão e não poderá usar widgets como Scaffold, AppBar, FloatingActionButton e BottomNavigationBar.
Ao usar MaterialApp, o Flutter adiciona automaticamente vários widgets-chave à raiz da árvore: Navigator (pilha de ecrãs para navegação), Theme (esquema de cores e estilos), MediaQuery (informação do dispositivo), Localizations (strings localizadas), Directionality (direção do texto). Estes widgets são implementados como InheritedWidgets e são acessíveis através de BuildContext em qualquer parte da aplicação.
A configuração mínima do MaterialApp requer apenas o parâmetro home — o widget exibido no ecrã principal. O Flutter envolve automaticamente home num Scaffold se este ainda não for um Scaffold, através do mecanismo WidgetsBinding. Quando inicia a aplicação com runApp(MaterialApp(home: MyHomePage())), o Flutter cria uma Widget Tree raiz com MaterialApp como raiz.
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "My Application",
theme: ThemeData(
primarySwatch: Colors.blue,
fontFamily: "Roboto",
),
darkTheme: ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
Neste exemplo, o MaterialApp configura o tema básico (claro e escuro), título e ecrã principal. O parâmetro title é usado para o título da janela (no desktop) e para acessibilidade. Os parâmetros theme e darkTheme definem a aparência da aplicação em diferentes modos.
MaterialApp aceita mais de 30 parâmetros, que se dividem em categorias: configurações de Material Design, roteamento, tematização, localização, comportamento de erros e configurações específicas de plataforma. Conhecer os parâmetros-chave permite configurar a aplicação de forma flexível sem escrever código adicional.
O parâmetro title define o nome da aplicação para o título da janela e acessibilidade. color define a cor da aplicação para o alternador de tarefas no Android. debugShowCheckedModeBanner oculta o banner de modo de depuração em builds de lançamento. showPerformanceOverlay ativa uma sobreposição com informações de desempenho. supportDarkTheme indica se a aplicação suporta o tema escuro.
MaterialApp fornece parâmetros para configurar o comportamento em diferentes plataformas: restorationScopeId para preservar o estado da aplicação ao reiniciar no Android, scrollBehavior para configurar o comportamento de scroll em diferentes SO, useMaterial3 para ativar o Material 3 (Material You). O Material 3 adiciona cores dinâmicas, novos componentes e estilos atualizados.
| Parâmetro | Tipo | Finalidade |
|---|---|---|
| title | String | Título da janela da aplicação |
| theme | ThemeData | Configuração do tema claro |
| darkTheme | ThemeData | Configuração do tema escuro |
| home | Widget | Ecrã principal da aplicação |
| routes | Map<String, WidgetBuilder> | Mapa de rotas nomeadas |
| locale | Locale | Localidade forçada da aplicação |
A tematização é um dos principais parâmetros do MaterialApp. O parâmetro theme aceita um objeto ThemeData que define a paleta de cores, tipografia, formas de componentes e iconografia para o tema claro. O parâmetro darkTheme é a configuração equivalente para o tema escuro. O Flutter alterna automaticamente o tema com base nas definições do sistema do dispositivo.
ThemeData inclui primarySwatch (cor primária), colorScheme (esquema de cores estendido do Material 3), brightness (claro ou escuro), fontFamily (fonte padrão), textTheme (estilos de texto), cardTheme, appBarTheme, buttonTheme e dezenas de outros parâmetros para personalizar componentes específicos. Use colorScheme para Material 3 e primarySwatch para Material 2.
O Material 3 (Material You) suporta cores dinâmicas, extraídas do papel de parede do dispositivo no Android 12+. Para ativar, defina useMaterial3: true e use colorScheme.fromSeed ou colorScheme.fromImageProvider. As cores dinâmicas geram automaticamente uma paleta harmoniosa de 5 tons: primary, secondary, tertiary, neutral e neutralVariant.
Qualquer widget pode aceder ao tema atual através de Theme.of(context). Theme.of devolve um objeto ThemeData do qual pode obter colors, textTheme e outros parâmetros. Para subscrever alterações de tema (por exemplo, ao alternar entre modo claro e escuro), use o contexto dentro do método build — o Flutter reconstruirá automaticamente o widget quando o tema mudar.
Container(
color: Theme.of(context).colorScheme.primary,
child: Text(
"Themed text example",
style: Theme.of(context).textTheme.headlineMedium,
),
)
Neste exemplo, Theme.of(context) obtém o tema atual do MaterialApp mais próximo. A cor de fundo e o estilo de texto correspondem automaticamente ao tema atual (claro ou escuro). Ao alternar o tema, o Container e o Text serão reconstruídos com novos valores do ThemeData atualizado.
MaterialApp integra o Navigator — um navegador baseado em pilha que gerencia as transições entre ecrãs. Os parâmetros initialRoute, routes e onGenerateRoute determinam como o Flutter lida com a navegação. Navigator.push e Navigator.pushReplacement permitem alternar ecrãs programaticamente, enquanto Navigator.pop permite voltar atrás.
O parâmetro routes aceita um Map<String, WidgetBuilder>, onde a chave é o nome da rota (string) e o valor é uma função que cria o widget para esse ecrã. As rotas nomeadas são convenientes para navegação estática: '/' (rota raiz) geralmente corresponde a home, '/settings', '/profile' — outros ecrãs. Navigator.pushNamed(context, '/settings') navega para o ecrã de definições.
onGenerateRoute é uma função chamada quando uma rota não é encontrada em routes. Aceita RouteSettings e devolve um MaterialPageRoute. Esta abordagem é útil para navegação dinâmica quando as rotas dependem de dados (por exemplo, /user/42). onGenerateRoute analisa o nome da rota, extrai parâmetros e cria o ecrã apropriado.
Para suportar links profundos (deep links), use os parâmetros onGenerateInitialRoute e onGenerateRoute juntos. Os links profundos permitem abrir um ecrã específico da aplicação através de um URL (por exemplo, https://example.com/promo). O Flutter lida com links profundos no Android (através de intent filters) e no iOS (através de universal links) e passa o caminho para onGenerateRoute.
MaterialApp(
initialRoute: "/",
routes: {
"/": (context) => const HomePage(),
"/settings": (context) => const SettingsPage(),
},
onGenerateRoute: (settings) {
if (settings.name?.startsWith("/user/") == true) {
final userId = settings.name!.split("/").last;
return MaterialPageRoute(
builder: (_) => UserPage(userId: userId),
);
}
return null;
},
)
Neste exemplo, onGenerateRoute lida com rotas dinâmicas como /user/42. Se a rota não for encontrada nas rotas estáticas e não corresponder ao padrão dinâmico, o Flutter exibe uma página de erro, que pode ser personalizada através de onUnknownRoute.
MaterialApp fornece suporte integrado de localização através dos parâmetros localizationsDelegates e supportedLocales. LocalizationsDelegates carregam as strings localizadas, e supportedLocales determina quais idiomas a aplicação suporta. O Flutter deteta automaticamente o idioma do dispositivo e carrega os recursos localizados correspondentes.
O parâmetro supportedLocales aceita uma lista de Locales que a aplicação suporta: [const Locale('en'), const Locale('ru'), const Locale('de')]. localizationsDelegates é uma lista de delegados que carregam as strings localizadas. Para Material Design, adicione GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate e GlobalCupertinoLocalizations.delegate.
Para localizar as suas próprias strings, use a classe AppLocalizations, criada através de flutter_localizations ou do pacote intl. AppLocalizations fornece métodos estáticos para aceder às strings localizadas: AppLocalizations.of(context)!.helloMessage. O MaterialApp passa automaticamente Localizations para a Widget Tree, tornando-as acessíveis através do contexto.
O Flutter fornece três widgets raiz para diferentes plataformas: MaterialApp (Material Design para Android e web), CupertinoApp (estilo iOS) e WidgetsApp (widget básico sem estilo). A escolha do widget raiz determina a aparência de toda a aplicação e a disponibilidade de componentes específicos da plataforma.
MaterialApp é adequado para a maioria das aplicações graças ao suporte do Material Design, que tem ótimo aspeto no Android, web e desktop. O Material Design oferece uma biblioteca rica de componentes: Scaffold, AppBar, BottomNavigationBar, Drawer, SnackBar, Dialog e muitos outros. O MaterialApp também suporta Material 3 com cores dinâmicas.
CupertinoApp usa o Cupertino Design, que segue as Diretrizes de Interface Humana da Apple. Fornece CupertinoPageScaffold, CupertinoNavigationBar, CupertinoTabBar e outros componentes com estilo iOS. Use CupertinoApp para aplicações iOS ou aplicações que seguem o estilo Apple em todas as plataformas.
WidgetsApp é o widget raiz básico sem estilo. Adiciona Navigator, MediaQuery e Localizations, mas não fornece temas ou componentes Material/Cupertino. WidgetsApp é adequado para sistemas de design personalizados, jogos ou aplicações com estilo próprio onde Material ou Cupertino são excessivos.
| Widget raiz | Sistema de design | Quando usar |
|---|---|---|
| MaterialApp | Material Design (Google) | Android, web, desktop, aplicações multiplataforma |
| CupertinoApp | Cupertino (Apple HIG) | Aplicações iOS, estilo Apple em todas as plataformas |
| WidgetsApp | Sem estilo | Design personalizado, jogos, sistemas de design próprios |
Perguntas frequentes
Não é obrigatório — pode usar CupertinoApp para estilo iOS ou WidgetsApp para design personalizado. O MaterialApp é obrigatório se usar widgets Material: Scaffold, AppBar, FloatingActionButton e outros.
Use os parâmetros theme (tema claro) e darkTheme (tema escuro). O Flutter alterna automaticamente o tema com base nas definições do sistema. Para forçar a mudança, use WidgetsBinding.instance.platformDispatcher.platformBrightness.
Sim, por predefinição useMaterial3 é false e o MaterialApp usa Material 2. Para ativar o Material 3, defina useMaterial3: true e use colorScheme de ColorScheme.fromSeed.
Use o parâmetro onUnknownRoute, que aceita RouteSettings e devolve um MaterialPageRoute. Se nem routes nem onGenerateRoute lidaram com a rota, onUnknownRoute é chamado — devolva uma página com uma mensagem de erro.
Se o parâmetro home não for especificado e não houver routes, o Flutter lança uma exceção ao iniciar. Deve especificar pelo menos um dos seguintes: home, routes com uma rota '/' ou initialRoute.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também