Como conectar minha App Android ao Flutter — Platform Channels

Igor L Sambo💙🇲🇿
GDG Maputo
Published in
4 min readApr 27, 2021

Acoplar Flutter a um projecto antigo em Android ou usando recursos de plataformas como Unity, Android e iOS, (etc, porque é portable) aproveitando o melhor de ambas.

É sempre questionado até que ponto o Flutter é poderoso, bom… ele é super poderoso, porém, não é perfeito, ou seja, como framework ele é capaz de compilar projectos de forma nativa, mas isso graças à capacidade do Dart compilar pra nativo, contudo, por si só ele não possui acesso a todos serviços e sensores, existindo cobertura para alguns como a camera e possibilitando localizar dispositivos, mas precisando de implementações específicas/proprietárias para outras funcionalidades, por isso a necessidade de integrar vários pacotes para atingir alguns casos de uso.

Mas e se não tiver um pacote para responder à minha necessidade? Significa que fico sem poder resolver o meu problema e não finalizar o projecto em mãos? A resposta é não, porque da mesma forma que os pacotes são desenvolvidos por vários membros da comunidade, qualquer um de nós tem os recursos para tal, exactamente com o Flutter, e é o que iremos abordar no presente artigo.

MethodChannel X FlutterMethodChannel

Como introduzido anteriormente, o Flutter ele é um framework que compila em nativo, porém, ele não é nativo, precisando de uma forma de comunicar com a respectiva plataforma nativa, sendo essa a base de funcionamento do framework.

Onde temos a nossa aplicação a controlar os estado da aplicação (as ações do utilizador) e as mesmas “conversam” com a plataforma para responder caso haja necessidade, suponhamos que precisamos efectuar uma ligação telefónica através da nossa app, onde temos o nosso Texfield para o número ou uma lista, seja qual for a nossa lógica, quando o utilizador pressionar no botão com a ação para ligar este aciona uma ação nativa à plataforma, ou seja, tanto o Android assim como o iOS tem formas distintas de realizar esta operação, mas o Flutter consegue de forma nativa (porque compila em nativo) chamar a API da plataforma para realizar esta tarefa. Mas este é um exemplo trivial (embora seja por meio de um pacote) onde o MethodChannel e/ou FlutterMethodChannel são acionados de forma “automática” sem precisarmos pessoalmente mexer em chamadas para esta API. E se precisarmos implementar uma app que precise acessar a API de localização ou sensores?

É por esse motivo que este artigo foi desenvolvido, para dar a autonomia de trabalhar com este tipo de implementações mesmo quando não estiverem disponível soluções “straight out the box”.

Em suma, MethodChannel ou FlutterMethodChannel para Android e iOS, respectivamente são canais de comunicação que permitem ao Flutter acesso às bibliotecas nativas; algumas já integradas ao frameworks, outras já disponíveis por meio de pacotes e outras aguardando o seu contributo. E também é possível aceder a outras plataformas Unity.

Para este artigo vamos usar um exemplo super fácil e considerar dois cenários simples, e estaremos considerando apenas Android como exemplo.

  1. Flutter chama nativo

Basicamente, o que devemos considerar ou perceber é que a comunicação entre as plataformas é estabelecida entre um canal que por nós deverá ser criado e ambas partes devem apontar a este mesmo canal. E não precisamos nos agitar achando que precisamos configurar um canal super complexo.

final channelName = 'package_name/action_name';

Após estabelecer o seu canal de comunicação é então momento de estabelecer contacto — “Houston, we have a Channel”...

a. Lado Flutter

No lado do flutter, após criar e especificar o canal (channelName) instanciando o MethodChannel pelo pacote de serviços e chamar o método pela designação (string).
E é isso!

import 'package:flutter/services.dart';...final methodChannel = MethodChannel(channelName);
await methodChannel.invokeMethod("hello");

b. Lado Android

2. Nativo para Flutter

Assumindo que já cutucamos o lado nativo e temos a sua atenção, precisamos verificar se há algum tipo de resposta do seu lado, assim podemos igualmente do lado Flutter receber a informação que eventualmente é processada pelo lado nativo.

a. Lado Android

Após o setup considerado acima para a comunicação no sentido contrário, que é o mesmo para este cenário, é necessário mandar o resultado para o Flutter.

if (call.method == "convo"){

result.success( "Hey, wassup!")

}

É possível também ter outros tipos de resultados como erro ou a não implementação da função,

result.error(MENSAGEM A PASSAR) //erroresult.notImplemented() //ausência de implementação

b. Lado Flutter

try {
final methodChannel = MethodChannel(channelName);
/// pegar o resultado tido pelo canal para uma variável do lado flutter
_msg = await methodChannel.invokeMethod("convo");
} on PlatformException catch (err) {
msg = "Não te posso responder $err";
}

Exemplo gráfico

O projecto já actualizado está disponível pelo github, espero que tire proveito do mesmo e contribua com melhorias em qualquer aspecto.

Espero que tenha aprendido com este artigo e que se tenha divertido enquanto lia.

Obrigado por acompanhar até ao fim e espero por você no próximo artigo.

Para questões e sugestões esteja a vontade para tal nos comentários, email igorlsambo1999@gmail.com ou twitter @lsambo02.

Obrigado e até ao próximo artigo!!!

--

--