Menu
CoddyTech

Fonctions de rappel qui transmettent une valeur

Fait partie de la section Gestion d’état du Journey Flutter de Coddy. Leçon 3 sur 27.

Un rappel peut transmettre une valeur au parent. Le sélecteur de taille ci-dessous comporte trois boutons, et la page doit savoir lequel a été sélectionné.

Donne un paramètre au rappel. Le type void Function(String) est une fonction qui prend un String et ne renvoie rien :

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'),
    );
  }
}

Chaque bouton encapsule l'appel dans une petite fonction, () => onPick('S'), afin qu'elle s'exécute lors de l'appui et non pendant la construction. Le parent reçoit la valeur en paramètre et la conserve :

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

Flutter possède un nom plus court pour le même type : ValueChanged<String>. De nombreux widgets intégrés l'utilisent, comme onChanged de TextField.

challenge icon

Défi

Moyen

Fais fonctionner les boutons de taille :

  • Ajoute à SizePicker un champ final void Function(String) onPick, défini par son constructeur.
  • Fais en sorte que chaque bouton appelle onPick avec sa propre lettre.
  • Sur la page, affiche la taille choisie : Size: S, Size: M ou Size: L.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Gestion d’état

Entraînez-vous par vous-même : Compilateur Flutter en ligne