Flutter

Vibe uma vez, execute em qualquer lugar com Antigravity e Flutter

A equipe do Medium construiu o jogo DashLander usando a plataforma Antigravity da Google e o framework Flutter para demonstrar como os modelos de inteligência artificial podem auxiliar na criação de aplicativos multiplataforma, otimizando tempo e recursos. O projeto envolveu geração automática de códigos, assets e até mesmo testes automatizados, destacando a eficiência do desenvolvimento agêntico em comparação com métodos tradicionais.

Compartilhar
Medium

Vibe uma vez, execute em qualquer lugar com Antigravity e Flutter

escrito em conjunto com Rody Davis

Pressione enter ou clique para ver a imagem em tamanho completo

A codificação de agentes e o modo como os usamos já evoluiu dramaticamente desde sua chegada há apenas alguns meses. Inicialmente, a ênfase estava fortemente na observação — revisando cada linha de saída individualmente. Mas à medida que os modelos aumentaram rapidamente em capacidade, a indústria passou para uma engenharia verdadeiramente agencial. Hoje, desenvolvedores, PMs e designers estão usando múltiplos chapéus, focados em metas conceituais ambiciosas e deixando agentes lidar com os componentes individuais.

Para explorar essa nova fronteira, nossa equipe queria construir uma experiência que exibisse esse fluxo de trabalho exato. Queríamos criar um jogo, gerar seus ativos, escrever a página de marketing e implantar tudo isso usando o Google Antigravity, a plataforma nativa de IA.

Antigravity traz o melhor do Google em um lugar, usando um loop de feedback apertado de planejamento, ação e verificação. Ele cria artefatos, escreve código, executa testes e até clica nos botões da sua UI para garantir que realmente concluiu a tarefa corretamente.

O resultado de nossa aventura agencial é DashLander — um jogo estilo moonlander ambientado em asteroides gerados proceduralmente. Aqui está a história sobre como o construímos.

Por que Flutter na era da IA?

Muitas pessoas podem estar pensando: se os agentes podem escrever código nativo, por que não apenas ter eles escrevendo apps Android, iOS e web inteiramente separadamente?

Essa é uma pergunta válida; e foi o que originalmente inspirou a concepção de Flutter como um "Vibe uma vez, execute em qualquer lugar" toolkit UI.

Ter uma única fonte da verdade é tão importante para IA quanto é para humanos. Ao ter um agente escrever um único aplicativo multiplataforma, as equipes podem eliminar os pequenos bugs que inevitavelmente se infiltram entre diferentes linguagens ou paradigmas específicos de plataforma. Além disso, o Dart usa tipos fortes, fornecendo excelente feedback para LLMs. Linguagens com sistemas de tipagem mais flexíveis exigem uma análise muito maior por parte do LLM para saber se um determinado trecho de código é correto em todos os cenários. Flutter e Dart, por outro lado, usam seu servidor de análise para enviar forte sinal sobre desalinhamentos nas assinaturas de função ou formas de classe ao seu agente. Com o estado quente de recarga, agentes são tão acelerados pelo Flutter quanto desenvolvedores humanos.

E, embora o desenvolvimento agêntico tenha reduzido drasticamente o custo de produção de novos softwares, ainda está longe de ser gratuito. Com o desenvolvimento agêntico, tempo é dinheiro tanto figurativamente quanto literalmente, pois mais tempo gasto fazendo consultas resulta em mais tokens; que resultam em mais gastos com IA. Com Flutter, agentes recém-sucedidos não precisam começar do zero para suportar outra plataforma, economizando dinheiro.

Falhar rápido para construir melhor

Sabíamos que queríamos criar um jogo onde você pilota uma nave lunar, com elementos dinâmicos, shaders personalizados e efeitos de partículas. (Não tínhamos coragem de colocar a Dash em si no vazio do espaço frio, então, em vez disso, você está pilotando uma espaçonave.) Integrar esses conceitos foi, é claro, grandemente acelerado pelo uso da IA, mas isso não exclui o risco de diminuir o ritmo e escrever cuidadosamente código de alta qualidade mais tarde. Na verdade, uma fase exploratória rápida com IA ajuda você a chegar a esse estágio mais rapidamente, pois muitos de seus experimentos falhos podem ocorrer dentro do ciclo de vida de alguns prompts em vez de levar horas ou dias de programação apenas para aprender se uma ideia específica é realmente divertida. E se há algo nesta vida que não importa, é a qualidade do código de um recurso experimental que nunca vê a luz do dia.

Crucialmente, também sabíamos o que não estávamos construindo: um jogo multiplayer de alta performance em tempo real. Recursos multiplayer em tempo real introduzem restrições de latência e escalam exponencialmente a complexidade da infraestrutura. Em vez disso, percebemos que poderíamos entregar 90% dessa experiência competitiva envolvente reproduzindo os fantasmas das altas pontuações do passado em um modo Desafio. Isso nos permite confiar em armazenamento estático e backends simples e a reciclagem inteligente da lógica perfeitamente escrita de “oponentes IA” para grátis, apenas reproduzindo o que os melhores usuários já fizeram. E esse é o melhor código de todos: o código que você nem escreveu nem manterá.

Gerando um universo de ativos

Para tornar uma nave lunar em asteroides divertida, precisávamos de ótimos ativos e contamos muito com o ecossistema agêntico para obtê-los:

  • Áudio: Usamos o Lyria da Google para gerar música de fundo. (Embora, colocando seu antigo chapéu de engenheiro de áudio, Rody tenha gravado sons personalizados de propulsores no quintal com um microfone, uma mangueira e um spray can. Que tarde divertida!)
  • Visuais: Geramos designs de interface em Stitch e Google Canvas. O Gemini escreveu nossos efeitos de partículas diretamente no código e usamos o Nano Banana para gerar os ícones do aplicativo.
  • Física: Como este jogo se passa no vácuo, queríamos sistemas de controle de reação (RCS) precisos. Desencadeamos o Gemini Deep Research para encontrar as fórmulas exatas de física em um vácuo que precisávamos, que compilou em um documento do Google Docs. Em seguida, incluímos essa pesquisa no nosso contexto e o Gemini traduziu as equações diretamente para Dart. Elas realmente são as equações corretas de física? Hilariosamente, não sabemos, porque não somos físicos! Mas os controles certamente sentem-se corretos quando você está jogando o jogo.

Iterando no protótipo

Começamos nossa construção dentro do sandbox do AI Studio para gerar código descartável rápido antes de nos comprometermos com uma arquitetura. Esses protótipos ricos podem atuar como compressão de contexto para o modelo mais tarde, trancando decisões microcônicas cedo. Alguns dos nossos protótipos tinham jogabilidade mais divertida, alguns pareciam significativamente mais atraentes e outros capturaram nossa física zero-G da maneira mais limpa possível. Para nosso jogo final, combinamos as melhores ideias de cada protótipo.

Assim que carregamos o projeto no Antigravity, equipamos nosso agente com os servidores MCP para Firebase, Flutter, a engine de jogos Flame e a API Gemini. Iniciamos um novo prompt e o Antigravity dividiu as tarefas entre subagentes especializados para backend, interface do usuário e lógica do jogo. Em cinco minutos, tínhamos um jogo escrito em Flutter e Flame que normalmente levaria dias para escrever. Mas na realidade, não estava nem perto de estar concluído. Havia apenas três níveis codificados manualmente, a câmera não seguia o módulo lunar e as matemáticas sugeriam que nossa nave tinha mais ou menos o tamanho do Edifício Empire State.

Levou cerca de 100 prompts adicionais para que o jogo chegasse ao seu estado final. Uma porcentagem enorme desses prompts era apenas sobre organização do código e adição de testes. Todo mundo tem sua própria relação com a leitura de código gerado por IA, mas Rody e eu valorizamos muito o que chamo de “propriedade cognitiva” e queremos ainda entender os detalhes internos profundos do nosso aplicativo. Leiamos bastante do que o Gemini escreveu, empurrando-o para refatorar em busca de clareza e reutilização.

Também tive que enfrentar uma dura realidade: não sou bom em trigonometria, e rapaz, há muito dela no DashLander. Quando os agentes me disseram que haviam implementado perfeitamente um novo sistema como cálculos de pouso e pontuação, eu frequentemente jogava o jogo e via imediatamente discrepâncias. Infelizmente, não importa quanto eu lesse a trigonométrica densa de Gemini no meu códigobase, não conseguia encontrar onde estava o desligamento. Para escapar dessa situação em que estou preso entre duas opções ruins, pedi a Gemini para construir um modo de depuração secreto por trás de uma combinação de teclas do teclado. Ele renderizava sobreposições mostrando os dados exatos do terreno, inclinações relativas da superfície e caixas de colisão, permitindo-me provar para mim mesmo exatamente onde as contas dos agentes estavam erradas. Armado com evidências definitivas, fui capaz de ajudar a trabalhar com Gemini para corrigir problemas nos arquivos de matemática densa.

