En Flutter, els widgets són els elements bàsics de la interfície d'usuari. Hi ha dos tipus principals de widgets: Stateless i Stateful. Entendre la diferència entre aquests dos tipus és fonamental per desenvolupar aplicacions eficients i mantenibles.
- Què és un Widget Stateless?
Un widget Stateless és un widget immutable, és a dir, el seu estat no canvia durant el cicle de vida de l'aplicació. Aquests widgets es creen una vegada i no es tornen a construir a menys que el seu parent canviï.
Característiques dels Widgets Stateless:
- No tenen estat intern.
- Són immutables.
- Es tornen a construir només quan el parent canvia.
Exemple de Widget Stateless:
import 'package:flutter/material.dart'; class MyStatelessWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Stateless Widget Example'), ), body: Center( child: Text('Hello, I am a Stateless Widget!'), ), ); } } void main() => runApp(MaterialApp( home: MyStatelessWidget(), ));
Explicació del Codi:
- MyStatelessWidget: És una classe que hereta de
StatelessWidget
. - build: El mètode
build
retorna unScaffold
amb unaAppBar
i unCenter
que conté unText
.
- Què és un Widget Stateful?
Un widget Stateful és un widget que manté un estat intern que pot canviar durant el cicle de vida de l'aplicació. Aquests widgets es tornen a construir cada vegada que el seu estat canvia.
Característiques dels Widgets Stateful:
- Tenen estat intern.
- Són mutables.
- Es tornen a construir cada vegada que el seu estat canvia.
Exemple de Widget Stateful:
import 'package:flutter/material.dart'; class MyStatefulWidget extends StatefulWidget { @override _MyStatefulWidgetState createState() => _MyStatefulWidgetState(); } class _MyStatefulWidgetState extends State<MyStatefulWidget> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Stateful Widget Example'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('You have pushed the button this many times:'), Text( '$_counter', style: Theme.of(context).textTheme.headline4, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), ); } } void main() => runApp(MaterialApp( home: MyStatefulWidget(), ));
Explicació del Codi:
- MyStatefulWidget: És una classe que hereta de
StatefulWidget
. - _MyStatefulWidgetState: És la classe d'estat que conté la lògica i l'estat del widget.
- _counter: És una variable d'estat que manté el nombre de vegades que s'ha premut el botó.
- _incrementCounter: És una funció que incrementa
_counter
i cridasetState
per reconstruir el widget. - build: El mètode
build
retorna unScaffold
amb unaAppBar
, unCenter
que conté unColumn
amb dosText
, i unFloatingActionButton
.
- Comparació entre Widgets Stateless i Stateful
Característica | Stateless Widget | Stateful Widget |
---|---|---|
Estat | Immutable | Mutable |
Re-construcció | Quan el parent canvia | Quan l'estat intern canvia |
Ús | Elements estàtics | Elements dinàmics |
Exemple | Text, Icon | Formularis, Botons interactius |
- Exercici Pràctic
Exercici:
Crea una aplicació Flutter que mostri un text que canviï cada vegada que es prem un botó. Utilitza un widget Stateful per implementar aquesta funcionalitat.
Solució:
import 'package:flutter/material.dart'; class TextChanger extends StatefulWidget { @override _TextChangerState createState() => _TextChangerState(); } class _TextChangerState extends State<TextChanger> { String _displayText = 'Hello, World!'; void _changeText() { setState(() { _displayText = _displayText == 'Hello, World!' ? 'Hello, Flutter!' : 'Hello, World!'; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Text Changer Example'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text(_displayText), SizedBox(height: 20), ElevatedButton( onPressed: _changeText, child: Text('Change Text'), ), ], ), ), ); } } void main() => runApp(MaterialApp( home: TextChanger(), ));
Explicació del Codi:
- TextChanger: És una classe que hereta de
StatefulWidget
. - _TextChangerState: És la classe d'estat que conté la lògica i l'estat del widget.
- _displayText: És una variable d'estat que manté el text que es mostra.
- _changeText: És una funció que canvia
_displayText
i cridasetState
per reconstruir el widget. - build: El mètode
build
retorna unScaffold
amb unaAppBar
, unCenter
que conté unColumn
amb unText
i unElevatedButton
.
Conclusió
En aquesta secció, hem après la diferència entre widgets Stateless i Stateful, com crear-los i quan utilitzar cadascun. Els widgets Stateless són ideals per a elements estàtics, mentre que els widgets Stateful són necessaris per a elements dinàmics que canvien durant el cicle de vida de l'aplicació. Amb aquesta base, estàs preparat per explorar més widgets i funcionalitats en Flutter.
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ó