Packages nativi per Flutter

Flutter è un tool fantastico, ci consente di risparmiare tempo nello sviluppo e di conseguenza di far risparmiare soldi ai nostri clienti.

Certe volte però si presentano delle limitazioni, spesso dovute al fatto che una libreria non è disponibile su pub.dev o magari più semplicemente la funzionalità che si vuole andare a sviluppare sarebbe molto più performante se sviluppata in nativo o addirittura, caso forse più remoto,  l’API di sistema che vogliamo utilizzare non è stata portata su Flutter.

In questi casi la cosa migliore da fare è scrivere un package per la nostra applicazione Flutter completamente da zero.

Questo ci consentirà di raggiungere livelli di personalizzazione molto elevati e di sfruttare al meglio le API di sistema.

Non si tratta proprio di una passeggiata in quanto per poterlo fare è necessario avere delle buone conoscenze di Flutter così come di Swift/Objective-c per iOS e Kotlin/Java per Android.

Package Types

Esistono diversi tipi di package, i più semplici sono i Dart Package, che non sono altro che package esterni scritti in linguaggio Dart e che sfruttano le normali funzionalità di Flutter.
Noi gli utilizziamo spesso per creare delle parti di codice modulare che è possibile riutilizzare in diverse applicazioni, come per esempio la logica di funzionamento delle API REST.

Ci sono poi i Plugin Packages che sono composti da delle parti scritte in codice nativo che permettono di sfruttare a pieno le API dei sistemi operativi coinvolti e una parte scritta in Dart che funge da ponte tra la nostra applicazione Flutter e il plugin.

Quello che andremo ad analizzare in questo caso è un package del secondo tipo, che ci consente di scrivere un plugin che include codice nativo per le piattaforme Android e iOS.

Creazione del Package

Flutter mette a nostra disposizione un comando CLI per la creazione del nostro package, questo ci permette di utilizzare un template già pronto che ci consentirà di creare la struttura del nostro package in automatico e senza rischiare di introdurre eventuali anomalie.

Il comando di cui parlo è flutter create che prende come parametri la tipologia di template da utilizzare, in questo caso stiamo andando a creare un package quindi useremo l’apposito template, il nome del nostro package, le piattaforme supportate e infine se vogliamo possiamo specificare anche quale linguaggio di programmazione utilizzare tra quelli supportati per ogni piattaforma.

flutter create –org com.mycompany –template=plugin –platforms=android,ios -a kotlin -i swift my_package

Il comando sopra andrà a creare lo scheletro di un package che supporta i sistemi operativi Android e iOS, utilizzerà Swift come linguaggio di programmazione per iOS e Kotlin come linguaggio di programmazione per Android.

Il mio consiglio è quello di creare un repository interno per il plugin in modo che la manutenzione dello stesso possa essere fatta esternamente allo sviluppo dell’applicazione e il package possa essere riutilizzato in futuro in altre applicazioni. 

Per farlo vi basta semplicemente andare nella cartella root del package e dare il comando git init 

Deep Inside

Bene! Ora che abbiamo creato il nostro package ci accorgiamo subito che al suo interno è strutturato come la maggior parte dei progetti Flutter, tra le poche differenze notiamo che contiene una cartella specifica per ogni sistema operativo con all’interno una classe che implementa l’interfaccia FlutterPlugin, questa interfaccia definisce i le funzioni che ci consentiranno di interagire con la piattaforma.

Al momento al sui interno vengono definiti solamente due metodi, che sono onAttachedToEngine e onDetachedFromEngine che vengono chiamati rispettivamente quando il plugin viene agganciato all’engine Flutter e quando viene sganciato.

Se avete utilizzato il template per la creazione del package al loro interno troverete già implementato il codice che si occupa della gestione del MethodChannel, che non è altro che la classe che si occupa di mettere in comunicazione il codice specifico per le varie piattaforme e la vostra applicazione Flutter.

Altra interfaccia degna di nota è sicuramente MethodCallHandler, che espone una sola funzione chiamata onMethodCall che viene invocata quando un metodo viene richiamato.
Alla funzione viene passato un’oggetto MethodCall contenente il nome del metodo invocato e i parametri.

Ora non ci resta altro che richiamare il nostro codice nativo in base alle informazioni contenute in MethodCall.

Info utili

ActivityAware su Android è un’interfaccia che se implementata consente al plugin di essere notificato quando il lifecycle dell’activity cambia.

Se durante lo sviluppo del plugin utilizzate Android Studio per la parte Android e non vi vengono riconosciute le librerie Flutter, con conseguente disfunzione dell’autocomplete e mancanza della documentazione potete includere il seguente import nel vostro file Gradle, ricordate però di rimuoverla una volta completato lo sviluppo.

implementation files(‘/path_to_your_flutter_installation/bin/cache/artifacts/engine/android-x64/flutter.jar)

Conclusioni

La possibilità di poter includere codice nativo nelle nostre applicazioni Flutter è fantastica, ci permette di poter utilizzare Flutter per fare praticamente tutto quello che vogliamo.

Come già discusso in precedenza però non è facile sviluppare codice per entrambe le piattaforme, è comunque richiesta una buona conoscenza dei linguaggi di programmazione nativi, dei tool di pacchettizzazione e delle API di sistema native.


Per fortuna se vi trovate in difficoltà potete sempre rivolgervi alla Mine Consulting SRL.

Share:

This post has no Comment

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *