#flutter #dart
#flutter #dart
Вопрос:
У меня есть этот код, который я не могу заставить работать должным образом. У меня есть класс продуктов питания, и я инициализировал в нем строки имени, цены и уникального идентификатора. Я присвоил уникальному идентификатору значение Uuid().v4(), что дало бы каждому элементу питания случайную строку.
КЛАСС ЕДЫ
class Food {
String name;
String price;
String uniqueID = Uuid().v4();
Food({this.name,
this.price,
this.uniqueID})}
На другой странице у меня есть функция поставщика, которая добавляет товары в корзину, это список строковых элементов (возможно, это не лучший вариант). Вот код для этого:
class CartItemsModel extends ChangeNotifier {
List<String> _cartItems = [];
List<String> get cartItems => _cartItems;
addCartItem(String item) {
_cartItems.add(item);
notifyListeners();
}
Теперь, на другой странице, я вызываю эту еду для добавления в корзину, это значок с нажатой выше функцией:
return ListTile(
trailing: Container(
padding:
EdgeInsets.only(top: 15.0),
child: IconButton(
icon: Icon(Icons.add),
onPressed: () =>
model.addCartItem(
"${food.name}, Calories: ${food.calories} ${food.price} dinnVegan: ${food.isVegan}, ${Uuid().v4()}")),
Теперь вы видите, что у меня есть Uuid (без моего UniqueID из класса Food, потому что по какой-то причине он не работает). У меня есть Uuid, чтобы не было ошибки с несколькими повторяющимися элементами, если кнопка будет нажата дважды, вот ошибка без нее:
Проблема в том, что это работает и работает, но у меня есть этот уродливый идентификатор из Uuid, отображаемый в последнем окне «корзина». В принципе, я хочу, чтобы этот идентификатор был невидимым. Вот как это выглядит:
И вот код для экрана «корзина»:
class _CartState extends State<Cart> {
@override
Widget build(BuildContext context) {
return Consumer<CartItemsModel>(
builder: (c, model, _) => Scaffold(
body: SingleChildScrollView(
child: Column(
//on trailing i should have icon with clear function that will delete that item from the list
children: model
.cartItems //maybe below can return ListView.separated like on the food list user, we'll see
.map((e) =>
Короче говоря, мой UniqueID здесь не используется, потому что по какой-то причине он не делает каждый элемент плитки списка уникальным по своему ключу, поэтому он не отображается и выдает ошибку при двойном нажатии, поэтому временно я использую трюк с Uuid.
Чего я хочу, так это чтобы это работало именно так, но без появления уродливой строки Uuid. Есть ли что-то простое, что я могу с этим сделать, может быть, добавить что-то в код CartItemsModel, условное обозначение или что-то еще?
Если я изменю код в onPressed на этот:
onPressed: () {
if (!model.cartItems
.contains(food)) {
model.addCartItem(Food);
}
}
Я получаю сообщение об ошибке:
The argument type 'Type' can't be assigned to the parameter type 'String
Есть ли простое решение, позволяющее легко добавлять товары на экран «корзина», независимо от того, сколько раз я нажимаю на один и тот же товар, просто выделяя каждый из них в виде отдельной плитки списка на экране корзины?
ОШИБКИ ОБНОВЛЕНИЯ
Я получаю эти ошибки в разных файлах при их изменении, даже если я меняю значение everything на Text.
Комментарии:
1. Я могу опубликовать полный код, если кому-то это нужно, мне действительно нужно это решить, я пробовал много разных вещей, не уверен, как это легко исправить.
2. Вы вообще устанавливаете ключевое свойство в виджете ListTile?
3. Кстати, правильное форматирование вашего кода помогает другим быстрее его читать и понимать.
4. В вашем обновлении вы не обернули свою строку в
Text
виджет, как я предложил в своем ответе. Кроме того, попробуйте использоватьUniqueKey()
, еслиValueKey
не хочет работать.5. Спасибо, я довольно новичок в программировании в целом, так что это немного сбивает с толку, но я все больше и больше начинаю это понимать. Есть идеи, как я мог бы изменить _CartState, чтобы принимать текст вместо строки?
Ответ №1:
Насколько я знаю, строки не имеют ключевого свойства. Попробуйте что-то вроде этого (вы также можете использовать uniqueKey()), чтобы получить ключ для ваших элементов CardItems:
return ListTile(
trailing: Container(
padding: EdgeInsets.only(top: 15.0),
child: IconButton(
icon: Icon(Icons.add),
onPressed: () => model.addCartItem(
Text("${food.name}, Calories: ${food.calories} ${food.price} dinn
Vegan: ${food.isVegan}",
key:ValueKey(Food.uniqueID.toString()),
),
),
),
),
),
Затем вам нужно настроить модель cartItems на List<Text> _cartItems = [];
и List<Text> get cartItems => _cartItems;
Таким образом, каждый элемент списка имеет свой уникальный ключ. Также вам необходимо настроить функцию отображения в вашем _CartState
конструкторе, потому что теперь у вас больше нет строк, а есть текстовые виджеты.
Комментарии:
1. Я получаю
Instance member 'uniqueID' can't be accessed using static access
ошибку, я понимаю, что он не может получить к ней доступ, потому что значение является случайным каждый раз, как мне это исправить? Также не уверен, как я буду настраивать элементы в _CartState, поскольку теперь они являются текстовыми, извините, я немного новичок в кодировании в целом, это просто практика.2. Это не статично, потому что оно находится
String _uniqueID = Uuid().v4();
в классе Food