Els widgets són els blocs de construcció fonamentals de qualsevol aplicació Flutter. Tot en Flutter és un widget, des dels elements més simples com un text o una imatge, fins a estructures més complexes com un formulari o una pàgina completa. En aquesta secció, explorarem què són els widgets, com funcionen i com es poden utilitzar per construir interfícies d'usuari riques i interactives.
Què és un Widget?
Un widget és una descripció immutable d'una part de la interfície d'usuari. Els widgets poden ser visuals (com un botó o un text) o no visuals (com un gestor de disposició o un controlador d'animació).
Tipus de Widgets
- Widgets Stateless: Són widgets que no canvien el seu estat durant el cicle de vida de l'aplicació. Un cop creats, no es poden modificar.
- Widgets Stateful: Són widgets que poden canviar el seu estat durant el cicle de vida de l'aplicació. Aquests widgets poden ser actualitzats i redibuixats en resposta a les interaccions de l'usuari o altres factors.
Creació d'un Widget Bàsic
A continuació, veurem com crear un widget bàsic en Flutter. Començarem amb un widget Stateless.
Exemple de Widget Stateless
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Introducció als Widgets'),
),
body: Center(
child: Text('Hola, món!'),
),
),
);
}
}Explicació del Codi
- import 'package:flutter/material.dart';: Importa el paquet material de Flutter, que conté una col·lecció de widgets predefinits.
- void main() { runApp(MyApp()); }: La funció
mainés el punt d'entrada de l'aplicació.runAppllança l'aplicació i pren un widget com a argument. - class MyApp extends StatelessWidget: Defineix una classe
MyAppque hereta deStatelessWidget. - @override Widget build(BuildContext context): La funció
builddescriu com ha de ser la interfície d'usuari. - MaterialApp: Un widget que enmarca l'aplicació amb material design.
- Scaffold: Proporciona una estructura bàsica per a la interfície d'usuari, incloent una barra d'aplicació i un cos central.
- AppBar: Un widget que crea una barra d'aplicació.
- Center: Un widget que centra el seu fill.
- Text: Un widget que mostra text.
Exemple de Widget Stateful
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Introducció als Widgets'),
),
body: Center(
child: MyStatefulWidget(),
),
),
);
}
}
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 Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Has premut el botó aquest nombre de vegades:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
ElevatedButton(
onPressed: _incrementCounter,
child: Text('Incrementa'),
),
],
);
}
}Explicació del Codi
- class MyStatefulWidget extends StatefulWidget: Defineix una classe
MyStatefulWidgetque hereta deStatefulWidget. - _MyStatefulWidgetState createState() => _MyStatefulWidgetState();: Crea l'estat associat amb aquest widget.
- class _MyStatefulWidgetState extends State
: Defineix una classe _MyStatefulWidgetStateque hereta deState. - int _counter = 0;: Declara una variable
_counterper mantenir el compte. - void _incrementCounter() { setState(() { _counter++; }); }: Defineix una funció
_incrementCounterque incrementa el valor de_counteri cridasetStateper actualitzar la interfície d'usuari. - Column: Un widget que disposa els seus fills en una columna vertical.
- ElevatedButton: Un botó elevat que, quan es prem, crida la funció
_incrementCounter.
Exercicis Pràctics
- Exercici 1: Crea un widget Stateless que mostri un text personalitzat.
- Exercici 2: Crea un widget Stateful que tingui un botó per incrementar un comptador i un altre botó per restablir el comptador a zero.
Solucions
Exercici 1
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Exercici 1'),
),
body: Center(
child: Text('Aquest és un text personalitzat!'),
),
),
);
}
}Exercici 2
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Exercici 2'),
),
body: Center(
child: CounterWidget(),
),
),
);
}
}
class CounterWidget extends StatefulWidget {
@override
_CounterWidgetState createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
void _resetCounter() {
setState(() {
_counter = 0;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Has premut el botó aquest nombre de vegades:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _incrementCounter,
child: Text('Incrementa'),
),
SizedBox(width: 20),
ElevatedButton(
onPressed: _resetCounter,
child: Text('Restableix'),
),
],
),
],
);
}
}Conclusió
En aquesta secció, hem après què són els widgets en Flutter, la diferència entre widgets Stateless i Stateful, i com crear-los. Els widgets són la base de qualsevol aplicació Flutter, i comprendre com funcionen és essencial per desenvolupar aplicacions eficients i interactives. En la següent secció, explorarem més a fons la diferència entre widgets Stateless i Stateful i veurem exemples més complexos.
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ó
