Gemini AI en Flutter: ejercicio resuelto con chat multi-turno y google_generative_ai
Gemini AI en Flutter: ejercicio resuelto con chat multi-turno
google_generative_ai es el paquete oficial de Google para consumir la API de Gemini directamente desde Dart. Permite enviar prompts, mantener contexto de conversación multi-turno y configurar el comportamiento del modelo desde el cliente, sin necesidad de un backend intermedio para casos de uso no sensibles.
Enunciado
Implementa un chat con Gemini que:
- Configure
GenerativeModelcongemini-1.5-flashyGenerationConfig. - Mantenga historial de conversación con
ChatSession(contexto multi-turno). - Muestre un indicador de carga mientras el modelo genera la respuesta.
- Gestione errores de API con mensajes claros.
- Proteja la API key usando
--dart-defineen lugar de hardcodearla.
Dependencias
Configuración
1. Obtener API key en Google AI Studio (gratuita para desarrollo).
2. Ejecutar la app inyectando la key como variable de entorno para no escribirla en el código:
En producción usa flavors o un servicio de secretos (Google Secret Manager, AWS Secrets Manager, etc.).
Solución completa
Conceptos clave
| API | Propósito |
|---|---|
GenerativeModel | Inicializa el modelo con nombre, API key y configuración |
GenerationConfig | Controla temperatura, max tokens, top-k, top-p |
systemInstruction | Instrucción de sistema que define el comportamiento del modelo |
model.startChat() | Abre una ChatSession que mantiene el historial de conversación |
chat.sendMessage() | Envía un turno y devuelve GenerateContentResponse |
response.text | Texto generado (acceso rápido al primer candidato) |
Content.text() | Construye un mensaje de texto para el modelo |
Content.system() | Mensaje de sistema (solo en systemInstruction) |
GenerativeAIException | Error tipado de la API (cuota, clave inválida, seguridad) |
Errores frecuentes
- API key vacía o inválida: el modelo lanza
GenerativeAIExceptioncon mensaje claro. Verifica que pasaste--dart-define=GEMINI_API_KEY=...correctamente. - Hardcodear la API key en el código fuente: cualquiera que inspeccione el APK puede extraerla. Usa
--dart-defineen desarrollo y un backend o servicio de secretos en producción. - No gestionar
_sending: sin flag de bloqueo, el usuario puede enviar múltiples mensajes antes de recibir respuesta y desincronizar el historial. - No usar
SelectableText: las respuestas de Gemini suelen incluir código;SelectableTextpermite copiar el texto, lo que mejora mucho la experiencia.
Aplicación práctica
Este patrón es la base para asistentes de onboarding, generadores de contenido, buscadores semánticos y cualquier funcionalidad que enriquezca una app con IA generativa. Para casos de uso en producción con usuarios reales, las llamadas a Gemini deben pasar por un backend propio para controlar costes, añadir autenticación y registrar uso.
Siguiente ejercicio recomendado
- Consumo de API con http en Flutter: ejercicio resuelto
- GraphQL en Flutter: ejercicio resuelto
- WebSockets en Flutter: ejercicio resuelto
- Todos los ejercicios de Flutter
Práctica guiada y siguiente paso
- Más ejercicios de Flutter
- Ejercicios C para reforzar fundamentos
- Programación en C en 100 ejercicios resueltos
- Ver en Amazon (incluido en Kindle Unlimited)
FAQ
¿Gemini 1.5 Flash es gratuito?
Sí, dentro de los límites del plan gratuito de Google AI Studio: 15 RPM (peticiones por minuto) y 1.500 RPD (peticiones por día). Para producción con más tráfico se usa el plan de pago.
¿Cuál es la diferencia entre gemini-1.5-flash y gemini-1.5-pro?
Flash está optimizado para velocidad y coste; Pro para razonamiento complejo y contextos largos. Para la mayoría de apps de chat, Flash es la elección correcta.
¿Cómo añado respuestas en streaming para que aparezca el texto letra a letra?
Usa chat.sendMessageStream(Content.text(text)) que devuelve Stream<GenerateContentResponse>. Acumula el texto en cada evento y llama a setState en cada fragmento para simular escritura en tiempo real.