Flutter es el nuevo framework de Google para el desarrollo de aplicaciones móviles en el cual utilizamos el lenguaje conocido como Dart. Este framework nos permite crear poderosas aplicaciones móviles que corren de forma casi nativa.

Ahora bien, la pregunta es qué pasa con lo que he desarrollado en nativo y principalmente con las librerías de terceros que no existen en Flutter. Para ello existen los MethodChannels mediante los cuales como si fuera un API conectamos funciones en código nativo (Java/Kotlin/Swift) con nuestras funcionalidades de Dart.

¿Como crear uno?

Para crear uno tendrás que entender cómo funciona del lado nativo Flutter y es que en las aplicaciones en realidad existe una sola pantalla que este framework se encarga de cambiar contenido.

Este ejemplo se basa en Android con Kotlin:


Como podemos ver se crea un objeto de tipo MethodChannel que recibe el básico flutterView y recibe un String que será el nombre de nuestro canal. Posteriormente vemos que se coloca el manejador del mismo método mediante el método setMethodCallHandler que recibe la llamada de este y una variable para poder devolver el resultado.

Parte nativa:

Ejemplo en Kotlin

Ahora dentro de tomamos la variable correspondiente a la llamada del método y solicitamos el método para compararlo como un String.

Esto se debe a que un canal como dije anteriormente es como una API por lo que tiene múltiples métodos o funciones.

Una vez que haya decidido que debe hacer en base al nombre de la función y se ejecute el código que corresponda, usamos la variable result para poder devolver mediante el método success un valor. Es importante que sepamos que esto pueden ser solo tipos y no objetos.

En Flutter:

Ahora del lado de Dart la implementación es muy simple.

Implementación Dart

Lo primero es crear una variable de tipo MethodChannel la cual inicializamos utilizando el nombre del canal que definimos. Posteriormente hay una variable y un método que hará uso del MethodChannel.

Dentro del método vemos que la variable recibe mediante un await el resultado del channel invocando la función por su nombre.

Es importante que mantengamos está función dentro de un try/catch para capturar cualquier error qué el lenguaje nativo pueda devolver.

Dejo la documentación oficial como referencia: http://bit.ly/2vltwqa