Flutter — Crear, Medir y Aprender

Guillermo Arispe
5 min readMay 29, 2022

--

Al momento de crear un producto o una funcionalidad, es de suma importancia entender el impacto de lo que estamos haciendo, ya sea positivo o negativo. Para poder seguir por el mismo camino o pivotear y repetir este proceso de Crear-Medir-Aprender.

En este articulo, vamos a ver de manera muy simple cómo preparar nuestra aplicación Flutter para integrar diferentes herramientas de analítica.

Photo by Carlos Muza on Unsplash

AnalyticsService

Lo primero que vamos a crear es un servicio que nos permita interactuar con los trackers (Google Analytics, Amplitude, etc) que integremos, de forma que nuestra aplicación simplemente se comunique con este servicio y no tenga mucho conocimiento de COMO es la implementación de los mismos.

Las funcionalidades básicas que podemos encontrar son:

  • Inicializar los trackers
  • Configurar las propiedades de usuario que queremos registrar
  • Registrar los diferentes eventos de nuestra aplicación
AnalyticsService

A continuación vamos a ver en detalle la implementación de cada uno de estos métodos, pero empecemos por definir qué es un Tracker.

Tracker

Esta abstracción es la que va a definir el comportamiento de cada una de las herramientas que integremos mas adelante, es decir, cada uno de nuestros trackers.

Tracker

Conociendo entonces que es lo que puede hacer un tracker, volvamos a nuestro AnalyticsService para completar las implementaciones pendientes.

Inicialización

Muchas herramientas de analytics requieren de una inicialización previa a utilizarlas. Para inicializar cada uno de los trackers, simplemente vamos a ir uno por uno llamando a su propio tracker.init()

AnalyticsService — init

Este método va a popular la lista _trackers interna del servicio, la cual luego vamos a utilizar para mediar entre los trackers y nuestra aplicación.

Propiedades de usuario

En la mayoría de las herramientas de analítica tenemos la posibilidad de registrar propiedades de usuario para entender mejor el tipo de usuarios que utilizan nuestra aplicación, crear cohortes (grupo de personas que comparten características comunes), etc.

AnalyticsService — setUserProperties

De nuevo, cada vez que querramos configurar o actualizar las propiedades de un usuario en nuestros trackers, simplemente llamamos a tracker.setUserProperties(properties) para cada tracker configurado.

Para el ejemplo, nuestro UserProperties se define de la siguiente manera:

UserProperties

Registro de eventos

El último pero no menos importante de los métodos que nos falta. Prácticamente todas las herramientas de analítica (al menos las que he usado) para registrar un evento requieren de un nombre del evento y las propiedades (opcionales) del mismo.

Debido a esto, vamos a definir una abstracción para los diferentes eventos de nuestra aplicación.

Event

Ahora sí, sabiendo como son nuestros eventos vamos a realizar el registro de la misma forma que inicializamos y registrarmos las propiedades de usuarios. Vamos a llamar a tracker.track(event.name, event.properties) para cada tracker.

AnalyticsService — setUserProperties

Hasta aquí, la aplicación no conoce de ninguna herramienta particular de analítica, simplemente sabe que existe un servicio que le va a permitir registrar los eventos y las propiedades de los usuarios.

Implementación de trackers

Una vez definidas todas las abstracciones, agregar diferentes herramientas de analítica es algo muy simple. Veamos algunos ejemplos.

ConsoleTracker

Este es un tracker que podemos usar para fines de debug y por ejemplo corroborar que cada vez que utilicemos nuestro servicio lo hagamos de manera correcta, que los eventos se “registren” con el nombre y las propiedades que indicamos, etc.

Para crear este tracker, debemos crear una clase que implemente nuestra abstracción Tracker.

ConsoleTracker

AmplitudeTracker

Ahora supongamos que queremos agregar un tracker real, como por ejemplo Amplitude. La “receta” es la misma. Implementar nuestra abstracción Tracker y definir el comportamiento de los métodos.

AmplitudeTracker

Si quisieramos agregar Firebase Analytics por ejemplo, basta con repetir los pasos de los trackers anteriores y listo.

Un punto a resaltar es que por cada tracker que agregamos, nuestra aplicación no se ve afectada. Simplemente sigue haciendo uso del servicio principal sin “enterarse” que agregamos nuevos trackers.

Bien, y ahora… ¿Cómo usamos todo esto?

Para comenzar a hacer uso del servicio en nuestra aplicación, el único requisito es invocar a init(trackers) antes de querer registrar propiedades de usuario o eventos. Por ejemplo, en nuestro main.dart.

main.dart

Una vez inicializados nuestros trackers, ya podemos registrar las propiedades de usuario que querramos.

Registro de propiedades de usuario

Para registrar los diferentes eventos de nuestra app, recordar que previamente definimos la abstracción Event por lo que primero debemos crear las implementaciones concretas.

Supongamos que nuestra aplicación es una app de citas y tenemos un botón que nos permite dar “Me gusta” a un usuario. Si quisieramos trackear este evento, vamos a necesitar crear una clase que extienda de Event (nuestro evento abstracto)

Like event

Con esto, ya podemos trackear el evento en nuestros trackers haciendo uso de nuestro AnalyticsService

Registro de evento

Y eso es todo.

Conclusión

Hemos creado un servicio de analytics con una cierta facilidad de uso y totalmente independiente a nuestra aplicación, que tranquilamente podría ser un package externo al cual le indiquemos cuales son los trackers que queremos utilizar y listo.

Así es como tenemos implementado nuestras herramientas de analytics en nuestra aplicación, Hitch. Si quieres probarla, puedes encontrarla para Android aquí.

Si quieres conectar, puedes hacerlo a través de mis redes:

O visitanos en More Than Code 🙌

--

--