Menu
CoddyTech

Callback che inviano un valore

Fa parte della sezione Gestione dello stato del percorso Flutter di Coddy. Lezione 3 di 27.

Una callback può riportare un valore al livello superiore. Il selettore di taglie qui sotto ha tre pulsanti e la pagina deve sapere quale è stato premuto.

Assegna un parametro alla callback. Il tipo void Function(String) è una funzione che accetta una String e non restituisce nulla:

class SizePicker extends StatelessWidget {
  const SizePicker({super.key, required this.onPick});

  final void Function(String) onPick;

  @override
  Widget build(BuildContext context) {
    return OutlinedButton(
      onPressed: () => onPick('S'),
      child: Text('S'),
    );
  }
}

Ogni pulsante racchiude la chiamata in una piccola funzione, () => onPick('S'), così viene eseguita quando si tocca il pulsante e non durante la build. Il componente genitore riceve il valore come parametro e lo conserva:

SizePicker(
  onPick: (picked) {
    setState(() {
      size = picked;
    });
  },
)

Flutter ha un nome breve per lo stesso tipo: ValueChanged<String>. Molti widget integrati lo utilizzano, come onChanged di un TextField.

challenge icon

Sfida

Medio

Fai funzionare i pulsanti delle taglie:

  • Aggiungi a SizePicker il campo final void Function(String) onPick, impostato dal suo costruttore.
  • Fai in modo che ogni pulsante chiami onPick con la propria lettera.
  • Nella pagina, mostra la taglia selezionata: Size: S, Size: M o Size: L.

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 const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String size = 'M';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('T-shirt')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('Size: $size', style: const TextStyle(fontSize: 32)),
            const SizedBox(height: 16),
            const SizePicker(),
          ],
        ),
      ),
    );
  }
}

class SizePicker extends StatelessWidget {
  const SizePicker({super.key});

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        OutlinedButton(onPressed: () {}, child: const Text('S')),
        const SizedBox(width: 8),
        OutlinedButton(onPressed: () {}, child: const Text('M')),
        const SizedBox(width: 8),
        OutlinedButton(onPressed: () {}, child: const Text('L')),
      ],
    );
  }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gestione dello stato

Esercitati da solo: Compilatore Flutter online