Добавление нескольких элементов листа списка в Flutter в список

#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