عربة التسوق: شارة العدد
جزء من قسم إدارة الحالة في رحلة Flutter على Coddy. الدرس 23 من 27.
تعرض المتاجر سلة التسوق على شكل أيقونة عليها رقم صغير، يُسمى شارة. يحتوي Flutter على عنصر واجهة مستخدم لهذا الغرض: يرسم Badge قيمة label داخل فقاعة حمراء عند زاوية child:
IconButton(
icon: Badge(
label: Text('${cart.length}'),
isLabelVisible: cart.isNotEmpty,
child: const Icon(Icons.shopping_cart),
),
onPressed: () {},
)يخفي isLabelVisible الفقاعة عندما تكون قيمته false. تعرض السلة الفارغة الأيقونة وحدها، وهو مظهر أهدأ من عرض 0. تكون قيمة cart.isNotEmpty هي true عندما تحتوي القائمة على عنصر واحد على الأقل.
تراقب الشارة موفّر الحالة cartProvider نفسه الذي راقبه العنوان. يمكن لأي عنصر واجهة مستخدم فعل ذلك، أينما كان موضعه.
التحدي
سهلانقل العدد من العنوان إلى شارة:
- أعِد العنوان إلى
Shop. - أضف
IconButtonللسلة إلىactionsفي الشريط العلوي، وضعIcons.shopping_cartداخلBadgeتعرض عدد المنتجات. - أخفِ الرقم في الشارة عندما تكون السلة فارغة.
لا يفعل الزر شيئًا بعد؛ شاشة السلة هي التالية.
جرّب بنفسك
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: Text('Shop (${cart.length})')),
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);
},
),
),
],
),
);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس إدارة الحالة
تدرّب بنفسك: مترجم Flutter عبر الإنترنت