Você já enfrentou o desafio de fazer um aplicativo Flutter usar recursos nativos? Muitas vezes, isso pode ser um tanto traumático. Certa vez, precisei fazer com que um aplicativo usando React Native + Expo utilizasse o GPS em um dispositivo de pagamentos com Android, e isso foi uma experiência muito bacana. Porém, fora da minha stack habitual, isso me deixou com receios. Mas, afinal, o que é um desenvolvedor sem desafios, não é mesmo?
No Flutter, estou tendo essa experiência e estou achando fantástica. Para quem não conhece o mercado de meio de pagamentos, na maioria dos casos, temos dispositivos Smart POS com versões Android um tanto quanto parecidas com o Axl Rose - com bastante idade, mas que ainda fazem um bom rock. Também temos dispositivos que usam um smartphone como ponte de pagamento, usando Bluetooth (tão amados pinpads).
Junto com os Smart POS, temos as bibliotecas das fabricantes do equipamento que possibilitam o uso da impressora interna, GPS, etc. Além disso, temos as bibliotecas para que possamos transacionar por uma adquirente (fazendo sub). Em sua maior parte, não temos bibliotecas oficiais em Flutter, por exemplo. Daí que começamos a saga.
Jnigen e Jni da nova geração
Jnigen nada mais é do que um gerador das ligações do JNI, o que facilita muito! Me lembrou muito o java2op do Delphi 11 (para Android, sim, eu também tive essa experiência). Para cada classe, temos um wrapper - JString
, JInt
, etc. Podemos separar nas configurações quais classes vamos gerar, o método de geração e mais. O desenvolvimento tem muito menos atritos e flui com mais velocidade.
Mas nem tudo são flores com o jnigen
: apesar de evoluir a passos largos até a data desta postagem, ainda é considerado como "experimental", então não espere que funcione corretamente em 100% dos casos. Eu e meus "comparsas" de desenvolvimento tivemos um "crash" (Segmentation fault (11)) com dispositivos mais antigos rodando API level 23(foi corrigido aqui). Nos Androids mais novos, ficou supimpa!
Pigeon e os caminhos sagrados
Com Pigeon, o caminho é um pouco diferente, pois ele já usa o clássico "method channel". Existem algumas deficiências, como, por exemplo, não lidar com herança no código a ser gerado e talvez ficar um pouco confuso para você escolher entre FlutterApi
ou HostApi
. Você escreve o código Dart e, a partir daí, ele gera as conexões, mas sem mixins
, interfaces
e etc.
O lado bom é que você estará usando um método de comunicação com o código nativo muito mais testado, amplamente usado e estável.
Hoje, eu e meus comparsas partimos de Pigeon
, mas continuamos de olho no Jnigen
.