2 - Comencem amb Flet
1. Components de programari
En el desenvolupament de circuits electrònics, el grau de reutilització de components és molt alt, de manera que la construcció d'un circuit electrònic es limita a la integració i acoblament de diferents components comercials. Per exemple, una placa base conté components com resistències, condensadors, relés, xips…, que no han estat fabricats pel fabricant de la placa. Així que, hi ha fabricants especialitzats en components i altres en producte final. Això permet reduir costos quant a temps i diners es refereix.
En el desenvolupament de programari, la reutilització de codi continua sent relativament escassa, però amb la utilització de components aquest problema es redueix, reduint alhora el temps de desenvolupament, el cost econòmic i els errors de programació.
El desenvolupament de la interfície d'una aplicació es basa en la construcció d'una aplicació a partir de components programari ja existents, anomenats normalment controls, limitant al mínim necessari el desenvolupament de codi nou. Podem imaginar-nos els components com les peces d'un Lego que podem connectar entre ells en una jerarquia d'arbre. Qualsevol aplicació pot estar composta per múltiples components, i els components principals tenen components secundaris niats dins seu.
Vam veure una llista dels principals controls d'usuari a la unitat anterior. En aquesta unitat posarem en pràctica l'ús dels controls o components esmentats amb Flet.
2. Instal·lació de Flet
Flet necessita com a mínim la versió 3.7 de Python, així que el que recomanem és crear un entorn virtual nou. Una vegada creat i activat, instal·larem flet.
Ús de Flet amb WSL
Si executeu Flet amb WSL i obteniu l'error error while loading shared libraries: libgstapp-1.0.so.0: cannot open shared object file: No such file or directory
, necessitareu instal·lar les llibreries GStreamer.
Error libmpv.so.1: cannot open shared object file
3. Estructura bàsica d'un programa Flet
L'estructura mínima d'un programa Flet és la següent:
Python | |
---|---|
Un programa típic de Flet acaba amb una crida a flet.app() on comença l'aplicació esperant noves sessions d'usuari. La funció main() és el punt d'entrada de l'aplicació. Per a cada sessió d'usuari es crearà un fil d'execució, que se li passarà la instància de Page.
Quan s'executa l'aplicació Flet al navegador, s'inicia una nova sessió d'usuari per a cada pestanya o pàgina oberta. Quan s'executa com a aplicació d'escriptori, només es crea una sessió.
Page és com un llenç específic per a cada usuari, un estat visual d'una sessió d'usuari. Per crear una GUI, afegim i suprimim controls a una pàgina.
Per defecte, l'aplicació Flet s'inicia en una finestra del sistema operatiu natiu, però, podem obrir-la en una finestra del navegador modificant la crida a flet.app() i indicant el port desitjat (aleatori en cas de no especificar-lo):
Python | |
---|---|
3.1. Hello world!!
Els controls són els elements bàsics i principals per crear interfícies d'usuari a Flutter. Podeu mostrar informació, rebre informació de l'usuari i organitzar altres controls de forma agrupada.
Exemple
Si executem el codi anterior obtindrem una aplicació com la següent:
Dins la finestra estarà continguda tota la interfície de l'usuari. En aquest cas, només conté un component Text centrar tant verticalment com horitzontalment, sense interacció possible. Cada aplicació gràfica tindrà almenys una finestra, però en podrà tenir més. Això ho veurem en seccions posteriors de la unitat. Normalment una aplicació acabarà en tancar la darrera de les finestres.
4. Controls
La interfície d'usuari està feta de controls (també coneguts com widgets). Per fer visibles els controls per a un usuari, s'han d'afegir a un Page o dins d'altres controls que ja siguen visibles. La pàgina és el control superior, i la resta de controls pengen d'aquesta arrel formant una estructura d'arbre.
Els controls són classes de Python, simplement els instanciarem mitjançant els seus constructors amb els paràmetres que ens convinga, per exemple:
Python | |
---|---|
Per mostrar el control anterior, l'afegim a la llista de controls de Page i fem una crida a page.update() per enviar els canvis de pàgina a un navegador o client d'escriptori:
Python | |
---|---|
Podem modificar les propietats del control i la interfície d'usuari s'actualitzarà en la següent crida a page.update():
Python | |
---|---|
Actualització de controls
El mètode Page.update() només actualitzarà els canvis fets des de l'última crida al mateix mètode. Podeu afegir, eliminar o modificar tants controls com vulgau abans de la seua crida, de forma que l'actualització siga en lot.
Alguns controls són contenidor d'altres controls (com Page). Per exemple, el control Row permet organitzar els controls en fila:
Python | |
---|---|
4.1. Esdeveniments
Cada interacció de l'usuari amb la interfície, per exemple un clic de ratolí, un doble clic, l'ús d'una tecla, etc. generarà un esdeveniment. Aquest esdeveniment serà afegit a la cua d'esdeveniments (event queue) per ser gestionat.
El bucle d'esdeveniments (event loop), que és un bucle infinit, comprovarà a cada iteració si hi ha esdeveniments pendents de ser gestionats. En cas de ser així, l'esdeveniment serà gestionat pel gestor d'esdeveniments (event handler) que executarà el vostre controlador. Quan aquest acaba, el control torna al bucle d'esdeveniments per esperar més esdeveniments. Açò ja ho vam utilitzar al joc que desenvoluparem amb PyGame.
Tot aquest procés complex, s'oculta al programados, que simplement haurà de programar quina funcionalitat s'executa en produir-se cert esdeveniment.
Flet vs Flutter
Flet implementa un model d'interfície d'usuari imperatiu on creeu "manualment" la interfície d'usuari de l'aplicació amb controls d'estat i després la modifiqueu actualitzant les propietats de control. En canvi, Flutter implementa un model declaratiu on la interfície d'usuari es reconstrueix automàticament amb els canvis de dades de l'aplicació. La gestió de l'estat de l'aplicació a les aplicacions frontend modernes és una tasca inherentment complexa i l'enfocament de la vella escola de Flet és més atractiu i simple per als programadors sense experiència en el frontend.
Propietat visible
Cada control té la propietat visible que és True per defecte. La configuració visible a False impedeix que el control (i tots els seus fills, si hi ha) es mostren. Els controls ocults no es poden enfocar, ni seleccionar amb un teclat o ratolí i no emeten cap esdeveniment.
Propietat disabled
Cada control té la propietat disabled que és False per defecte, el control i tots els seus fills estan habilitats. S'utilitza principalment amb controls d'entrada de dades com els botons, TextField, Dropdown, Checkbox,... Tanmateix, disabled es podria establir en un control pare i el seu valor es propagarà a tots els fills de forma recursiva.
4.2. Referències a Controls
Els controls Flet són objectes i per accedir a les seves propietats hem de mantenir les referències (variables) a aquests objectes. Quan s'afegeixen molts controls i controladors d'esdeveniments, es fa difícil mantindre totes les definicions de control en un sol lloc, de manera que es dispersen pel cos del main(). Mirant els paràmetres de page.add(), és difícil imaginar (sense mirar constantment a les definicions de variables) com seria la forma final de la interfície (ahí pot ajudar molt el nom de la variable).
Python | |
---|---|
Flet proporciona una classe Ref que permet definir una referència al control, utilitzar aquesta referència als controladors d'esdeveniments i establir la referència a un control.
Per definir una nova referència a un control:
Python | |
---|---|
Per accedir al control referenciat (desreferència del control), utilitzem la propietat Ref.current:
Python | |
---|---|
Per utilitzar la referència al control:
Compareu els següents fragments de codi:
Variables de control vs Referències a controls
Sense Refs
Amb Refs
En este punt pots realitzar l'activitat 1.
5. Principals controls en formularis
A la primera unitat vam veure un llistat de controls habituals juntament amb el seu ús habitual. Farem un llistat amb els controls més habituals de Flet usats en formularis, juntament amb algun dels seus esdeveniments. Practicarem amb exemples i exercicis en altres apartats de la unitat. Per obtenir una llista completa i més informació de cadascun, cal consultar la documentació de Flet.
Controls
Python | |
---|---|
En este punt pots realitzar l'activitat 2.