Я пытаюсь создать удаленную корзину покупок «Я добавлю CRUD-запросы позже». Пока я просто пытаюсь создать ее с помощью Riverpod NotifierProvider на первом этапе.
Я могу успешно заполнить свою корзину. Однако я сталкиваюсь с этой ошибкой при отображении моих товаров на странице корзины.
════════ Исключение, перехваченное библиотекой виджетов ══════ Следующая ошибка _CastError была выброшена при построении: Оператор проверки null, используемый для нулевого значения
вот моя страница экрана корзины:
class CartPage extends ConsumerWidget {
const CartPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(cartRepositoryProvider);
return Scaffold(
appBar: AppBar(
title: Text("Cart"),
),
body: SafeArea(
child: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: state.length,
itemBuilder: (context, index) => ListTile(
title: Text(state.values.toList()[index].itemsName!),
// id: state.values.toList()[index].`!,
// itemsName: state.values.toList()[index].itemsName!,
// price: state.values.toList()[index].price!,
// qty: state.values.toList()[index].qty!,
// image: state.values.toList()[index].image!,
)),
)
],
),
));
}
}
также вот мой cart_controller, где я изменяю состояние в зависимости от моих условий.
class CartRepository extends Notifier<Map<String, CartItem>> {
@override
Map<String, CartItem> build() {
return {};
}
void addItem({required String productId, price, title, name, image}) {
if (state.containsKey(productId)) {
state.update(
productId,
(value) => CartItem(
productId: value.productId,
itemsName: value.itemsName,
price: value.price,
image: value.image,
qty: value.qty! + 1));
}
if (!state.containsKey(productId)) {
// cart.addAll({item.productId: item});
state.putIfAbsent(
productId,
() => CartItem(
productId: productId,
itemsName: title,
price: price,
image: image,
// productId: item.productId,
qty: 0),
);
}
}
void removeItem(String id) {
if (state.containsKey(id)) {
state.update(
id,
(value) => CartItem(
itemsName: value.itemsName,
price: value.price,
image: value.image,
productId: value.productId,
qty: value.qty! - 1));
}
}
void clearCart() {
state.clear();
}
getCartItem<String>(id) {
if (state.containsKey(id)) {
int quantity = state[id]!.qty ?? 0;
return quantity;
}
}
}
final cartRepositoryProvider =
NotifierProvider<CartRepository, Map<String, CartItem>>(CartRepository.new);
Кроме того, вот моя модель cartItem:
import 'package:ecommerceriverpod/src/features/cart/domain/item.dart';
import 'package:ecommerceriverpod/src/features/products/domain/product.dart';
class CartItem {
String? productId;
String? itemsName;
String? price;
String? image;
int? qty;
CartItem({
required this.productId,
required this.itemsName,
required this.price,
required this.image,
required this.qty,
});
}
Я уверен, что он содержит много ошибок, но их решение будет высоко оценено. Кроме того, я не мог добавить product_screen из-за большого количества кода, но я думаю, что этого достаточно.





Ваша проблема в том, что вы получаете доступ к несуществующему CartItem
title: Text(state.values.toList()[index].itemsName!),
потому что в этот момент список будет пуст:
/// CartRepository
@override
Map<String, CartItem> build() {
return {};
}
Обработайте пустой список в вашем виджете:
if (state.isEmpty) return Text('Not found Cards');
Затем вы должны быть очень уверены, что ваше поле itemsName не равно нулю. Либо избавьтесь от полей, допускающих значение NULL, в модели CartItem, либо соответствующим образом обработайте каждое поле, допускающее значение NULL, в пользовательском интерфейсе:
final item = state.values.toList()[index]!;
final itemName = item.itemsName ?? '';
title: Text(itemName),