En aquest tema, explorarem l'arquitectura de Flutter per entendre com funciona aquest framework i com es construeixen les aplicacions. Aquesta comprensió és fonamental per desenvolupar aplicacions eficients i escalables.
Objectius d'Aprenentatge
- Comprendre els components clau de l'arquitectura de Flutter.
- Aprendre com Flutter renderitza la interfície d'usuari.
- Entendre el cicle de vida d'una aplicació Flutter.
Components Clau de l'Arquitectura de Flutter
Flutter es basa en una arquitectura de tres capes principals:
-
Framework: Aquesta és la capa més alta i està escrita en Dart. Inclou:
- Widgets: Els blocs de construcció bàsics de la interfície d'usuari.
- Render: Gestiona el layout i el dibuix dels widgets.
- Gestió d'Estat: Controla l'estat de l'aplicació i els canvis en la interfície d'usuari.
-
Engine: Aquesta capa està escrita en C++ i proporciona serveis de baix nivell com:
- Skia: Una biblioteca gràfica 2D que renderitza la interfície d'usuari.
- Motor de Text: Per al renderitzat de text.
- Gestió d'Entrades: Per gestionar els esdeveniments d'entrada com tocs i gestos.
-
Embedder: Aquesta capa permet que Flutter s'executi en diferents plataformes (iOS, Android, web, escriptori). Inclou:
- Plataforma Nativa: Integració amb les API natives de la plataforma.
- Canals de Plataforma: Permet la comunicació entre el codi Dart i el codi natiu.
Renderització de la Interfície d'Usuari
Flutter utilitza un motor de renderització basat en Skia per dibuixar la interfície d'usuari. A diferència d'altres frameworks que utilitzen components natius, Flutter dibuixa tot des de zero, la qual cosa permet una gran flexibilitat i control sobre l'aparença i el comportament de l'aplicació.
Cicle de Renderització
- Construcció del Widget Tree: Quan es crea o actualitza un widget, es construeix un arbre de widgets.
- Layout: Flutter calcula la mida i la posició de cada widget.
- Pintura: Els widgets es dibuixen a la pantalla utilitzant Skia.
- Composició: Les diferents capes de la interfície d'usuari es combinen per formar la pantalla final.
Cicle de Vida d'una Aplicació Flutter
Entendre el cicle de vida d'una aplicació Flutter és crucial per gestionar correctament els recursos i l'estat de l'aplicació.
Fases del Cicle de Vida
- Inici: L'aplicació es carrega i es mostra la pantalla inicial.
- Execució: L'aplicació està activa i interactuant amb l'usuari.
- Pausa: L'aplicació està en segon pla però no ha estat tancada.
- Reprendre: L'aplicació torna a estar activa després d'estar en segon pla.
- Tancament: L'aplicació es tanca i es netegen els recursos.
Exemple de Codi: Gestió del Cicle de Vida
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); if (state == AppLifecycleState.paused) { print('App is in background'); } else if (state == AppLifecycleState.resumed) { print('App is in foreground'); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Flutter Lifecycle Example'), ), body: Center( child: Text('Observe the console for lifecycle changes.'), ), ); } }
Exercici Pràctic
Objectiu
Crear una aplicació Flutter que mostri un missatge diferent segons l'estat del cicle de vida de l'aplicació.
Passos
- Crea un nou projecte Flutter.
- Implementa la classe
WidgetsBindingObserver
per observar els canvis en el cicle de vida. - Mostra un
SnackBar
amb un missatge diferent per a cada estat del cicle de vida (inici, pausa, reprendre, tancament).
Solució
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); String message; if (state == AppLifecycleState.paused) { message = 'App is in background'; } else if (state == AppLifecycleState.resumed) { message = 'App is in foreground'; } else if (state == AppLifecycleState.inactive) { message = 'App is inactive'; } else if (state == AppLifecycleState.detached) { message = 'App is detached'; } ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(message))); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Flutter Lifecycle Example'), ), body: Center( child: Text('Observe the console for lifecycle changes.'), ), ); } }
Resum
En aquesta secció, hem après sobre l'arquitectura de Flutter, incloent-hi els components clau com el framework, l'engine i l'embedder. També hem explorat com Flutter renderitza la interfície d'usuari i el cicle de vida d'una aplicació Flutter. Aquesta comprensió és essencial per desenvolupar aplicacions robustes i eficients.
En el següent tema, ens endinsarem en la creació de la teva primera aplicació Flutter, aplicant els conceptes apresos fins ara.
Curs de Desenvolupament Flutter
Mòdul 1: Introducció a Flutter
- Què és Flutter?
- Configuració de l'Entorn de Desenvolupament
- Comprensió de l'Arquitectura de Flutter
- Creació de la Teva Primera Aplicació Flutter
Mòdul 2: Conceptes Bàsics de Programació en Dart
- Introducció a Dart
- Variables i Tipus de Dades
- Sentències de Flux de Control
- Funcions i Mètodes
- Programació Orientada a Objectes en Dart
Mòdul 3: Widgets de Flutter
- Introducció als Widgets
- Widgets Stateless vs Stateful
- Widgets Bàsics
- Widgets de Disseny
- Widgets d'Entrada i Formulari
Mòdul 4: Gestió de l'Estat
Mòdul 5: Navegació i Enrutament
- Introducció a la Navegació
- Navegació Bàsica
- Rutes Nomenades
- Passar Dades Entre Pantalles
- Deep Linking
Mòdul 6: Xarxes i APIs
- Obtenir Dades d'Internet
- Analitzar Dades JSON
- Gestió d'Errors de Xarxa
- Ús d'APIs REST
- Integració de GraphQL
Mòdul 7: Persistència i Emmagatzematge
- Introducció a la Persistència
- Preferències Compartides
- Emmagatzematge de Fitxers
- Base de Dades SQLite
- Ús de Hive per a l'Emmagatzematge Local
Mòdul 8: Conceptes Avançats de Flutter
- Animacions en Flutter
- Pintura Personalitzada i Canvas
- Canals de Plataforma
- Isolates i Concurrència
- Optimització del Rendiment
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries
- Proves de Widgets
- Proves d'Integració
- Tècniques de Depuració
Mòdul 10: Desplegament i Manteniment
- Preparació per al Llançament
- Construcció per a iOS
- Construcció per a Android
- Integració i Desplegament Continu (CI/CD)
- Manteniment i Actualització de la Teva Aplicació