Esses 5 segredos da gestão de estados do Flutter mudaram a forma como eu programo
Depois de construir (e quebrar) vários aplicativos Flutter, notei um padrão. Todo novo projeto começava com o mesmo passo: instalar uma biblioteca de gerenciamento de estado.
Provider, Riverpod, BLoC — eu usei todos, achando que eram essenciais. Mas, com o tempo e após algumas refatorações caóticas, percebi: A simplicidade geralmente vence a complexidade.
O Flutter já nos dá tudo o que precisamos para a maioria dos cenários de estado. Aqui estão 5 segredos práticos que mudaram minha forma de pensar sobre estado — e tornaram meu código mais limpo e rápido.
1: O setState() ainda é um superpoder.
Todos nós já vimos aquele olhar de desaprovação do ‘dev sênior’ quando você diz que usou setState(). Mas adivinhe só? Ele é perfeitamente adequado quando usado no lugar certo.
Imagine que você está construindo um app de rastreamento de hábitos. O usuário toca em uma caixa de seleção (checkbox) para marcar um hábito como concluído no dia. Por que trazer uma biblioteca de gerenciamento de estado inteira apenas para isso?
final totalAmount = ValueNotifier<double>(0);
ValueListenableBuilder<double>(
valueListenable: totalAmount,
builder: (_, value, __) => Text('Total: ₹${value.toStringAsFixed(2)}'),
);
totalAmount.value += 249.0;
Quando não usar: Se o seu aplicativo tiver dependências de dados complexas ou fluxos assíncronos (streams) — use uma biblioteca em vez disso.
3: Eleve o Estado (Lift State) — Mas Não Exagere.
Todo desenvolvedor Flutter já fez isso uma vez: você passa o estado para cima, depois para cima de novo, e de repente sua árvore de widgets parece uma torre de propriedades (props).
Imagine que você está construindo um app de anotações. Cada cartão de nota tem um ícone de favorito. Você quer atualizar a contagem no topo: ‘5 favoritos’. Você pode simplesmente elevar a contagem de favoritos para o componente pai que contém todos os cartões de notas:
class NotesScreen extends StatefulWidget {
@override
State<NotesScreen> createState() => _NotesScreenState();
}
class _NotesScreenState extends State<NotesScreen> {
int favoriteCount = 0;
void toggleFavorite(bool isFav) {
setState(() => favoriteCount += isFav ? 1 : -1);
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Favorites: $favoriteCount'),
NotesGrid(onFavoriteToggle: toggleFavorite),
],
);
}
}
Quando não usar: Se múltiplas páginas precisarem dos mesmos dados (como informações de login ou o tema), pare de elevar o estado — é hora de usar um estado global.
4: InheritedWidget — A Joia Escondida do Flutter.
Antes de instalar o Provider, lembre-se: ele é apenas uma ‘embalagem’ bonita em torno do InheritedWidget. Você pode usar a versão pura quando quiser controle total e zero dependências.
Imagine que você está criando um aplicativo de chat com um botão de alternância entre tema claro/escuro na barra lateral que afeta o aplicativo inteiro. Em vez de adicionar o Provider, você pode simplesmente fazer isto:
class ThemeController extends InheritedWidget {
final bool isDark;
final Function toggleTheme;
const ThemeController({
required this.isDark,
required this.toggleTheme,
required super.child,
});
static ThemeController of(BuildContext context) =>
context.dependOnInheritedWidgetOfExactType<ThemeController>()!;
@override
bool updateShouldNotify(ThemeController old) => isDark != old.isDark;
}
// usage
ThemeController.of(context).toggleTheme();
Quando não usar: Se você começar a precisar de múltiplas camadas de dados compartilhados — nesse ponto, os InheritedWidgets tornam-se difíceis de manter.
5: Saiba quando finalmente é hora de uma biblioteca.
Aqui está o maior segredo: Bons desenvolvedores sabem quando não usar gerenciamento de estado. Grandes desenvolvedores sabem quando finalmente começar a usar um.
Imagine que você está construindo um app de controle financeiro. Seus dados vivem em múltiplas telas — transações, análises, metas — e sincronizam com o Firebase. Agora você tem:
- Estado de autenticação (Auth)
- Streams de banco de dados
- Cache offline
- Múltiplas camadas de UI reagindo aos mesmos dados
Se você tentar gerenciar tudo isso apenas com ValueNotifier, vai acabar chorando em cima do seu teclado. É aí que bibliotecas como Riverpod, BLoC ou MobX brilham.
Quando não usar: Se for um componente de apenas uma tela — adicionar Riverpod é como usar Kubernetes para hospedar um ‘Hello World’.
Conclusão
No fim das contas, gerenciamento de estado não é sobre escolher a biblioteca mais chique — é sobre escolher a abordagem certa.
Se o seu estado é compartilhado entre várias telas e atualiza com frequência, uma biblioteca de gerenciamento de estado adequada salvará sua sanidade. Mas se for algo local, simples e fácil de lidar — as ferramentas nativas do Flutter são mais do que suficientes.
Tem algum macete ou truque de estado inteligente? 💡 Deixe nos comentários — eu adoraria aprender com a sua experiência também!
Siga-me para mais artigos de Flutter, insights de desenvolvimento e a ocasional confissão de bugs. 😅 Vejo você no próximo