Widget const
Fa parte della sezione Rendere l’app interattiva del percorso Flutter di Coddy. Lezione 15 di 34.
const davanti a un valore significa: è fisso quando scrivi il codice e non cambia mai. const Text('Score') mostrerà Score per tutta la durata dell'app.
Perché dirlo a Dart? Quando setState ricostruisce lo schermo, Flutter può saltare ogni widget const, perché sa che al suo interno non è cambiato nulla. Ecco perché gli editor di codice di Flutter, come VS Code e Android Studio, sottolineano un widget che potrebbe essere const e suggeriscono di aggiungerlo. Da questo momento in poi, le app di questo corso usano const quando è appropriato.
const si propaga verso l'interno: in un widget, anche tutto ciò che si trova tra le parentesi è const. Quindi lo scrivi una sola volta, sul widget più esterno che non cambia mai:
const Column(
children: [
Text('Score'),
Icon(Icons.star),
],
)Una variabile può cambiare, quindi non può mai trovarsi all'interno di const. Inserisci Text('$_score') in quella colonna e Dart si rifiuta di compilarla, mostrando l'errore "Not a constant expression". La soluzione: rimuovi const dalla colonna e aggiungilo a ogni elemento figlio che non cambia:
Column(
children: [
const Text('Score'),
Text('$_score'),
],
)Sfida
MedioIl punteggio aumenta quando premi il pulsante più, ma la schermata non lo mostra mai. Sotto Score, aggiungi Text('$_score') con dimensione 48. Dovrai spostare const da Column ai widget al suo interno che non cambiano mai.
Provalo tu
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int _score = 0;
void _goal() {
setState(() {
_score++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Game')),
body: Center(
child: const Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.sports_soccer, size: 64),
Text('Score', style: TextStyle(fontSize: 24)),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _goal,
child: const Icon(Icons.add),
),
);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Rendere l’app interattiva
Esercitati da solo: Compilatore Flutter online