Curso de Integración Módulos Nativos iOS/Android para Flutter

Conectar TensorFlow Lite a una interfaz Flutter

Curso de Integración Módulos Nativos iOS/Android para Flutter

Contenido del curso

Acceso a sensores y cámara

Conectar TensorFlow Lite a una interfaz Flutter

Resumen

Conectar un modelo de TensorFlow Lite con la interfaz de una app en Flutter requiere inicializar el servicio antes de que cargue la pantalla y construir un widget capaz de generar la imagen de entrada y mostrar el resultado. Aquí verás cómo dejar lista esa base para que el modelo se ejecute al pulsar un botón.

¿Cómo inicializar el servicio de TensorFlow al arrancar la app?

Lo primero es asegurarte de que el modelo se cargue antes de cualquier interacción del usuario. Para eso, el main debe volverse asíncrono y apoyarse en WidgetsFlutterBinding.ensureInitialized().

Ese binding habilita la ejecución de funcionalidades desde el momento mismo en que la aplicación se inicializa. Después, instancias el servicio y llamas a la función de carga del modelo con await.

¿Por qué usar WidgetsFlutterBinding.ensureInitialized? Permite ejecutar código asíncrono antes de runApp, garantizando que servicios como la carga del modelo de IA estén listos cuando la UI aparezca.

El flujo queda así:

  • Importas el TensorFlowService en el archivo principal.
  • Conviertes main en función async.
  • Llamas await tensorFlowService.loadModel() antes de runApp.

Con eso, cada vez que se abra la app, la primera tarea será cargar el modelo en memoria.

¿Cómo crear el StatefulWidget que ejecuta el modelo?

La parte visual vive en un State privado, declarado con guion bajo, que llamamos _ScreenState. Ahí gestionas la entrada, la salida y el botón que dispara el procesamiento.

Dentro del estado defines una string llamada output con un valor inicial tipo "Presiona el botón para ejecutar el modelo". Ese texto vive dentro del botón y cambia según la respuesta del servicio.

¿Qué hace la función runModel dentro del widget?

Es una función asíncrona que envuelve la llamada al servicio en un bloque try catch para manejar errores. Su trabajo es generar la imagen de entrada por código y pedirle al modelo una predicción.

¿Qué es un try catch en Dart? Es una estructura que intenta ejecutar un bloque de código y, si lanza una excepción, la captura para mostrar un mensaje de error en lugar de romper la app.

¿Cómo se genera la imagen de entrada por código?

La entrada del modelo es una lista anidada que representa una imagen sintética con cantidad, alto, ancho y los tres canales de color RGB. Se construye con List.generate en tres niveles.

  • El primer List.generate define cuántas imágenes generas, en este caso una sola.
  • El segundo nivel itera sobre el alto (y) de la imagen.
  • El tercer nivel itera sobre el ancho (x).
  • El nivel más interno genera los tres valores correspondientes a RGB.

Esa estructura simula el tensor de entrada que espera el modelo. Es la forma estándar de alimentar redes que trabajan con imágenes en TensorFlow Lite.

¿Cómo mostrar el resultado o el error en pantalla?

Una vez generada la entrada, llamas a await tensorFlowService.runModel(input) y guardas la respuesta en una variable result. Después actualizas la interfaz con setState.

El setState reemplaza el texto inicial del botón por el valor devuelto por el modelo. Si todo sale bien, el usuario ve el resultado de la inferencia; si algo falla, el bloque catch cambia el texto a "Error al ejecutar el modelo".

¿Para qué sirve setState en Flutter? Notifica al framework que el estado del widget cambió, forzando a Flutter a redibujar la pantalla con los nuevos valores.

Este patrón mantiene la UI reactiva: el botón refleja en tiempo real si el modelo está esperando, devolvió una predicción o falló.

Conceptos y habilidades que se trabajan en la integración

La clase mezcla arquitectura de servicios, programación asíncrona y manipulación de tensores. Estos son los puntos donde vale la pena detenerse.

  • WidgetsFlutterBinding [0:20]: enlace que prepara Flutter para ejecutar código antes de runApp, clave para inicializar servicios pesados como un modelo de IA.
  • Función async/await [0:50]: convierte main y runModel en operaciones asíncronas que esperan la carga del modelo o la inferencia sin bloquear la UI.
  • StatefulWidget y State privado [1:40]: el _ScreenState encapsula la lógica visual y los cambios de estado de la pantalla.
  • List.generate anidado [3:10]: técnica para construir tensores multidimensionales en Dart, usada aquí para crear la imagen de entrada con dimensiones cantidad, alto, ancho y RGB.
  • Canales RGB [4:00]: los tres valores de color por píxel que el modelo espera recibir como última dimensión del tensor.
  • try catch para errores de inferencia [4:40]: protege la app frente a fallos del modelo y permite mostrar feedback claro al usuario.
  • setState para refrescar la UI [5:10]: actualiza el texto del botón con el resultado de la predicción o con un mensaje de error.

Con el servicio inicializado, el widget de pantalla creado y la función runModel lista, ya tienes el esqueleto para conectar cualquier modelo TFLite a una interfaz Flutter. ¿Qué modelo te gustaría probar primero con esta estructura? Cuéntame en los comentarios.