Flutter é un framework basato sul linguaggio di sviluppo Dart. Permette di creare applicazioni cross-platform, ma non solo mobile (iOS, Android).
Si può infatti sviluppare soluzioni web e applicativi desktop.
Un framework che ha l’ambizione di essere ‘davvero’ un cross-platform a tutti gli effetti.
Flutter é basato su due macro livelli (uno in C/C++ e l’altro realizzato con Dart); lo possiamo riassumere con le seguenti caratteristiche:
- Performance pari delle applicazioni native (Android / iOS)
- Svariate possibilità di sviluppare interfacce flessibili e relativamente semplici da implementare.
- Documentazione ricca e una community in crescita che mette a disposizione (oltre a quelli ufficiali flutter) svariati widget da usare nelle nostre applicazioni.
Non voglio con questo articolo scendere nel dettaglio del funzionamento di Flutter e neanche vedere insieme un primo hello world. Semmai vorrei parlare della mia personale esperienza e del perché lo stiamo utilizzando in azienda (codeploy.it).
Cross platform
Il primo perché, sebbene sia scontato, è la possibilità di avere un vero framework cross-platform. Una unica codebase per applicazioni iOS e Android è sicuramente l’obiettivo tanto cercato da sviluppatori (e forse ancor di più dalle aziende).
Flutter raggiunge pienamente questo obiettivo sebbene ci sia talvolta la necessità di andare a gestire alcune differenze tra iOS e Android.
Non facciamoci ingannare. Cross platform non vuol dire che ‘se uso uno specifico widget allora funziona correttamente su iOS e Android’.
Potrebbe essere necessario, per esempio, impostare configurazioni diverse su AndroidManifest piuttosto che su info.plist; non dimentichiamoci inoltre dalla UX. Apple e Android hanno due esperienze di navigazione diverse e questo potrebbe voler dire avere due tipi di interfaccia differenti.
Nulla di complicato, anzi.
Era giusto ricordare che cross-platform non é una magia :)
Curva di apprendimento
Qui abbiamo un primo scoglio; Flutter può sembrare ostico le prime volte. Dart, il linguaggio su cui si basa, é un linguaggio a oggetti e questo semplifica ovviamente l’apprendimento. Tuttavia il concetto di widget che il framework introduce non é immediato.
Già, perché se domandate a uno sviluppatore Flutter ‘cos’è un widget’? La sua risposta é: ‘in Flutter TUTTO è un widget’.
La risposta migliore e anche peggiore che si possa ottenere. Risponde a tutto e non risponde a niente :D
Provo a dare una definizione:
Possiamo definire un widget come un oggetto che specifica il comportamento di una nostra parte dell’app. Al suo interno contiene la definizione stessa dell’interfaccia e il suo stato.
Tutto è un widget in quanto un widget può contenere un altro widget, che a sua volta ne contiene un altro, e un altro …
Lavorando con Flutter è buona norma disegnare l’albero dei widget che si sta concretizzando.
Scaffold per esempio è un widget che definisce al suo interno un body, un app bar, un floating button, una nav bar. Dentro il body possono essere inseriti altri widget.
In sostanza disegnare un’app vuol dire disegnare alberi di widget.
Non dimentichiamoci e non confondiamoci tuttavia con le Class che contengono al loro interno definizioni di oggetti e variabili (come le classiche classi dei linguaggi ad oggetti).
Tantissimi widget!
Personalmente ho trovato il repository dei package/widget di Flutter un punto vincente di questo framework e della sua rapida diffusione. Molti widget nativi e tanti altri della community. Tutti presenti al sito https://pub.dev/
La maggior parte ben documentati, con codici di esempio fatti bene e completi. Inoltre la valutazione di un widget è impostata su tre parametri
- likes -> ricevuti da utenti che lo valutano con un semplice like
- popularity -> il grado di popolarità e quindi di utilizzo
- pub/points -> una valutazione qualitativa in punti del widget in oggetto
Interfaccia del sito recentemente rivista, ma sopratutto un marketplace di widget utili, fatti bene e che velocizzano gli sviluppi.
Direi che chiunque voglia sviluppare con Flutter e si trova alle prime armi , può partire dalla classica domanda: ‘lo ha già fatto qualcuno?’.
La risposta al 99% dei casi é SI.
Questo vuol dire che esiste già un plugin dentro pub.dev.
Aggiungo ancora:
Vedere come é stato realizzato uno specifico widget e modificarlo o rifarlo é semplicissimo. Si prende visione velocemente e facilmente del codice del plugin importato potendo quindi crearne una versione propria.
Flessibilità o Struttura?
Qui siamo a un bivio. Un bivio che solitamente divide chi è più amante della flessibilità contro chi invece preferisce un po’ più di rigidità per avere delle linee guida e degli standard pratici da seguire.
Vorrei definire Flutter come la giusta via di mezzo.
- È super flessibile (e di fatto questo é anche un primo ostacolo all’apprendimento)
- Dalla sua nascita ad oggi sono nati plugin e pattern di sviluppo che lo rendono più strutturato (o forse meglio ‘strutturabile’)
La flessibilità è data dalla natura stessa del linguaggio e di widget. Se non fosse flessibile non sarebbe un linguaggio cross-platform, inoltre la possibilità di avere una sola definizione chiave (widget) e di costruirci attorno un mondo …è sicuramente flessibilità!
Dall’altra parte in un anno di apprendimento e lavoro siamo arrivati ad effettuare almeno 3 refactory del codice. Alla fine siamo riusciti a trovare il pattern che più rispecchia le nostre esigenze e anche il nostro modo di lavorare.
Il tutto integrando più plugin e strutturando file e directory in un modo più standardatizzato.
Flutter in questo anche necessita quindi di studio e pratica.
Conclusioni e prossimi approfondimenti
Come scritto a inizio post, questo articolo vuole principalmente parlare di esperienza e motivi che hanno spinto me e Codeploy a scegliere questo framework di sviluppo.
Ulteriori dettagli saranno presenti in altri articoli. Parleremo per esempio di:
- state management & design architecture
- best widget
- ui & themes
Se vuoi discuterne insieme o hai un progetto in mente da realizzare scrivi a info@codeploy.it o a andrea.ciaccia@codeploy.it