A complicada questão do tempo

Quando adicionamos o Modo Desafio, Antigravity fez um ótimo trabalho de conectar os modelos de dados e conectá-los ao Cloud Firestore. Mas durante a fase de testes, notei uma falha escondida. Eu competia contra a sombra de uma pontuação anteriormente alta e, visualmente, tudo parecia perfeito enquanto o navio fantasma flutuava suavemente. Mas à medida que o replay prosseguia, descobri que o navio fantasma estava se desincronizando imperceptivelmente de sua versão passada. No final da corrida, apesar do jogador original ter pousado perfeitamente, o navio fantasma às vezes colidiria violentamente com um asteroide.

Para resolver isso, tive que fazer como se fosse 2023 e ligar meu próprio cérebro. Assustador, eu sei.

Percebi que o problema fundamental era um aspecto fundamental da arquitetura moderna de computadores. Você vê, em uma CPU multi-processo moderna, você pode dizer a um programa para executar um pedaço de código exatamente no milissegundo futuro, mas a CPU nunca pode garantir precisão perfeita devido à natureza da programação de processos. E, infelizmente para mim, um único milissegundo de atraso na ativação de um propulsor durante uma reprise fundamentalmente altera o caminho simulado do voo de um navio. Percebi que, em vez de apenas registrar timestamps de propulsores, eu tinha que armazenar uma representação completa do estado físico da nave espacial no exato momento de cada evento de propulsor para corrigir inacurácias durante a reprise. Gemini então integrou a lógica para comparar continuamente a simulação ao vivo da reprise contra esses checkpoints físicos, automaticamente corrigindo quaisquer micro-desvios. O resultado foi uma reprise perfeita e livre de colisões.

Do jogo ao lançamento

Você provavelmente já se sentiu pressionado a assumir mais funções no seu trabalho, independentemente do tamanho da sua equipe. Por exemplo, talvez você seja ótimo em escrever jogos, mas não queira promovê-los. Ou, você é um engenheiro UX estrela, mas prefere não lidar com design gráfico. A boa notícia é que você não precisa fazer tudo sozinho.

Usamos o Stitch para gerar nossa página de destino de marketing a partir de um único prompt, passando capturas de tela do nosso jogo em execução como contexto. (Admitimos que se a produção de uma página de destino otimizada tivesse sido nosso objetivo real, teríamos iterado nisso um pouco mais.) Usando um exportação com um clique para o Antigravity, baixamos então o HTML e começamos a trabalhar. Como estávamos construindo em Dart, queríamos manter nossa pilha unificada. Usamos Jaspr, um framework web que mapeia HTML diretamente para componentes Dart, para integrar o HTML gerado de forma transparente. O Gemini lidou perfeitamente com essa conversão, permitindo-nos compartilhar código entre nosso jogo e nosso site de marketing enquanto preservava a indexação SEO em padrões da indústria.

Finalmente, usamos o CLI do Antigravity para construir nosso aplicativo web Flutter, copiar a pasta de construção para Jaspr, executar o script de build e implantar diretamente no Firebase Hosting — tudo em uma única workflow terminal ininterrupta.

Enquanto o DashLander é atualmente web-first para validar facilmente as mecânicas, porque foi construído com Flutter, estamos sempre a apenas um comando de distância de implantar no iOS, Android, macOS, Windows, Linux ou até mesmo na infotainment panel em um Toyota RAV4. À data desta publicação, o jogo está disponível em dashlander.com; embora se você encontrar este artigo muito tempo depois e aquele link tenha ficado sem conteúdo, você é bem-vindo para baixar o código diretamente do GitHub.

Realizando SUA visão

Para começar a construir seu aplicativo ou jogo dos sonhos, vá para antigravity.google para o Gerenciador de Agentes e IDE da Google; e para flutter.dev para começar com a SDK Flutter.

Boa sorte, e não podemos esperar para ver o que você construirá!

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa