Menu
CoddyTech

Koszyk zakupowy: Dodawanie do koszyka

Część sekcji Zarządzanie stanem ścieżki Flutter w Coddy. Lekcja 22 z 27.

Czas zbudować prawdziwą aplikację ze współdzielonym stanem: mały sklep. W kolejnych lekcjach dodamy do niej listę produktów z przyciskami dodawania, plakietkę na ikonie koszyka, ekran koszyka z sumą, możliwość usuwania produktów i finalizację zakupu. Dwa ekrany, jeden koszyk.

Koszyk jest współdzielonym stanem, więc użyjemy w nim Notifier. Jego stan to lista produktów w koszyku, która początkowo jest pusta. Każda zmiana tworzy nową listę, tak jak już wiesz:

class Cart extends Notifier<List<Product>> {
  @override
  List<Product> build() => [];

  void add(Product product) {
    state = [...state, product];
  }
}

Sama lista produktów nigdy się nie zmienia, więc pozostaje zwykłą listą const na początku pliku. Dostawcy wymaga tylko to, co się zmienia.

challenge icon

Wyzwanie

Średni

Spraw, aby przyciski dodawania zapełniały koszyk:

  • Napisz notifier Cart, którego stanem jest List<Product>, początkowo pusta, i który ma metodę add(Product product).
  • Dodaj final cartProvider = NotifierProvider<Cart, List<Product>>(Cart.new);
  • Przycisk w każdym wierszu dodaje produkt z tego wiersza.
  • Górny pasek wyświetla liczbę produktów w koszyku: Shop (0), Shop (1)...

Spróbuj swoich sił

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),
];

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) {
    return Scaffold(
      appBar: AppBar(title: const Text('Shop')),
      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: () {},
              ),
            ),
        ],
      ),
    );
  }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Zarządzanie stanem

Poćwicz samodzielnie: Kompilator Flutter online