Menu
CoddyTech
flag Ar iconالعربيةdown icon

عربة التسوق: شارة العدد

جزء من قسم إدارة الحالة في رحلة 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 نفسه الذي راقبه العنوان. يمكن لأي عنصر واجهة مستخدم فعل ذلك، أينما كان موضعه.

challenge icon

التحدي

سهل

انقل العدد من العنوان إلى شارة:

  • أعِد العنوان إلى 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);
                },
              ),
            ),
        ],
      ),
    );
  }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس إدارة الحالة

تدرّب بنفسك: مترجم Flutter عبر الإنترنت