I recently started studying Flutter.
When I tab ORDER NOW, get error:
type ‘CartItem’ is not a subtype of type ‘CartItem’ in type cast where
When I click the button ORDER NOW I have to go to a blank order screen.
If I don’t add cast I get the error The argument type 'List<CartItem>' can't be assigned to the parameter type 'List<CartItem>'
class CartScreen extends StatelessWidget {
static const routeName = '/cart';
const CartScreen({super.key});
@override
Widget build(BuildContext context) {
final cart = Provider.of<Cart>(context);
final orders = Provider.of<Orders>(context);
return Scaffold(
appBar: AppBar(
title: Text(
'Your cart',
style: Theme.of(context).textTheme.bodyLarge,
),
),
body: Column(
children: [
Card(
margin: const EdgeInsets.all(15),
child: Padding(
padding: const EdgeInsets.all(8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Total',
style: TextStyle(fontSize: 20),
),
Consumer<Cart>(
builder: (BuildContext context, Cart cart, Widget? widget) {
return Chip(
label: Text(
'$${cart.totalAmount}',
),
backgroundColor: Colors.white,
);
},
),
ElevatedButton(
onPressed: () {
orders.addOrder(
cart.items.values.cast<CartItem>().toList(),
cart.totalAmount,
);
cart.clear();
},
child: Text(
'ORDER NOW',
style: Theme.of(context).textTheme.bodyMedium,
),
),
],
),
),
),
Expanded(
child: ListView.builder(
itemBuilder: (context, index) => CartItem(
id: cart.items.values.toList()[index].id,
productId: cart.items.keys.toList()[index],
title: cart.items.values.toList()[index].title,
quantity: cart.items.values.toList()[index].quantity,
price: cart.items.values.toList()[index].price,
),
itemCount: cart.itemCount,
),
),
],
),
);
}
}
orders
class OrderItem {
final String id;
final double amount;
final List<CartItem> products;
final DateTime dateTime;
const OrderItem({
required this.id,
required this.amount,
required this.products,
required this.dateTime,
});
}
class Orders with ChangeNotifier {
final List<OrderItem> _orders = [];
List<OrderItem> get orders {
return [..._orders];
}
void addOrder(
List<CartItem> cartProducts,
double total,
) {
_orders.insert(
0,
OrderItem(
id: DateTime.now().toString(),
amount: total,
products: cartProducts,
dateTime: DateTime.now(),
),
);
notifyListeners();
}
}
cart
class CartItem {
final String id;
final String title;
final int quantity;
final double price;
CartItem({
required this.id,
required this.title,
required this.quantity,
required this.price,
});
}
class Cart with ChangeNotifier {
late Map<String, CartItem> _items = {};
Map<String, CartItem> get items {
return {..._items};
}
int get itemCount {
return _items.length;
}
double get totalAmount {
double total = 0.0;
_items.forEach((key, cartItem) {
total += cartItem.price * cartItem.quantity;
});
return total;
}
void addItem(
String productId,
double price,
String title,
) {
if (_items.containsKey(productId)) {
_items.update(
productId,
(existingCartItem) => CartItem(
id: existingCartItem.id,
title: existingCartItem.title,
quantity: existingCartItem.quantity + 1,
price: existingCartItem.price,
),
);
} else {
_items.putIfAbsent(
productId,
() => CartItem(
id: DateTime.now().toString(),
title: title,
quantity: 1,
price: price,
),
);
}
notifyListeners();
}
void removeItem(String productId) {
_items.remove(productId);
notifyListeners();
}
void clear() {
_items = {};
notifyListeners();
}
}
2
Answers
I think the prblm is you have a CartItem class which represent your data model and one more CartItem that is a widget that is causing prblm.
The CartItem data model class
Other is this CartItem Widget because you are returning it Inside the Listview
As one is widget and other is object it shows a type error
I think in the error there would be List is not a subtype of List?.
Can you please check?