#flutter #flutter-layout
#flutter #flutter-layout
Вопрос:
Средство получения ‘id’ не определено для типа ‘String’.Попробуйте импортировать библиотеку, которая определяет «идентификатор», исправив имя на имя существующего средства получения или определив средство получения или поле с именем >
Я пытаюсь показать свои товары в корзине, когда добавляю их с помощью значка корзины. Когда я нажму на значок корзины, я перейду на страницу CartScrren, где мне будут показаны выбранные товары. Но я не могу получить значения из своей корзины.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/cart.dart' ;
import '../widgets/cart_items_display.dart';
class CartScreen extends StatelessWidget {
static const route = '/cart';
@override
Widget build(BuildContext context) {
final cart = Provider.of<Cart>(context);
return Scaffold(
appBar: AppBar(
title: Text('Your Cart'),
),
body: Column(
children: <Widget>[
Card(
margin: EdgeInsets.all(25),
child: Padding(
padding: EdgeInsets.all(8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
'Total',
style: TextStyle(fontSize: 25),
),
Spacer(),
Chip(
label: Text(
'$${cart.totalAmount}',
style: TextStyle(
color: Colors.white,
),
),
backgroundColor: Theme.of(context).primaryColor,
),
TextButton(onPressed: () {}, child: Text('Order Now')),
],
),
),
),
SizedBox(
height: 10,
),
Expanded(
child: ListView.builder(
itemCount: cart.items.length,
itemBuilder: (ctx, i) => CartItemDisplay(
//Having problem Here**
cart.items.values.toString()[i].id,
cart.items.values.toString()[i].price,
cart.items.values.toString()[i].quantity,
cart.items.values.toString()[i].title,
///////**
),
),
),
],
),
);
}
}
Ниже приведена моя корзина, здесь я использую эту карту.
import 'package:flutter/foundation.dart';
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 {
Map<String, CartItem> _items ={} ;
Map<String, CartItem> get items {
return {..._items};
}
int get itemCount {
return _items.length;
}
double get totalAmount{
var 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();
}
}
Но если не использовать значения.toString() выдает эту ошибку
Ответ №1:
Пожалуйста, попробуйте получить товары корзины из значения корзины.
final cart = Provider.of<Cart>(context);
final cartItems = cart.items.entries.map((e) => e.value).toList();
...
Expanded(
child: ListView.builder(
itemCount: cartItems.length,
itemBuilder: (ctx, i) => CartItemDisplay(
////* Change these lines.
cartItems[i].id,
cartItems[i].price,
cartItems[i].quantity,
cartItems[i].title,
///////**
),
),
),
...
Ответ №2:
Вы используете getter для получения правильности:
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,
});
String get getId => id;
String get getTitle => title;
int get getQuantity => quantity;
double get getPrice => price;
}
Всегда полезно использовать инкапсуляцию для возврата соответствия.
Expanded(
child: ListView.builder(
itemCount: cart.items.length,
itemBuilder: (ctx, i) => CartItemDisplay(
//Use getter
cart.items.values.[i].getId,
cart.items.values.[i].getPrice,
cart.items.values.[i].getQuantity.toString(),
cart.items.values.[i].getTitle.toString(),
),
),
),
Комментарии:
1. Вы совершаете ту же ошибку, что и op. Вы должны вызывать средства получения объектов, а затем вызывать toString . Также
title
иid
не нужно преобразовывать в строку.2. сэр, он показывает то же самое, что и раньше: «getId ‘getId’ не определен для типа ‘String’. Попробуйте импортировать библиотеку, которая определяет ‘getId’, исправив имя на имя существующего средства получения или определив средство получения или поле с именем ‘getId»‘
3. @Md.FazleRabbiI Извините, я забыл удалить toString () .
4. @EliaTolin Действительно, я делаю.
Ответ №3:
Вы можете использовать этот сайт для создания классов моделей https://javiercbk.github.io/json_to_dart / я думаю, что этот сайт полезен для создания вашего класса модели, вы можете поместить свой json на этот сайт и получить класс модели