У меня есть 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?
Да, другие элементы тоже имеют название и цену.
Также mapEquals работает, если я попробую его в одиночку с другой кнопкой. Я думаю, что проблема заключается в проверке карты внутри списка.
ну, здесь есть 3 возможных точки отказа: imo, removeWhere
, mapEquals
или проверка на равенство между вашими парами ключ-значение. в первом я относительно уверен, во втором я не знаю, также неясно, из какого пакета вы получаете эту функцию. третий: если ваши карты содержат какие-либо сложные/непримитивные ключи/значения, имейте в виду, что проверка на равенство по умолчанию выполняется путем сравнения ссылок, а не значений.
Все еще не решает.
Не пытайтесь проверить, содержит ли массив другой массив в этом коде:
if (selectedServices.contains(
[{
'title': selectedItem[index].title,
'price': selectedItem[index].price,
}])
?
Попробуйте проверить с одним пунктом в списке параметров:
if (selectedServices.contains(
{'title': selectedItem[index].title}
))
Я уже проверяю это, как вы можете видеть в моем вопросе. Ваш второй блок кода не работает.
Обновлено: фокус вопроса изменился, поэтому теперь этот ответ пытается достичь функциональности, подобной 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
.
Как мы можем использовать метод .contains
для поиска карты внутри списка? В этом проблема, я думаю.
вы этого не сделаете, contains
проверяет равенство ссылок на сложные объекты. так что либо у вас есть ЖЕ карта (как в той же ссылке, а не просто равные значения), либо вы выполняете некоторую пользовательскую проверку на равенство с помощью where
, firstWhere
или any
, чтобы найти элемент, который может соответствовать вашим критериям "равно"...
отредактировал мой ответ, чтобы показать способ с any
Чувак, ты спас мой день! Большое спасибо. Я любитель среднего уровня по разработке. Я никогда не ходил в школу по программному обеспечению, но иногда я беспокою таких людей, как вы, из-за такой проблемы. Я действительно очень ценю вас.
являются ли заголовок, цена и все другие значения элементов на карте примитивными типами?