Flutter

How to Add Items to Cart Using SharedPreferences in Flutter

How to Add Items to Cart Using SharedPreferences in Flutter

Introduction

In modern mobile applications, cart functionality is essential for e-commerce apps, grocery delivery, and other shopping-related platforms. In Flutter, we can use SharedPreferences to store cart items locally on the user’s device. This approach is useful for small-scale applications where a database isn’t required.

With SharedPreferences, we can store cart data persistently, ensuring users don’t lose their cart items when they close the app. This tutorial will guide you through the process of adding products to a cart, retrieving them, and displaying them in a Flutter UI. We’ll also cover how to clear the cart when needed.

By the end of this tutorial, you will learn how to:

  • Store cart items in SharedPreferences
  • Retrieve and display cart items in a ListView
  • Remove all items from the cart

Let’s get started with the implementation.

Implementation

Step 1: Add Dependencies

First, include the shared_preferences package in your pubspec.yaml file:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.2.2

Step 2: Create a Cart Item Model

class CartItem {
  String name;
  double price;
  int quantity;

  CartItem({required this.name, required this.price, required this.quantity});

  Map<String, dynamic> toJson() {
    return {'name': name, 'price': price, 'quantity': quantity};
  }

  factory CartItem.fromJson(Map<String, dynamic> json) {
    return CartItem(
      name: json['name'],
      price: json['price'],
      quantity: json['quantity'],
    );
  }
}

Step 3: Implement Cart Service Using SharedPreferences

import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
import 'cart_item.dart';

class CartService {
  static const String _cartKey = 'cart_items';

  static Future<void> addToCart(CartItem item) async {
    final prefs = await SharedPreferences.getInstance();
    List<String> cartList = prefs.getStringList(_cartKey) ?? [];

    cartList.add(jsonEncode(item.toJson()));
    await prefs.setStringList(_cartKey, cartList);
  }

  static Future<List<CartItem>> getCartItems() async {
    final prefs = await SharedPreferences.getInstance();
    List<String> cartList = prefs.getStringList(_cartKey) ?? [];

    return cartList.map((item) => CartItem.fromJson(jsonDecode(item))).toList();
  }

  static Future<void> clearCart() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.remove(_cartKey);
  }
}

Step 4: Build the UI for Cart Management

import 'package:flutter/material.dart';
import 'cart_item.dart';
import 'cart_service.dart';

class CartPage extends StatefulWidget {
  @override
  _CartPageState createState() => _CartPageState();
}

class _CartPageState extends State<CartPage> {
  List<CartItem> cartItems = [];

  @override
  void initState() {
    super.initState();
    loadCart();
  }

  Future<void> loadCart() async {
    List<CartItem> items = await CartService.getCartItems();
    setState(() {
      cartItems = items;
    });
  }

  Future<void> addItem() async {
    CartItem newItem = CartItem(name: 'Product 1', price: 20.0, quantity: 1);
    await CartService.addToCart(newItem);
    loadCart();
  }

