Contenido del curso

Web App con FastAPI + Docker

Cursor genera una app Android desde cero

Resumen

Darle libertad total a Cursor para generar una feature completa en Android es un experimento revelador: con un solo prompt bien acotado y archivos de contexto, el agente puede crear folders, packages, vistas, repositorios y hasta tests. Esta guía muestra cómo estructurar ese prompt, qué revisar después y dónde aparecen los errores típicos cuando delegas la generación de código a una IA.

Cómo armar un prompt efectivo para que Cursor genere una feature

El primer paso es preparar el contexto. En lugar de ir paso a paso como en iteraciones anteriores, aquí la idea es entregar reglas claras y dejar que el agente razone.

Dentro de Cursor, con el chat abierto y el agente habilitado usando Claude 4 Sonnet, el prompt base fue: Genera la feature de listar cursos para mi app con sus respectivos files, folders y packages. A partir de ahí se suman las reglas de contexto.

  • Arquitectura definida en el archivo de Clean Architecture.
  • Entidades y requests HTTP tomadas del archivo de contratos.
  • Generación de UI, composables y pantallas guiada por un prompt específico de diseño.
  • Diseños de referencia: course list view para la pantalla y course card view para cada ítem de la lista.

¿Qué archivos de contexto necesita Cursor para generar una feature completa? Tres como mínimo: el de arquitectura (Clean Architecture), el de contratos con entidades y requests HTTP, y un prompt de UI con imágenes de referencia para las vistas.

Qué genera Cursor cuando le das libertad total

Tras enviar el prompt y pedirle continuar al alcanzar el límite del agente, el resumen final mostró bastante más de lo solicitado. Algunos extras fueron bienvenidos, otros conviene controlarlos.

  • Tests unitarios sin haberlos pedido, lo cual es útil pero recomendable diferir hasta probar el flujo principal.
  • README con documentación de la feature.
  • Gradle modificado con las dependencias necesarias, incluyendo retrofit.
  • Manifest actualizado con los permisos requeridos.
  • MainActivity ajustada con su preview y la vista principal de la app.

También creó un repositorio con Mock Data y un módulo que, en desarrollo, apuntaba a esos datos mock. Para validar el servicio real conviene cambiarlo de inmediato y usar el Remote Course Repository con el API service generado.

Cómo quedó organizada la arquitectura generada

La estructura respeta las capas de Clean Architecture y se reparte así:

  • Capa de UI: composables para loading, mensajes de error y cards, además de ajustes al sistema de diseño con los colores definidos en el prompt.
  • ViewModels: manejan el estado de la UI con flows y scopes, y disparan el load en el init (un punto a optimizar para evitar recargas innecesarias en recomposiciones).
  • Capa de data: repositorio remoto, API service con retrofit haciendo GET, módulo de network con la base URL, mappers y data classes con sus @SerializedName correctamente anotados.
  • Capa de dominio: interfaces del repositorio y data classes propias del dominio.

Por qué fallan algunas piezas y cómo se detectan

Después de aceptar los cambios hay que cerrar Cursor y abrir Android Studio para ejecutar Sync Now y que Gradle baje las dependencias nuevas. Recién entonces aparecen los errores reales.

En esta corrida saltaron dos problemas concretos en la vista de lista de cursos:

  • La variable isRefreshing no estaba declarada, aunque el composable la usaba.
  • Algunos nested scrolls referenciados no estaban definidos.

¿Por qué Cursor genera código con errores aunque el resumen diga que todo está listo? Porque el agente compone piezas a partir del contexto pero no compila el proyecto. Errores de variables no declaradas o imports faltantes solo aparecen al sincronizar Gradle y correr el build en Android Studio.

¿Conviene aceptar todos los cambios que propone Cursor de una vez? No siempre. Acepta los archivos de configuración y estructura, pero revisa tests y datos mock antes de fijarlos, porque suelen necesitar ajustes manuales o un nuevo prompt.

Qué revisar antes de confiar en el código generado

Delegar la generación completa funciona, pero exige una revisión activa. Estos son los puntos críticos donde detenerse:

  • Cambiar el repositorio por defecto de Mock Data al Remote Course Repository si vas a probar el servicio real.
  • Validar que los tests unitarios cubran lo que realmente quieres testear, no lo que la IA decidió cubrir.
  • Revisar la lógica del init en los ViewModels para evitar recargas innecesarias en cada recomposición.
  • Verificar que los mappers y @SerializedName coincidan con los contratos reales.
  • Confirmar que el sistema de diseño y los colores aplicados respeten el prompt de UI.

Cuando aparezcan errores como los de isRefreshing o los nested scrolls, tienes dos caminos: arreglarlos tú mismo o pedirle a Cursor que los resuelva, ya con el código entendido. ¿Tú qué harías primero, leer todo el código generado o lanzarlo al build y dejar que el compilador te guíe?