Neste post
- O número exato
- O que isso dá
- Velocidade de segunda ordem
- Um código, duas lojas
- Aprendizado que acumula
- Publicação padronizada
- O que isso tira
- Teto de performance
- Dependência de fornecedor
- Tentação de padronizar demais
- As três vezes em que quebramos a regra
- 1. Um jogo em Godot
- 2. Uma integração em PHP
- 3. Um app sem back-end nenhum
- O que não conta como quebrar a regra
- O que a gente mudaria
- Onde estamos
- Resumo
O portfólio da JuxtaLux cobre coisas que não têm nada a ver entre si. Cotação de câmbio e cripto. Perguntas anônimas. Minijogos com ranking. Ponto eletrônico por GPS. Ofertas e cupons. Contagem de calorias. Um chihuahua de jetpack.
Quase todos saíram da mesma stack: Flutter e Firebase.
Este post é sobre o que isso dá, o que tira, e as três vezes em que a regra foi quebrada de propósito.
O número exato
Vale começar pelo que dá para contar. O portfólio inteiro, incluindo o que ainda não foi publicado, tem 22 projetos:
| Corte | Quantos |
|---|---|
| Usam Flutter | 21 de 22 |
| Usam Firebase | 13 de 22 |
| Usam Flame (jogos em Flutter) | 5 de 22 |
| Não usam Flutter | 1 |
A primeira linha é a stack. A segunda mostra uma coisa que costuma passar batido: Firebase não é a metade da história. Nove projetos não têm Firebase nenhum — jogos que guardam estado no aparelho, um app offline-first, um com back-end próprio. "Flutter e Firebase" é a descrição confortável; a descrição honesta é "Flutter sempre, e o back-end que o problema pedir".
E as categorias não se parecem em nada: sete jogos, cinco de negócios, dois de entretenimento, dois sociais, dois de finanças, além de jurídico, educação, saúde e compras. É essa dispersão que faz a stack única valer — se fossem sete variações do mesmo app, qualquer escolha funcionaria.
O que isso dá
Velocidade de segunda ordem
O primeiro aplicativo é lento de fazer em qualquer stack — o tempo vai para descobrir como publicar, como assinar, como configurar notificação, como estruturar o projeto.
O quinto é rápido, porque autenticação, armazenamento, notificação e publicação já são problemas resolvidos e resolvidos do mesmo jeito.
A palavra que importa é a última. Cinco aplicativos resolvidos de cinco jeitos diferentes não acumulam nada.
Um código, duas lojas
Não é gratuito como a propaganda sugere — há diferenças de comportamento, de política de loja e de ajuste visual. Mas é muito mais barato que manter duas bases, e o custo de manutenção é onde a economia realmente aparece: uma correção, duas lojas.
Aprendizado que acumula
Um problema resolvido em um app aparece resolvido no seguinte. A decisão de moderação do EuRi informou a do Sussurro Secreto. A economia no servidor do CyberDropX informou o desenho do Nebulux.
Isso só acontece porque o terreno é o mesmo. Aprendizado é transferível dentro de uma stack e evapora entre stacks.
Publicação padronizada
Ícone, faixa de tela, assinatura, versionamento, ficha de loja, política de privacidade, página de exclusão de conta. Cada um desses é um pequeno projeto na primeira vez e um script na quinta.
O que isso tira
Teto de performance
Para a maioria dos casos, irrelevante. Para o caso em que importa, importa muito — e aí não adianta discutir com quem já mediu.
Dependência de fornecedor
Firebase é conforto com contrato. Autenticação, banco em tempo real, funções e notificação sem construir nada, em troca de um acoplamento que cresce a cada app.
Trocar depois de oito aplicativos não é uma tarde de trabalho. É oito migrações, cada uma com dados de usuário no meio.
A mitigação possível não é evitar o fornecedor — é não deixar a regra de negócio saber quem ele é. Um repositório entre a lógica e o SDK não elimina o custo de troca, mas o transforma de reescrita em substituição de camada.
Tentação de padronizar demais
O risco real de uma stack única não é técnico, é de produto: começar a resolver todo problema do jeito que a ferramenta prefere, em vez do jeito que o usuário precisa.
O sintoma é reconhecível — todos os aplicativos começam a ter a mesma tela inicial, o mesmo fluxo de cadastro, a mesma navegação. Não porque o problema é o mesmo, mas porque o caminho já estava aberto.
Escolher uma stack é escolher quais problemas você vai ter. Não existe opção sem problema — existe opção com o problema que você prefere.
As três vezes em que quebramos a regra
Uma regra que nunca é quebrada não é uma regra: é uma limitação. Os três casos:
1. Um jogo em Godot
O Troll Quest BR é platformer com fases desenhadas à mão, e o que faltava não era biblioteca de renderização — era editor de cena. O raciocínio completo está em Por que um jogo é Godot.
2. Uma integração em PHP
O coletor de publicações judiciais do Jurislux precisa de endereço estável e tolerância a lentidão, duas coisas que o ambiente serverless não entrega sem contorno. Detalhado em Integração externa: quando a resposta é PHP.
3. Um app sem back-end nenhum
O RodaGrana não tem servidor. Não é ausência de Firebase por descuido: é a constatação de que a conta é local, o dado é do usuário e o servidor só adicionaria dependência. Está em Offline-first com Drift e SQLite.
O padrão dos três é o mesmo: a exceção entra por fronteira, com justificativa escrita, não por preferência do dia.
O que não conta como quebrar a regra
Vale a distinção, porque ela é a diferença entre disciplina e superstição. Usar Riverpod num app e não em outro, acrescentar Flame quando o app é jogo, guardar estado em Hive num caso e em Drift noutro — nada disso quebra a stack. São escolhas dentro do mesmo terreno, e o aprendizado continua transferível.
O que quebra a regra é mudar de terreno: outra linguagem, outro runtime, outro modelo de execução. Foi o que aconteceu três vezes em 22 projetos.
| Situação | Quebra a stack? |
|---|---|
| Trocar de gerenciador de estado entre apps | não |
| Acrescentar uma biblioteca de jogo | não |
| Dispensar o Firebase e guardar tudo local | não — o app continua Flutter |
| Sair do Flutter | sim |
| Introduzir outra linguagem no back-end | sim |
Confundir as duas listas produz os dois erros opostos: ou o time trava em discussões sobre biblioteca como se fossem arquitetura, ou aceita uma linguagem nova achando que é "só mais uma dependência".
O que a gente mudaria
Duas coisas, olhando para trás:
Definir cedo o gatilho de refatoração. O monolito do Nebulux não aconteceu por escolher Flutter; aconteceu por não ter combinado, no começo, qual seria o sinal para reorganizar. Stack única facilita começar rápido, e começar rápido facilita adiar estrutura.
Isolar o fornecedor desde o primeiro app. É barato no começo e caro depois. E a versão barata não é uma camada de abstração completa — é só não chamar o SDK de dentro da regra de negócio.
Onde estamos
Aplicativos publicados no Google Play, a maior parte também na App Store, e uma esteira de projetos em teste fechado. Cada um é laboratório para o próximo, e o blog existe em boa parte para que o aprendizado não fique só no repositório.
Resumo
- O ganho de uma stack única não é o primeiro app: é o quinto.
- Aprendizado acumula dentro de uma stack e evapora entre stacks.
- O custo é teto de performance, acoplamento a fornecedor e tendência a resolver
tudo do jeito da ferramenta.
- Mitigação prática: não chamar o SDK do fornecedor de dentro da regra de
negócio.
- Quebre a regra por fronteira e com justificativa escrita. Três exceções em oito
aplicativos é saudável; zero seria rigidez.
- Combine o gatilho de refatoração no começo, quando ninguém precisa dele.
Perguntas frequentes
Flutter serve para qualquer tipo de app?
Serve para a maioria e não para tudo. Onde ele não é a melhor escolha: jogo com fases desenhadas à mão, que precisa de editor; e qualquer coisa que dependa de recurso de plataforma muito novo, onde a ponte chega depois do nativo.
Dependência de fornecedor é um problema real?
É, e o custo aparece na hora de sair. Firebase é conforto com contrato: você ganha autenticação, banco em tempo real, funções e notificação sem construir nada, e perde a facilidade de trocar. Depois de oito apps, não é uma tarde de trabalho.
Como escolher a primeira stack de um estúdio?
Pelo que você consegue publicar duas vezes. Velocidade do primeiro app importa menos que a do quinto — e a do quinto depende de repetir o mesmo caminho, não de ter escolhido o caminho ótimo.