Method Channels en Flutter: ejercicio resuelto con código nativo Android e iOS
Method Channels en Flutter: ejercicio resuelto con código nativo
Los platform channels son el mecanismo de Flutter para llamar a APIs nativas de Android (Kotlin/Java) e iOS (Swift/Objective-C) que no tienen plugin en pub.dev o cuando necesitas acceso de bajo nivel a la plataforma. MethodChannel es el canal más común: permite llamadas request-response sincrónicas desde Dart al código nativo.
Enunciado
Implementa una pantalla que obtenga el nivel de batería del dispositivo usando código nativo:
- Define el canal
MethodChannelcon un nombre único en Dart. - Implementa el handler en Kotlin (
MainActivity.kt) para Android. - Implementa el handler en Swift (
AppDelegate.swift) para iOS. - Muestra el porcentaje con un icono que cambia según el nivel.
- Maneja el
PlatformExceptioncuando la batería no está disponible.
Dependencias
Solo el SDK de Flutter — MethodChannel está en package:flutter/services.dart.
Solución completa
Flutter (Dart)
Android — android/app/src/main/kotlin/.../MainActivity.kt
iOS — ios/Runner/AppDelegate.swift
Conceptos clave
| Concepto | Detalle |
|---|---|
MethodChannel('nombre') | Canal identificado por nombre único; debe coincidir en Dart y nativo |
channel.invokeMethod<T>('metodo') | Llama al método nativo y espera T; lanza PlatformException en error |
result.success(value) | Nativo responde con éxito y un valor |
result.error(code, msg, details) | Nativo responde con error → PlatformException en Dart |
result.notImplemented() | El método no está implementado en este lado nativo |
PlatformException | Error tipado que llega de la capa nativa; tiene code y message |
configureFlutterEngine | Override en Android para registrar canales |
FlutterMethodChannel | Equivalente iOS de MethodChannel en Dart |
Errores frecuentes
- Nombre de canal no coincide: si el string en Dart difiere del nativo,
invokeMethoddevuelvenullo lanza error. Usa una constante compartida o document el nombre claramente. result.success()llamado múltiples veces: el canal nativo solo puede responder una vez por llamada. Llamar aresult.success()dos veces lanza una excepción nativa.- No cubrir
else -> result.notImplemented(): sin este caso, métodos desconocidos quedan colgados esperando respuesta indefinidamente. - Probar en simulador iOS:
isBatteryMonitoringEnabledno funciona en simuladores. Usa un dispositivo físico o retorna un valor mock en debug.
Aplicación práctica
Los platform channels son la vía estándar para acceder a Bluetooth de bajo nivel, NFC, sensores del acelerómetro con alta frecuencia, Face ID/Touch ID personalizado, o cualquier API de sistema que los plugins existentes no cubran. El patrón MethodChannel es el más común; para eventos continuos desde nativo a Flutter existe EventChannel.
Siguiente ejercicio recomendado
- Biometría con local_auth en Flutter: ejercicio resuelto
- Permisos con permission_handler: ejercicio resuelto
- Todos los ejercicios de Flutter
Práctica guiada y siguiente paso
- Más ejercicios de Flutter
- Ejercicios C para reforzar fundamentos
- Programación en C en 100 ejercicios resueltos
- Ver en Amazon (incluido en Kindle Unlimited)
FAQ
¿Es mejor usar un plugin existente o crear un Method Channel propio?
Siempre busca primero en pub.dev. Los platform channels propios tienen coste de mantenimiento: tienes que actualizar el código nativo cuando cambia la API del SO. Si no existe plugin o el existente no cubre tu caso, entonces el canal propio es la solución.
¿Puedo enviar datos en ambas direcciones?
MethodChannel es request-response: Dart llama, nativo responde. Para eventos continuos desde nativo a Dart (sensores, Bluetooth, geolocalización en tiempo real), usa EventChannel, que proporciona un Stream en Dart.
¿Method Channel funciona en Flutter Web y Desktop?
En Web no existe código nativo equivalente; usas JavaScript interop con dart:js_interop. En Desktop (macOS, Windows, Linux) sí existe el equivalente de platform channels con APIs de cada plataforma.