Menu
CoddyTech

Carrello della spesa: Il badge

Fa parte della sezione Gestione dello stato del percorso Flutter di Coddy. Lezione 23 di 27.

I negozi mostrano il carrello come un'icona con un piccolo numero sopra, un badge. Flutter ha un widget apposito: Badge disegna la sua label in una bolla rossa nell'angolo del suo child:

IconButton(
  icon: Badge(
    label: Text('${cart.length}'),
    isLabelVisible: cart.isNotEmpty,
    child: const Icon(Icons.shopping_cart),
  ),
  onPressed: () {},
)

isLabelVisible nasconde la bolla quando è false. Un carrello vuoto mostra la semplice icona, che è meno invadente di uno 0. cart.isNotEmpty è true quando la lista contiene almeno un elemento.

Il badge osserva lo stesso cartProvider del titolo. Può farlo qualsiasi widget, ovunque si trovi.

challenge icon

Sfida

Facile

Sposta il conteggio dal titolo a un badge:

  • Il titolo torna a Shop.
  • Aggiungi un IconButton del carrello a actions nella barra superiore, con Icons.shopping_cart all'interno di un Badge che mostra il numero di prodotti.
  • Nascondi il numero del badge quando il carrello è vuoto.

Il pulsante per ora non fa nulla; la schermata del carrello arriverà dopo.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gestione dello stato

Esercitati da solo: Compilatore Flutter online