Listview 更改项目';颤振中3000个项目列表中的状态

Listview 更改项目';颤振中3000个项目列表中的状态,listview,flutter,google-cloud-firestore,Listview,Flutter,Google Cloud Firestore,我正在从Firestore中提取3000个项目(这些是常量,无法编辑),在第一次加载时将它们保存在本地,并将它们显示为应用程序中的数据库,用户可以从列表中选择项目并将其添加到应用程序中的个人屏幕。数据库中项目的初始列表将显示每个项目的加号图标作为尾部按钮。当用户点击加号图标时,它会被添加到Firestore中的个人收藏和应用程序中的个人屏幕,图标会更改为选中。一切似乎都很好,但图标更改对于3000个列表项来说太长了(对于500个项目来说太快了) 我检查项目是否已添加的方法是比较项目id。当用户从

我正在从Firestore中提取3000个项目(这些是常量,无法编辑),在第一次加载时将它们保存在本地,并将它们显示为应用程序中的数据库,用户可以从列表中选择项目并将其添加到应用程序中的个人屏幕。数据库中项目的初始列表将显示每个项目的加号图标作为尾部按钮。当用户点击加号图标时,它会被添加到Firestore中的个人收藏和应用程序中的个人屏幕,图标会更改为选中。一切似乎都很好,但图标更改对于3000个列表项来说太长了(对于500个项目来说太快了)

我检查项目是否已添加的方法是比较项目id。当用户从数据库添加项目时,所有内容都会复制到他们的个人收藏中,包括id。现在在应用程序中,我检查数据库项目id是否与个人项目id匹配,如果匹配,则显示检查按钮,如果不匹配,则显示加号按钮。对于3000个项目,这个过程真的很慢(添加和显示检查需要5-7秒),我想知道是否有更好的方法来处理这个问题。以下是伪代码,工作限制我分享代码或任何可识别的信息,但请让我知道,如果你需要任何其他信息。提前谢谢

注意:此问题处于发布模式。调试模式要慢得多

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(() {});
                                });                        
                            }
                          })
                    ],
                  ),
                ));
              },
            )
列出PersonalItemId=。。。;
ListView.builder(
物理学:const NeverScrollableScrollPhysics(),
收缩膜:对,
itemCount:snapshot.data.length,
itemBuilder:(BuildContext上下文,int itemIndex){
DBModelDataFromFireStore=snapshot.data[itemIndex];
bool itemsadded=personalItemIds.contains(dataFromFirestore.id);
回程卡(
孩子:ListTile(
前导:图标(…)
),
标题:文本(…),
尾随:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
图标按钮(
图标:itemAdded?图标(
FontAwesomeIcons.checkCircle,
颜色:颜色。绿色,
):图标(
FontAwesomeIcons.plusCircle,
颜色:颜色。蓝色),
onPressed:()异步{
如果(!itemsadded){
FirestoreCollec…附加项(..)。然后(){
打印(“添加”);
itemStatusChange=true;
添加(dataFromFirestore.id);
Toast.show('Added!',上下文,持续时间:Toast.LENGTH\u SHORT,重力:Toast.BOTTOM);
setState((){});
});
}否则{
FirestoreCollec…删除项(…)。然后(){
打印(“删除”);
itemStatusChange=true;
移除(dataFromFirestore.id);;
Toast.show('Removed!',上下文,持续时间:Toast.LENGTH\u SHORT,重力:Toast.BOTTOM);
setState((){});
});                        
}
})
],
),
));
},
)

您需要为最小的可复制示例提供代码。去掉与你的问题无关的东西。听起来你是在直接从数据库中处理这两个列表?将这两个列表加载到应用程序的内存中,然后在内存中进行比较要快得多。加载如此大量的数据对于移动设备来说内存不足。加载代码时,需要对数据记录进行分页。谢谢。@GrahamD,事实上我在第一次加载时将数据库保存在本地,很抱歉忘记添加这些信息。