  Future<void> clearCart() async {
    await CartService.clearCart();
    loadCart();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Shopping Cart')),
      body: Column(
        children: [
          ElevatedButton(onPressed: addItem, child: Text('Add Item')),
          ElevatedButton(onPressed: clearCart, child: Text('Clear Cart')),
          Expanded(
            child: ListView.builder(
              itemCount: cartItems.length,
              itemBuilder: (context, index) {
                final item = cartItems[index];
                return ListTile(
                  title: Text(item.name),
                  subtitle: Text('₹${item.price} x ${item.quantity}'),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

Code with Update  Quanity

 

import ‘dart:convert’;
import ‘package:flutter/material.dart’;
import ‘package:shared_preferences/shared_preferences.dart’;

class CartItem {
String name;
double price;
int quantity;

CartItem({required this.name, required this.price, required this.quantity});

Map<String, dynamic> toJson() {
return {‘name’: name, ‘price’: price, ‘quantity’: quantity};
}

factory CartItem.fromJson(Map<String, dynamic> json) {
return CartItem(
name: json[‘name’],
price: json[‘price’],
quantity: json[‘quantity’],
);
}
}

class CartService {
static const String _cartKey = ‘cart_items’;

static Future<void> addToCart(CartItem item) async {
final prefs = await SharedPreferences.getInstance();
List<String> cartList = prefs.getStringList(_cartKey) ?? [];

List<CartItem> items = cartList.map((e) => CartItem.fromJson(jsonDecode(e))).toList();
int index = items.indexWhere((element) => element.name == item.name);

if (index != -1) {
items[index].quantity += item.quantity;
} else {
items.add(item);
}

await prefs.setStringList(_cartKey, items.map((e) => jsonEncode(e.toJson())).toList());
}

static Future<List<CartItem>> getCartItems() async {
final prefs = await SharedPreferences.getInstance();
List<String> cartList = prefs.getStringList(_cartKey) ?? [];

return cartList.map((item) => CartItem.fromJson(jsonDecode(item))).toList();
}

static Future<void> updateQuantity(String name, int quantity) async {
final prefs = await SharedPreferences.getInstance();
List<String> cartList = prefs.getStringList(_cartKey) ?? [];
List<CartItem> items = cartList.map((e) => CartItem.fromJson(jsonDecode(e))).toList();

int index = items.indexWhere((item) => item.name == name);
if (index != -1) {
items[index].quantity = quantity;
await prefs.setStringList(_cartKey, items.map((e) => jsonEncode(e.toJson())).toList());
}
}

static Future<void> deleteItem(String name) async {
final prefs = await SharedPreferences.getInstance();
List<String> cartList = prefs.getStringList(_cartKey) ?? [];
List<CartItem> items = cartList.map((e) => CartItem.fromJson(jsonDecode(e))).toList();

items.removeWhere((item) => item.name == name);
await prefs.setStringList(_cartKey, items.map((e) => jsonEncode(e.toJson())).toList());
}

static Future<void> clearCart() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove(_cartKey);
}
}

class CartPage extends StatefulWidget {
@override
_CartPageState createState() => _CartPageState();
}

class _CartPageState extends State<CartPage> {
List<CartItem> cartItems = [];

@override
void initState() {
super.initState();
loadCart();
}

Future<void> loadCart() async {
List<CartItem> items = await CartService.getCartItems();
setState(() {
cartItems = items;
});
}

Future<void> addItem() async {
CartItem newItem = CartItem(name: ‘Product 1’, price: 20.0, quantity: 1);
await CartService.addToCart(newItem);
loadCart();
}

Future<void> clearCart() async {
await CartService.clearCart();
loadCart();
}

Future<void> updateQuantity(int index, int newQuantity) async {
if (newQuantity > 0) {
await CartService.updateQuantity(cartItems[index].name, newQuantity);
loadCart();
}
}

Future<void> deleteItem(int index) async {
await CartService.deleteItem(cartItems[index].name);
loadCart();
}

double calculateGrandTotal() {
return cartItems.fold(0, (sum, item) => sum + (item.price * item.quantity));
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(‘Shopping Cart’)),
body: Column(
children: [
ElevatedButton(onPressed: addItem, child: Text(‘Add Item’)),
ElevatedButton(onPressed: clearCart, child: Text(‘Clear Cart’)),
Expanded(
child: ListView.builder(
itemCount: cartItems.length,
itemBuilder: (context, index) {
final item = cartItems[index];
return ListTile(
title: Text(item.name),
subtitle: Text(‘₹${item.price} x ${item.quantity} = ₹${(item.price * item.quantity).toStringAsFixed(2)}’),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(Icons.remove),
onPressed: () => updateQuantity(index, item.quantity – 1),
),
Text(‘${item.quantity}’),
IconButton(
icon: Icon(Icons.add),
onPressed: () => updateQuantity(index, item.quantity + 1),
),
IconButton(
icon: Icon(Icons.delete),
onPressed: () => deleteItem(index),
),
],
),
);
},
),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
‘Grand Total: ₹${calculateGrandTotal().toStringAsFixed(2)}’,
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
),
],
),
);
}
}

Summary

In this tutorial, we implemented a simple cart system in Flutter using SharedPreferences. We covered how to:

  • Create a CartItem model to store product details.
  • Use SharedPreferences to store and retrieve cart items.
  • Display cart items dynamically in a list.
  • Provide options to add and clear items from the cart.

This approach is ideal for small apps that do not require a backend. However, for larger applications, using a database like Firebase or SQLite would be a better solution. Happy coding!

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *