Panier d’achat : Passer à la caisse
Fait partie de la section Gestion d’état du Journey Flutter de Coddy. Leçon 27 sur 27.
La dernière étape est le passage en caisse. Un seul appui fait trois choses : le panier se vide, un message confirme la commande et l’acheteur revient dans la boutique, où le badge a disparu.
Vider le panier est une méthode supplémentaire du notificateur, et elle définit une nouvelle liste vide :
void clear() {
state = [];
}Un passage en caisse alors que le panier est vide n’a aucun sens, alors désactive le bouton. Il est impossible d’appuyer sur un bouton dont onPressed vaut null :
onPressed: cart.isEmpty ? null : () { ... },Repense à ce que tu as créé : deux écrans, un badge et un total, qui lisent tous le même panier, sans qu’aucune valeur ne soit transmise d’un écran à l’autre. Voilà ce qu’est la gestion d’état.
Défi
MoyenSous le total sur l’écran du panier, ajoute un bouton Check out :
- Grisé lorsque le panier est vide.
- Lorsqu’on appuie dessus, il vide le panier à l’aide d’une nouvelle méthode
clear(), affiche uneSnackBarindiquantOrder placed!, puis revient à la boutique.
Essayez vous-même
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class Product {
const Product(this.name, this.price);
final String name;
final double price;
}
const products = [
Product('Apple', 0.5),
Product('Bread', 2.25),
Product('Cheese', 4),
Product('Milk', 1.2),
];
class Cart extends Notifier<List<Product>> {
@override
List<Product> build() => [];
void add(Product product) {
state = [...state, product];
}
void removeAt(int index) {
final copy = [...state];
copy.removeAt(index);
state = copy;
}
}
final cartProvider = NotifierProvider<Cart, List<Product>>(Cart.new);
final totalProvider = Provider((ref) {
final cart = ref.watch(cartProvider);
return cart.fold(0.0, (sum, product) => sum + product.price);
});
void main() {
runApp(const ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: ShopPage(),
);
}
}
class ShopPage extends ConsumerWidget {
const ShopPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final cart = ref.watch(cartProvider);
return Scaffold(
appBar: AppBar(
title: const Text('Shop'),
actions: [
IconButton(
icon: Badge(
label: Text('${cart.length}'),
isLabelVisible: cart.isNotEmpty,
child: const Icon(Icons.shopping_cart),
),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const CartScreen()),
);
},
),
],
),
body: ListView(
children: [
for (final product in products)
ListTile(
title: Text(product.name),
subtitle: Text('\$${product.price.toStringAsFixed(2)}'),
trailing: IconButton(
icon: const Icon(Icons.add_shopping_cart),
onPressed: () {
ref.read(cartProvider.notifier).add(product);
},
),
),
],
),
);
}
}
class CartScreen extends ConsumerWidget {
const CartScreen({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final cart = ref.watch(cartProvider);
final total = ref.watch(totalProvider);
return Scaffold(
appBar: AppBar(title: const Text('Your cart')),
bottomNavigationBar: Padding(
padding: const EdgeInsets.all(24),
child: Text(
'Total: \$${total.toStringAsFixed(2)}',
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
),
body: cart.isEmpty
? const Center(child: Text('Your cart is empty'))
: ListView(
children: [
for (var i = 0; i < cart.length; i++)
ListTile(
title: Text(cart[i].name),
subtitle: Text('\$${cart[i].price.toStringAsFixed(2)}'),
trailing: IconButton(
icon: const Icon(Icons.delete),
onPressed: () {
ref.read(cartProvider.notifier).removeAt(i);
},
),
),
],
),
);
}
}
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
2Dart pour les modèles
Méthodes dans vos classesGetters dans vos classesGarder un champ privéAdditionner une liste avec fold5Projet : Panier d’achat
Panier d’achat : Ajouter au panierPanier d’achat : Le badgeEntraînez-vous par vous-même : Compilateur Flutter en ligne