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
buildretorna unScaffoldamb unaAppBari unCenterque 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
_counteri cridasetStateper reconstruir el widget. - build: El mètode
buildretorna unScaffoldamb unaAppBar, unCenterque conté unColumnamb 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
_displayTexti cridasetStateper reconstruir el widget. - build: El mètode
buildretorna unScaffoldamb unaAppBar, unCenterque conté unColumnamb unTexti 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ó
