Menu
CoddyTech

Metody w Twoich klasach

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

Do tej pory Twoje klasy przechowywały dane: nazwę, cenę. Klasa może też zawierać kod, który zmienia te dane. Funkcja wewnątrz klasy nazywa się metodą:

class Wallet {
  int coins = 10;

  void earn(int amount) {
    coins = coins + amount;
  }
}

Wywołaj metodę za pomocą kropki, tak jak pole: wallet.earn(3). Wewnątrz metody coins jest polem portfela, na którym ją wywołano.

Po co to robić, skoro strona mogłaby sama zapisać wallet.coins = wallet.coins + 3? Ponieważ wtedy reguły znajdują się w jednym miejscu. Jeśli saldo portfela nigdy nie może spaść poniżej zera, metoda spend to sprawdza, a każde wydanie środków za pomocą przycisku przechodzi przez tę kontrolę.

Widget nadal wywołuje setState wokół tego wywołania, dzięki czemu na ekranie pojawia się nowa liczba.

challenge icon

Wyzwanie

Łatwy

Obecnie Spend 5 zabiera monety bezpośrednio z pola, przez co saldo portfela spada poniżej zera.

  • Dodaj metodę void spend(int amount) do klasy Wallet, która odejmuje monety tylko wtedy, gdy jest ich wystarczająco dużo.
  • Spraw, aby przycisk Spend 5 wywoływał wallet.spend(5) wewnątrz setState.

Spróbuj swoich sił

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class Wallet {
  int coins = 10;

  void earn(int amount) {
    coins = coins + amount;
  }
}

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> {
  final wallet = Wallet();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Wallet')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('${wallet.coins} coins', style: const TextStyle(fontSize: 32)),
            const SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  wallet.earn(3);
                });
              },
              child: const Text('Earn 3'),
            ),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  wallet.coins = wallet.coins - 5;
                });
              },
              child: const Text('Spend 5'),
            ),
          ],
        ),
      ),
    );
  }
}
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