Introduciendo Realm para Dart y Flutter

Un caso de estudio sobre el uso de primitivas de la plataforma Dart para construir una librería multiplataforma rica para aplicaciones de Dart y Flutter.

Estamos emocionados de ver a MongoDB anunciar la disponibilidad general (GA) de Realm para Dart y Flutter hoy. Realm es una base de datos reactiva, orientada a objetos y multiplataforma, popular entre los desarrolladores de apps. En otras palabras, perfecta para Dart y Flutter. Así que, durante el último año hemos colaborado con MongoDB para traer Realm a Dart y Flutter. Revisa el blog post de MongoDB para más detalles sobre lo que Realm ofrece, cómo ha mejorado desde sus previews anteriores, y qué tienen planeado para el futuro. Creemos que Realm será una gran combinación para los desarrolladores de Dart y Flutter.

Fragmento de código demostrando cómo escribir libros a un almacén de datos de Realm usando Dart.
Escribir libros a un almacén de datos de Realm usando Dart

En este post complementario, vamos a echar un vistazo tras bambalinas para aprender cómo Realm para Dart y Flutter está construido, como un ejemplo práctico de cómo construir nuevos SDKs para desarrolladores basados en Dart.

Ejemplo de Realm

#

Antes de profundizar en la implementación del SDK de Realm, empecemos con un recorrido rápido de cómo usar el SDK como desarrollador trabajando en una app de terminal de Dart (nota: los pasos para una app de Flutter son ligeramente diferentes; consulta la documentación para más detalles).

Primero, defines un modelo de datos. Esto se hace usando clases normales de Dart con algunas anotaciones de Realm añadidas. Aquí hay una clase de datos de ejemplo para un libro:

Con el modelo definido, y el modelo de datos completamente generado (ver abajo), puedes proceder a escribir algunos libros a un almacén de datos de Realm:

Cómo fue construido Realm para Dart y Flutter

#

Ahora que hemos cubierto lo básico, veamos cómo el equipo de MongoDB construyó Realm para Dart y Flutter utilizando una serie de bibliotecas y herramientas de Dart. Vamos a ver qué pasa cuando se inicializa el SDK de Realm, cómo el SDK de Realm está construido sobre una biblioteca nativa compartida de C++, cómo fue construida la herramienta de terminal de Realm, y cómo se generan los modelos de Realm.

Inicializando el SDK de Realm

#

Los desarrolladores de Dart y Flutter empezarán añadiendo Realm a su app existente, y luego ejecutando el instalador:

shell
dart pub add realm_dart
dart run realm_dart install

El primer paso simplemente añade el SDK de Realm a pubspec.yaml para registrarlo como dependencia de la app. El segundo paso ejecuta la herramienta de terminal de Realm, pidiéndole que instale el SDK. Si miramos dentro del código fuente del comando install, podemos ver que install determina en qué sistema operativo estamos desarrollando, y luego descarga los binarios del SDK de Realm para ese sistema operativo.

¿Pero por qué el comando install descarga un binario? El SDK de Realm es una oferta muy completa, disponible en una gran cantidad de sistemas operativos y frameworks de desarrollo. Para evitar tener que construir un gran número de instanciaciones del SDK de Realm, el equipo de Realm decidió implementar el SDK core de Realm como una biblioteca compartida realm-core de C++. Así que, lo que realmente hace el comando install es descargar versiones compiladas de esta biblioteca core para todas las plataformas que la app soporta.

Llamando al SDK de realm-core

#

Los usuarios del SDK de Realm que escriben apps de Dart o Flutter obtienen APIs de Dart bonitas y fuertemente tipadas, como se ilustra al inicio de este post. ¿Cómo corresponden esas APIs a la biblioteca C++ de realm-core?

Si miramos dentro del directorio lib del SDK de Realm encontramos realm_bindings.dart, que comienza con:

Misterio resuelto: El SDK de Realm usa el soporte de Dart para interoperabilidad con APIs nativas mediante la biblioteca dart:ffi para llamar a realm-core. Para evitar tener que escribir los bindings FFI manualmente para el conjunto muy grande de APIs de Realm disponibles, los bindings se generan automáticamente usando la herramienta ffigen de Dart. Este es un patrón que estamos viendo crecer rápidamente en el equipo de Dart.

La herramienta de terminal de Realm

#

Pasemos a la herramienta de terminal de Realm en sí. Arriba, ejecutamos el comando install, pero también podemos ejecutar la herramienta sin especificar un comando:

shell
$ dart run realm_dart
Realm commands for working with Realm Flutter & Dart SDKs.

Usage: dart run realm|realm_dart <command> [arguments]

Global options:
-h, --help    Print this usage information.

Available commands:
  generate   Generate Realm objects from data model classes
  install    Download & install Realm native binaries into a Flutter or Dart project
  metrics    Report anonymized builder metrics to Realm

Run "dart run realm|realm_dart help <command>" for more information about a command.

Puedes notar que esta salida se parece mucho a la salida de la herramienta core de dart y flutter. Esto no es coincidencia; las tres herramientas están construidas usando las mismas bibliotecas fundamentales de Dart para herramientas de terminal de package:args:

  • La biblioteca args tiene rico soporte para analizar argumentos crudos de línea de comandos en opciones y flags

  • La biblioteca command_runner proporciona una estructura para los comandos soportados por la herramienta (ej. install)

Generando el modelo de Realm

#

El comando generate es especialmente interesante porque genera el modelo completo de Realm a partir de las clases de modelo de Dart anotadas que definimos en la sección "Realm example":

shell
dart run realm_dart generate

¿Cómo funciona el comando generate? Depende del generator de Realm, que está construido sobre el build_runner de Dart, un framework para generadores que toma un conjunto de archivos de entrada y luego crea nuevos archivos de salida. Típicamente — como en el caso de Realm — las entradas son archivos de código fuente de Dart con anotaciones, y los archivos de salida son código fuente de Dart generado adicional.

Pensamientos finales

#

Esperamos que hayas disfrutado este vistazo tras bambalinas de cómo un gran framework para desarrolladores puede ser construido a partir de un conjunto de bibliotecas reutilizables de Dart. Si eres un desarrollador de frameworks, esperemos que esto te pueda dar algo de inspiración para tu próximo framework basado en Dart.

Para los desarrolladores de apps de Dart y Flutter, Realm es una gran nueva oferta del equipo de MongoDB. Te invitamos a revisar la documentación del SDK de Realm, y el blog post de Realm de hoy.

Más de Dart