Prueba Técnica (72h) → Producto Terminado App Móvil · Flutter + Firebase Sept 2026

Daily News

Una app de noticias en Flutter y Firebase que empezó como una prueba técnica de 72 horas para un proceso de selección real, y que terminé de punta a punta: leer noticias reales y publicar tus propios artículos, con Clean Architecture estricta y 183 tests.

Feed de noticias, búsqueda y lectura offline, en un dispositivo físico.

Escribir, guardar como borrador, publicar, editar y borrar tu propio artículo.

El origen

Para un proceso de selección real me pasaron un starter de app de noticias casi vacío y me pidieron agregar, en 72 horas, la posibilidad de publicar tus propios artículos, siguiendo un reglamento de arquitectura propio y documentado, no "buenas prácticas" genéricas. Como la base era mínima, en la práctica construí la app casi de cero. Entregué a tiempo. Después seguí: encontré y arreglé bugs reales en un teléfono físico, verifiqué las reglas de seguridad del backend contra un proyecto de Firebase en vivo, y sumé funcionalidad que nadie pidió, borradores con autoguardado, localización completa, un sistema de diseño propio. El reporte técnico completo cuenta la versión honesta de cómo se construyó, con los callejones sin salida incluidos.

Qué hace

Leer noticias de verdad, y publicar las tuyas.

Lectura por categoría, con búsqueda y modo offline

Noticias reales por categoría, búsqueda por palabra clave, artículos guardados que se leen completos sin conexión. Tema claro/oscuro e inglés/español, ambos desde adentro de la app.

Publicar tu propio artículo

Foto de portada, formato enriquecido (negrita, subtítulos, listas, citas), contador en vivo contra los límites reales del backend. Se guarda como borrador solo, y sobrevive si cerrás la app a mitad de edición.

Cuenta invitado, sin muro de registro

Arranca como invitado. Podés conectar Google o email después sin perder nada de lo ya escrito, y dos cuentas en el mismo teléfono nunca se mezclan sus artículos guardados.

Bugs reales, encontrados y arreglados

No todo se encuentra con tests. Algunos hay que buscarlos en el teléfono.

El reporte completo documenta más de 15. Estos cinco son los que mejor muestran cómo se encontraron.

Un ANR real, debuggeado en vivo

Tocar "Guardar" al editar el nombre de perfil congelaba la app entera. Conecté flutter attach a la app corriendo en el teléfono y reproduje el error con el debugger en vivo: un controller de texto usado después de destruido, en medio de la animación de cierre de un diálogo.

Un solo carácter rompía la numeración

Las listas numeradas volvían a "1." a partir del tercer ítem. La causa: un ^ de más en una expresión regular que, sin la bandera multilínea, ignoraba en silencio el punto real donde debía empezar a mirar cada línea.

La API real mintió donde la de prueba no podía

Todos los tests con datos falsos pasaban. Contra la API real, un pedido de 20 artículos devolvió 18 de un total de 36, la app avisaba "estás al día" después de la primera página. Se corrigió leyendo el total real que reporta la respuesta, en vez de contar lo recibido.

"Sin conexión" era, en realidad, un límite de cuota

El aviso de "sin conexión" seguía apareciendo con el wifi andando perfecto. Revisé la API key directo con curl: la cuota gratuita diaria (100 pedidos) se había agotado de tanto probar. Ahora la app distingue "sin señal" de "límite alcanzado" y lo dice tal cual, sin mentir sobre la causa.

Repasó, uno por uno, los comentarios del evaluador en el Figma

En vez de asumir que ya estaban resueltos, verifiqué cada uno de los 8 comentarios del evaluador contra el código real. Seis ya estaban cubiertos; encontré dos que no (límites de caracteres que el backend exigía y el formulario no controlaba) y los corregí.

Stack técnico

Cómo está construido

Flutter + Cubit

App en Flutter con flutter_bloc (Cubit) para manejo de estado, la primera vez que lo usé en un proyecto real, en vez del Riverpod que uso a diario.

Clean Architecture

Capas data/domain/presentation con dependencias en un solo sentido, verificadas a mano y con una herramienta de análisis estático propia que audita el código contra el reglamento del proyecto, citando la sección exacta de cada regla.

Firebase

Firestore, Cloud Storage y autenticación anónima/Google/email. Reglas de seguridad que validan dueño, forma de cada campo y límites de longitud, verificadas contra el proyecto real con un script en Python que crea usuarios descartables e intenta accesos que sí y que no deberían funcionar.

Floor/SQLite

Base de datos local para lectura completamente offline de los artículos guardados, con inyección de dependencias vía get_it.

183 tests

Tests unitarios y de widget cubriendo Cubits, repositorios, una migración de SQLite, y condiciones de carrera entre el autoguardado y el guardado manual.

¿Querés ver el código completo?

Todo el proyecto está en GitHub, reporte técnico incluido.

Repositorio público con el código fuente completo y el reporte de más de 15 bugs reales encontrados y corregidos.