Изменить статус предметов в списке из 3000 предметов в Flutter - PullRequest
0 голосов
/ 25 февраля 2020

Я извлекаю 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(() {});
                                });                        
                            }
                          })
                    ],
                  ),
                ));
              },
            )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...