#flutter #dart #error-handling #maps #flutter-provider
#flutter #dart #обработка ошибок #Карты #флаттер-провайдер
Вопрос:
Я пытаюсь получить значения из объекта Карты, возвращаемого из виджета поставщика, используя: final cart = Provider.of<Cart>(context);
но я это StackOverFlowError
понимаю .
Ошибка:
═════ Exception caught by widgets library ═══════════════════════════════════
The following StackOverflowError was thrown building:
Stack Overflow
When the exception was thrown, this was the stack
#0 new _InternalLinkedHashMap (dart:collection-patch/compact_hash.dart:157:3)
#1 new Map._fromLiteral (dart:core-patch/map_patch.dart:16:19)
#2 Cart.items package:shop/providers/cart.dart:9
#3 Cart.items package:shop/providers/cart.dart:9
Это мой класс провайдера:
class Cart with ChangeNotifier {
Map<String, CartItem> _items = {};
Map<String, CartItem> get items {
return {...items};
}
//returns no of product in cart
int get itemCount {
return _items.length;
}
double get totalAmount {
double total = 0.0;
_items.forEach(
(key, cartItem) => total = (cartItem.price * cartItem.quantity));
return total;
}
//add item to cart if it does not exist or add an extra quantity if it exist
void addItem(String productId, double price, String title) {
if (_items.containsKey(productId)) {
_items.update(
productId,
(existingCartItem) => CartItem(
id: existingCartItem.id,
title: existingCartItem.title,
price: existingCartItem.price,
quantity: existingCartItem.quantity 1));
} else {
_items.putIfAbsent(
productId,
() => CartItem(
id: DateTime.now().toString(),
title: title,
price: price,
quantity: 1));
}
notifyListeners();
}
}
и я использую его здесь:
class CartScreen extends StatelessWidget {
static const routeName = 'cart-screen';
@override
Widget build(BuildContext context) {
final cart = Provider.of<Cart>(context);
return Scaffold(
appBar: AppBar(
title: Text('Your Cart'),
),
body: Column(
children: [
Card(
margin: const EdgeInsets.all(15),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Text(
'Total',
style: TextStyle(
fontSize: 20,
fontFamily: 'Lato-Bold',
),
),
Spacer(),
Chip(
label: Text(
'$${cart.totalAmount}',
style: TextStyle(
color:
Theme.of(context).primaryTextTheme.headline6.color,
),
),
backgroundColor: Theme.of(context).primaryColor,
),
FlatButton(
child: Text('ORDER NOW'),
onPressed: () {},
textColor: Theme.of(context).primaryColor,
),
],
),
),
),
SizedBox(height: 10),
Expanded(
child: ListView.builder(
itemBuilder: (ctx, index) {
return Text(cart.items.values.toList()[index].title); // this is where i have a problem
// return CartItem(cart.items.values.toList()[index].id, cart.items.values.toList()[index].price,
// cart.items.values.toList()[index].quantity, cart.items.values.toList()[index].title);
},
itemCount: cart.itemCount,
))
],
),
);
}
}
Как мне получить правильные значения?
Ответ №1:
Одна вещь, которую я вижу, неверна
Map<String, CartItem> get items {
return {...items};
}
это должно быть
Map<String, CartItem> get items {
return {..._items};
}
Ответ №2:
Вы должны вернуть{…_items} . Вы забыли символ подчеркивания в методе get