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.
Wyzwanie
ŁatwyObecnie Spend 5 zabiera monety bezpośrednio z pola, przez co saldo portfela spada poniżej zera.
- Dodaj metodę
void spend(int amount)do klasyWallet, która odejmuje monety tylko wtedy, gdy jest ich wystarczająco dużo. - Spraw, aby przycisk
Spend 5wywoływałwallet.spend(5)wewnątrzsetState.
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'),
),
],
),
),
);
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Zarządzanie stanem
2Dart dla modeli
Metody w Twoich klasachGettery w Twoich klasachUczyń pole prywatnymSumowanie listy za pomocą foldPoćwicz samodzielnie: Kompilator Flutter online