עגלת קניות: מסך העגלה
חלק מהיחידה ניהול מצב במסלול ה-Flutter של Coddy. שיעור 24 מתוך 27.
מסך שני מציג מה יש בעגלה. זהו ConsumerWidget שעוקב אחר אותו cartProvider, ולכן אין צורך להעביר לו שום דבר: דוחפים אותו, והוא קורא את העגלה בעצמו.
class CartScreen extends ConsumerWidget {
const CartScreen({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final cart = ref.watch(cartProvider);
return Scaffold(
appBar: AppBar(title: const Text('Your cart')),
body: ...,
);
}
}זוכרים את הספק שהיה מסביב ל-home ולא ניתן היה למצוא אותו מתוך מסך שנדחף? זה לא יכול לקרות כאן: ProviderScope עוטף את כל האפליקציה, ולכן כל מסך יכול לגשת לכל ספק.
רשימה ריקה במסך נראית כמו תקלה, אז הציגו במקום זאת משפט: cart.isEmpty ? ... : ... בוחר בין שתי האפשרויות.
אתגר
בינוניבנו את מסך העגלה:
- הוסיפו
CartScreenמסוגConsumerWidgetעם הכותרתYour cart. - המסך מציג כל מוצר בעגלה בתור
ListTileעם השם, ואת המחיר בתורtrailing. - כשהעגלה ריקה, הוא מציג במקום זאת
Your cart is empty. - לחיצה על סמל העגלה בסרגל העליון של החנות פותחת אותו.
נסו בעצמכם
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];
}
}
final cartProvider = NotifierProvider<Cart, List<Product>>(Cart.new);
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: () {},
),
],
),
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);
},
),
),
],
),
);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה ניהול מצב
2Dart עבור מודלים
מתודות במחלקות שלכםGetters במחלקות שלכםהפכו שדה לפרטיחיבור איברי רשימה באמצעות fold5פרויקט: עגלת קניות
עגלת קניות: הוספה לעגלהעגלת קניות: התגתרגלו בעצמכם: קומפיילר Flutter אונליין