Flutter Как искать конкретную карту внутри списка?

У меня есть 3 выбираемых элемента в моем пользовательском интерфейсе. Я создал их с помощью ListViewBuilder. Моя цель — загрузить selectedItem в Firebase. Во всяком случае, например;

List<Map<String?, dynamic>> selectedItems = List.empty(growable: true);

Список будет таким прямо перед загрузкой Firebase:

List selectedItems = [
      {
        'title': selectedItem[index].title,
        'price': selectedItem[index].price,
      },
    ];

Это должен быть мой selectedItems список.

И я загружаю этот список как Map вот так:

 Map<String, dynamic> updatedData = {'items': selectedItems};

Это должно быть так для дизайна Firebase.

Прежде всего, когда пользователь нажал на элемент, я хочу проверить список selectedItems. Вот мой код, но он вообще не работает:

if (selectedServices.contains(
                           [{
                           'title': selectedItem[index].title,
                           'price': selectedItem[index].price,
                           }])

Проблема прямо здесь. После этой проверки (также она всегда проходит, потому что не работает) я пытаюсь удалить те же элементы из selectedItems с помощью этого кода:

selectedServices.removeWhere((item) => mapEquals(
                                            item,
                                            ({
                                              'title': selectedItem[index].title,
                                              'price': selectedItem[index].price,
                                            })));

Но это тоже не работает из-за того, что проверка всегда проходит false. После этих шагов моя функция onPressed работает только с этим else блоком кода.

else
        {
                selectedServices.addAll([{
                selectedItem[index].title:
                selectedItem[index].price
    }
    ]);}

Небольшое резюме; .contains метод не работает так. Если есть другой способ установить список карт, просто дайте мне узнать об этом. Это важно для меня, но я не могу понять это последние несколько дней. И, наконец, можете ли вы объяснить, как это работает для Dart?

являются ли заголовок, цена и все другие значения элементов на карте примитивными типами?

scrimau 21.03.2022 20:14

вместо mapEquals вы также можете попробовать MapEquality.equals

scrimau 21.03.2022 20:20

Да, другие элементы тоже имеют название и цену.

Tolga Yılmaz 21.03.2022 20:22

Также mapEquals работает, если я попробую его в одиночку с другой кнопкой. Я думаю, что проблема заключается в проверке карты внутри списка.

Tolga Yılmaz 21.03.2022 20:23

ну, здесь есть 3 возможных точки отказа: imo, removeWhere, mapEquals или проверка на равенство между вашими парами ключ-значение. в первом я относительно уверен, во втором я не знаю, также неясно, из какого пакета вы получаете эту функцию. третий: если ваши карты содержат какие-либо сложные/непримитивные ключи/значения, имейте в виду, что проверка на равенство по умолчанию выполняется путем сравнения ссылок, а не значений.

scrimau 21.03.2022 20:26

Все еще не решает.

Tolga Yılmaz 21.03.2022 22:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не пытайтесь проверить, содержит ли массив другой массив в этом коде:

if (selectedServices.contains(
                           [{
                           'title': selectedItem[index].title,
                           'price': selectedItem[index].price,
                           }])

?

Попробуйте проверить с одним пунктом в списке параметров:

if (selectedServices.contains(
          {'title': selectedItem[index].title}
    ))

Я уже проверяю это, как вы можете видеть в моем вопросе. Ваш второй блок кода не работает.

Tolga Yılmaz 21.03.2022 20:04
Ответ принят как подходящий

Обновлено: фокус вопроса изменился, поэтому теперь этот ответ пытается достичь функциональности, подобной contains, для списков со сложными элементами.

Для пользовательской проверки на равенство функциональность, аналогичная contains, может быть достигнута с помощью any:

import 'package:collection/equality.dart';

void main() {
  final map1 = {
    'title': 'item1',
    'price': 12.34,
  };

  final map2 = {
    'title': 'item2',
    'price': 3.45,
  };

  final list = [map1, map2];

  final test1 = list.any((item)=>MapEquality().equals(item, {
    'title': 'item1',
    'price': 12.34,
  }));

  print(test1);
  
  final test2 = list.any((item)=>MapEquality().equals(item, {
    'title': 'item3',
    'price': 14.34,
  }));

  print(test2);
}

печать это:

true
false

однако вы можете столкнуться с проблемами точности с двойными значениями или если вы используете сложные пары ключ-значение в своих картах.

У меня не было проблем с методом removeWhere. Я не справился с методом .contains.

Tolga Yılmaz 21.03.2022 21:19

Как мы можем использовать метод .contains для поиска карты внутри списка? В этом проблема, я думаю.

Tolga Yılmaz 21.03.2022 21:20

вы этого не сделаете, contains проверяет равенство ссылок на сложные объекты. так что либо у вас есть ЖЕ карта (как в той же ссылке, а не просто равные значения), либо вы выполняете некоторую пользовательскую проверку на равенство с помощью where, firstWhere или any, чтобы найти элемент, который может соответствовать вашим критериям "равно"...

scrimau 22.03.2022 08:42

отредактировал мой ответ, чтобы показать способ с any

scrimau 22.03.2022 08:48

Чувак, ты спас мой день! Большое спасибо. Я любитель среднего уровня по разработке. Я никогда не ходил в школу по программному обеспечению, но иногда я беспокою таких людей, как вы, из-за такой проблемы. Я действительно очень ценю вас.

Tolga Yılmaz 22.03.2022 10:16

Другие вопросы по теме