Vivek, um Engenheiro Android Sênior, e Mert, nosso Gerente de Equipe de SDK, exploram como a Veriff criou nosso plugin Flutter personalizado para nossos diferentes produtos móveis que oferecemos aos nossos clientes.
Neste post, compartilharemos nossa experiência no desenvolvimento de um plugin Flutter personalizado para os produtos móveis da Veriff.
Flutter é o kit de UI do Google para construir aplicativos bonitos, compilados nativamente para móvel, web, desktop e embarcados a partir de um único código fonte.
Os plugins Flutter são pacotes de Dart que contêm uma API escrita na linguagem Dart que combina várias implementações específicas de plataforma. Os plugins podem ser escritos para Android (Kotlin ou Java), iOS (Swift ou Objective-C), web, macOS, Windows ou Linux, ou qualquer combinação desses.
Os pacotes Flutter são módulos que contêm apenas código Dart. Já os plugins Flutter são pacotes com uma diferença. Os plugins contêm tanto código Dart quanto código específico de plataforma (Kotlin, Swift, etc.). Você pode criar um plugin Flutter com o seguinte comando:
Consulte a documentação oficial do Flutter para mais informações sobre como criar um pacote Dart.
Uma estrutura de plugin Flutter tem estas pastas:
Além dessas pastas, também haverá alguns arquivos obrigatórios como:
O plugin Flutter precisará obviamente se comunicar com a plataforma nativa correspondente. Em vez de usar geração de código ou reflexão para comunicação, o Flutter usa uma simples passagem de mensagens através de um canal para alcançar comunicação de ida e volta entre plataformas nativas. Você pode usar um MethodChannel do lado do Flutter para se comunicar com as plataformas nativas, que pode ser recebido usando um FlutterMethodChannel no iOS e um MethodChannel no Android. Uma coisa importante a ser observada é que, embora o Flutter envie chamadas de mensagens de forma assíncrona, as invocações de métodos do canal devem ser feitas na thread principal da plataforma.
Alternativamente, se você estiver confortável com o uso apenas de Objective-C para iOS e Java para Android, você também pode considerar usar o pacote Flutter Pigeon para enviar mensagens estruturadas e seguras em tipos usando geração de código.
O MethodChannel do Flutter usa um codec de mensagem padrão e envia eficientemente valores simples semelhantes a JSON, como int, double, string, lista, mapa, etc. A lista completa de tipos suportados e seus respectivos tipos de plataforma convertidos pode ser encontrada aqui.
A lista de tipos de dados suportados e sua conversão equivalente na plataforma no momento da escrita é a seguinte.
Para fins de depuração, o Flutter fornece ferramentas.
Você pode usar flutter doctor para verificar todas as ferramentas instaladas para Flutter ou <em>flutter analyze -d <DEVICE_ID></em> para analisar seu código fonte. Lembre-se de que você deve substituir DEVICE_ID pelo ID do dispositivo que está depurando.
Você pode executar o aplicativo de exemplo com seu plugin executando este comando:
Dependendo do tipo de dispositivo (Android/iOS) conectado ao seu computador, será executada a versão correspondente da plataforma.
Uma vez que seu plugin esteja pronto e testado, ele deve ser publicado em pub.dev para que outros desenvolvedores possam usá-lo em seus projetos. Antes de publicar, você deve garantir que seus arquivos pubspec.yaml, README.md e CHANGELOG.md estejam preenchidos corretamente. Alguns campos para verificar duas vezes no arquivo pubspec.yaml são:
Para publicar o plugin, você precisa de uma conta de desenvolvedor no pub.dev. Você pode criar uma conta pessoal ou pode criar uma conta verificada para um domínio. Os passos para criar uma conta verificada podem ser encontrados aqui. Uma vez que você tenha preenchido os arquivos extras obrigatórios e criado uma conta de desenvolvedor, você está pronto para publicar.
Um aspecto importante sobre a publicação de um plugin é que a publicação não é reversível. Isso é para garantir que os desenvolvedores que dependem de suas versões não tenham que lidar com uma versão quebrada se você despublicar seu plugin. Portanto, a política do pub.dev não permite despublicar seus plugins.
Como a publicação não é reversível, você precisa fazer um teste da publicação para ver se tudo está pronto para a publicação, para verificar se tudo está correto sem realmente precisar publicar. Você pode fazer um teste executando este comando:
Depois de fazer o teste e confirmar que tudo está correto, você pode fazer a publicação real executando o comando de publicação:
Assim que você executar o comando de publicação, o Flutter registrará um link no seu terminal para você fazer login na sua conta pub.dev, e você precisará clicar nesse link e completar a autenticação através do seu navegador. Uma vez logado e autorizado, seu plugin será publicado e, em 10 a 20 minutos, estará acessível para desenvolvedores de terceiros.
🎉 Parabéns, você publicou seu plugin Flutter
Uma vez que você tenha publicado seu plugin, pode ver a pontuação que ele obteve na página do plugin em pub.dev. A pontuação do plugin é calculada considerando diferentes critérios, como documentação, seguindo as convenções do Dart, etc. Junto com a pontuação, você também receberá orientações sobre como melhorar sua pontuação. É altamente recomendado que você tente melhorar sua pontuação o máximo possível.
Você pode querer automatizar a publicação de seus plugins, especialmente a partir de sua pipeline CI/CD. Para fazer isso, você precisa criar um arquivo no seguinte caminho em seu ambiente CI/CD ~/.pub-cache/credentials.json com o seguinte conteúdo:
Substitua accessToken, refreshToken, tokenEndpoint e expiration pelos seus valores correspondentes.
Você pode encontrar os valores no arquivo ~/.pub-cache/credentials.json em seu computador depois de publicar pela primeira vez. E sim, infelizmente isso significa que você precisa fazer a primeira publicação manualmente do seu computador para obtê-los.
Uma vez que você tenha criado o arquivo credentials.json em seu ambiente CI, você pode executar o seguinte comando a partir do seu CI/CD para fazer a publicação automaticamente sem o prompt para login manualmente:
Vivekanandan A S - Engenheiro Android Sênior
Mert Çelik - Gerente de Equipe de SDK