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

Comunicación entre Flutter y código nativo con Method Channel

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

Contenido del curso

Acceso a sensores y cámara

Comunicación entre Flutter y código nativo con Method Channel

Resumen

Comunicar Flutter con código nativo es el paso clave para acceder a funcionalidades específicas de iOS y Android, como la batería del dispositivo, sensores o APIs propias del sistema operativo. La pieza que hace posible ese puente se llama MethodChannel, y entenderla te permite extender tu app más allá de lo que Dart ofrece por defecto.

¿Cómo funciona la arquitectura de Flutter para acceder a código nativo?

Flutter soporta múltiples plataformas: Android, iOS, Windows, macOS y Linux. En el contexto mobile, Flutter actúa como un cliente que mantiene el estado de la app y se comunica con cada sistema operativo a través de un mecanismo llamado method channel [0:25].

Una analogía útil: imagina un restaurante. Flutter es el mesero que atiende a los clientes, y los chefs son iOS y Android. Cuando el cliente pide algo que no está en el menú estándar de Flutter, el mesero no cocina, sino que va al chef correspondiente. Ese mesero es el MethodChannel [0:55].

¿Qué es un MethodChannel en Flutter? Es un canal de comunicación bidireccional que permite a Flutter invocar funciones escritas en código nativo (Kotlin, Java, Swift u Objective C) y recibir respuestas. Funciona como un puente entre Dart y la plataforma.

¿Cómo se crea la clase NativeCommunicator en el proyecto?

El primer paso es crear dentro de la carpeta lib un archivo llamado native_communicator.dart. Ahí defines la clase NativeCommunicator, que centraliza toda la lógica de comunicación nativa [1:45].

Dentro de esa clase declaras una constante privada de tipo MethodChannel. Lo importante aquí es asignarle un nombre identificativo único, porque ese mismo nombre debe coincidir en el lado nativo de iOS y Android para que el canal funcione.

dart class NativeCommunicator { static const MethodChannel _channel = MethodChannel('native_behavior'); }

El nombre del canal, en este ejemplo orientado a leer la batería del dispositivo, refleja el comportamiento nativo que se va a invocar. Cada vez que necesites comunicarte con iOS o Android, llamarás a este canal por ese identificador [2:30].

¿Qué método invoca la comunicación nativa?

El siguiente paso es crear una función asíncrona que dispare la llamada al canal. Se define como un Future<String> llamado invokeNativeMethod, y recibe dos parámetros:

  • Un String method, que indica qué función nativa se quiere ejecutar.
  • Un Map<String, dynamic> con los parámetros que se enviarán al lado nativo.

La palabra clave async convierte la función en asíncrona, lo cual es necesario porque la respuesta del sistema operativo no es inmediata [3:20].

¿Cómo se manejan la respuesta y los errores del canal nativo?

Dentro de la función se usa un bloque try catch para cubrir tanto el camino exitoso como el de error. En el camino positivo, se espera la respuesta del canal con await channel.invokeMethod(method, parameters) y se guarda en una variable result.

dart try { final result = await _channel.invokeMethod<String>(method, parameters); return result ?? ''; } on PlatformException catch (e) { return e.message ?? ''; }

Si la respuesta llega vacía, se retorna un string vacío como valor por defecto. Esto evita que la app falle si el lado nativo no devuelve nada [4:30].

¿Por qué se usa PlatformException en vez de un catch normal? Porque la comunicación entre Flutter y el sistema operativo puede fallar por razones específicas de la plataforma, como un método no implementado o un argumento inválido. PlatformException captura esos errores con información detallada del lado nativo.

El bloque on PlatformException catch (e) reemplaza el catch genérico, justamente porque estamos cruzando la frontera entre Dart y el código nativo. Esa excepción trae un message con el detalle del fallo, que puedes loguear o mostrar al usuario [5:10].

¿Qué sigue después de configurar el canal en Flutter?

Con NativeCommunicator listo, ya tienes el lado Dart preparado para enviar peticiones. Pero falta la otra mitad: implementar la recepción de esas llamadas en Android (Kotlin o Java) y en iOS (Swift u Objective C).

¿Qué pasa si no implemento el lado nativo? El canal lanzará una PlatformException con error MissingPluginException, porque Flutter no encuentra a quién entregarle la petición.

Cada plataforma necesita registrar el canal con el mismo nombre (native_behavior en este caso) y definir cómo responder a cada method que llegue. Ese es el siguiente paso para completar el puente entre tu app Flutter y las funcionalidades nativas del dispositivo.

¿Qué funcionalidad nativa te gustaría conectar primero en tu app: batería, sensores, notificaciones? Cuéntame en los comentarios.