Menu
CoddyTech

Funkcje zwrotne przekazujące wartość

Część sekcji Zarządzanie stanem ścieżki Flutter w Coddy. Lekcja 3 z 27.

Wywołanie zwrotne może przekazać wartość wyżej. Poniższy selektor rozmiaru ma trzy przyciski, a strona musi wiedzieć, który z nich został naciśnięty.

Dodaj parametr do wywołania zwrotnego. Typ void Function(String) oznacza funkcję, która przyjmuje wartość typu String i niczego nie zwraca:

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

Każdy przycisk opakowuje wywołanie w małą funkcję, () => onPick('S'), dzięki czemu funkcja uruchamia się po naciśnięciu, a nie podczas budowania widżetu. Rodzic odbiera wartość jako parametr i ją przechowuje:

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

Flutter ma krótszą nazwę dla tego samego typu: ValueChanged<String>. Używa jej wiele wbudowanych widżetów, na przykład właściwość onChanged widżetu TextField.

challenge icon

Wyzwanie

Średni

Spraw, aby przyciski rozmiaru działały:

  • Dodaj do SizePicker pole final void Function(String) onPick, ustawiane przez konstruktor.
  • Niech każdy przycisk wywołuje onPick z własną literą.
  • Na stronie wyświetl wybrany rozmiar: Size: S, Size: M lub Size: L.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Zarządzanie stanem

Poćwicz samodzielnie: Kompilator Flutter online