Я извлекаю 3000 элементов (это константы, которые нельзя редактировать) из Firestore, сохраняя их локально при первой загрузке и отображая их как базу данных в приложении, где пользователи могут выбирать элементы из списка и добавлять их в свои персональный экран в приложении. Первоначальный список элементов в базе данных будет отображаться значок плюс для каждого элемента в качестве конечной кнопки. Когда пользователь нажимает на значок плюса, он добавляется в личную коллекцию в Firestore и на личный экран в приложении, и значок изменяется для проверки. Кажется, все работает нормально, но изменение значка занимает слишком много времени для 3000 элементов списка (это быстро с 500 элементами).
Я проверяю, добавлен ли элемент, путем сравнения идентификатора элемента. Когда пользователь добавляет элемент из базы данных, все копируется в его личную коллекцию, включая идентификатор. Теперь в приложении я проверяю, совпадает ли идентификатор элемента базы данных с идентификатором личного элемента, и если они это делают, отображают кнопку проверки, а если нет, отображают кнопку «плюс». Этот процесс действительно медленный (5-7 секунд только для добавления и отображения проверки) для 3000 элементов, и мне было интересно, есть ли лучший способ справиться с этим. Ниже приведена псевдокод, работа ограничивает меня в обмене кодом или любой идентифицируемой информацией, но, пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Заранее спасибо.
Примечание : эта проблема находится в режиме выпуска. Режим отладки намного медленнее.
List<String> personalItemIds = ...;
ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int itemIndex) {
DBModel dataFromFirestore = snapshot.data[itemIndex];
bool itemAdded = personalItemIds.contains(dataFromFirestore.id);
return Card(
child: ListTile(
leading: Icon(...)
),
title: Text(..),
trailing: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
IconButton(
icon: itemAdded ? Icon(
FontAwesomeIcons.checkCircle,
color: Colors.green,
) : Icon(
FontAwesomeIcons.plusCircle,
color: Colors.blue),
onPressed: () async {
if (!itemAdded) {
FirestoreCollec...addItem(..).then((_){
print('added');
itemStatusChange = true;
personalItemIds.add(dataFromFirestore.id);
Toast.show('Added!', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
setState(() {});
});
} else {
FirestoreCollec....deleteItem(...).then((_){
print('deleted');
itemStatusChange = true;
personalItemIds.remove(dataFromFirestore.id);;
Toast.show('Removed!', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
setState(() {});
});
}
})
],
),
));
},
)