
Flutter è il framework di Google per la creazione di app native per dispositivi mobili; in realtà, è in grado di creare anche applicazioni web e desktop, ma sia il supporto web che quello desktop, sono attualmente (Dicembre 2020) in alpha.
Per fare questa magia, Flutter utilizza il linguaggio di programmazione orientato agli oggetti Dart: in breve, tu scrivi l’applicazione in Dart, e te ne viene generata una nativa per iOS, e una nativa per Android.
Perchè permette di scrivere una sola applicazione che potrà andare sia su iOS che sui dispositivi Android. L’aspetto veramente interessante infatti è che permette di sviluppare un’applicazione senza pensare se girerà su iOS o Android, perchè alla fine verrà generato sia il pacchetto per lo store di Apple, che per quello di Android.
A differenza di altri sistemi come Apache Cordova, che è un framework che interpreta a run-time un’applicazione scritta in HTML e JS (di conseguenza è molto più lento di un’app nativa) il risultato, nel caso di Flutter, sarà invece quello di avere due app native generate da una sola app scritta in Dart.
Flutter ha un proprio engine di rendering, uno degli elementi che gli permette di offrire prestazioni molto vicine a quelle della app native, e si interfaccia con le SDK native di Android e di iOS. Parlando di performance, la voce dedicata a Flutter nella Wikipedia in inglese, ci dice che a Maggio 2020 è stato aggiunto il supporto alle Metal API, che migliorano le performance sui dispositivi iOS all’incirca del 50%.
Il risparmio di tempo e di risorse è evidente; se poi anche le performance sono confrontabili con quelle di app native scritte e compilate con i rispettivi ambienti di sviluppo iOS/Android, allora Flutter ha le carte in regola per essere riconosciuto come lo strumento che il mercato cercava da anni, dopo sperimentazioni più o meno valide come Apache Cordova, XAMARIN e altre meno utilizzate.
Un’applicazione Flutter viene eseguita sia su iOS che su Android in modo nativo usando una compilazione di tipo AOT, mentre durante lo sviluppo viene utilizzata una compilazione JIT che risulta più veloce e quindi più adatta alle esigenze di sviluppo, in cui molto spesso si fanno modifiche che il programmatore vuole vedere il più velocemente possibile.
La curva di apprendimento per chi ha un’esperienza con linguaggi Object Oriented, è decisamente bassa; il Dart è un linguaggio di programmazione moderno e orientato agli oggetti. L’unica cosa da capire davvero per iniziare a sviluppare app con Flutter, è che tutto è un Widget, e che sviluppare con Flutter significa montare tanti Widget diversi in maniera sensata.
Sull’aspetto della velocità di sviluppo, un elemento che ho apprezzato molto è la possibilità dell’hot reload, che evita di riavviare tutto continuamente; infatti, l’app viene aggiornata senza ricompilare, attraverso l’inserimento nella Dart Virtual Machine del codice sorgente modificato. La VM aggiorna velocemente tutte le classi modificate e Flutter ricostruisce l’alberatura dei widget per mostrarne gli effetti a video.
Flutter offre inoltre un set di widget componibili e di librerie che permettono di sviluppare un’app utilizzando strumenti già creati e messi a disposizione dal framework e da altri programmatori, come ad esempio il pacchetto per collegare l’app via HTTP ad un webserver remoto https://pub.dev/packages/http.
I Widget sono il componente base di un’applicazione Flutter (testi, box contenitori, immagini e altro) e vengono interpretati e rappresentati sulla Canvas di Skia (libreria grafica open source sviluppata da Google) dove vengono anche intercettati gli eventi di interazione umana con l’app (ad esempio il click su un bottone). I Widget formano una struttura gerarchica nella quale vengono ereditate le caratteristiche del Widget genitori, in pieno stile Object Oriented.
Flutter permette di creare app utilizzando sia il linguaggio di design di Google (il Material Design con i widget Material https://flutter.dev/docs/development/ui/widgets/material) che le indicazioni di design di Apple con i widget Cupertino https://flutter.dev/docs/development/ui/widgets/cupertino).