如何跳过GroupedListView.builder中的项目

问题描述 投票:0回答:1

我正在使用

GroupedListView.builder
来构建聊天消息。我试图在同一条消息中依次显示同一用户发送的多张图像。首先,我在构建消息时检测同一用户是否发送了至少 4 张图像;然后,获取这些图像的 URL 并使用
GridView.builder
:

显示它们
GridView.builder(
    itemCount: groupedImages.length,
    itemBuilder: (context, index) {
      return ImagePreview(
        imageUrl: groupedImages[index].url!,
        sender: sender,
        isMe: sender == groupedImages[index].sender,
        width: width,
        height: height,
        id: groupedImages[index].id,
        date: date,
      );
    },
    gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 2,
    ),
  ),
............

void getAllConsecutiveImages() {
for (var element in messages) {
  if (element.type.toLowerCase().contains('image') &&
      element.sender == sender) {
    groupedImages.add(element);
  } else {
    break;
  }
}

}

我的问题是我需要删除或跳过已经获得的图像。

flutter gridview
1个回答
0
投票

您有多种解决方案可以做到这一点。

您可以在您的状态中维护一个列表,该列表已缩小并且仅包含每个图像的一个示例,然后围绕该列表创建构建器。

final List<Image> groupedImageReduced = groupedImage.where((element){
  // 'alreadyDisplayed' must be true when 2 images are the same
  if(alreadyDisplayed){
    return false;
  }else{
    return true;
  }
});

这样您将得到一个仅包含您想要的元素的列表。

否则,您可以通过在图像已显示时返回 Container 来跳过构建器中所需的情况,但这比第一个解决方案更脏

GridView.builder(
    itemCount: groupedImages.length,
    itemBuilder: (context, index) {
      if(alreadyDisplayed){
        return Container();
      }else{
        return ImagePreview(
          imageUrl: groupedImages[index].url!,
          sender: sender,
          isMe: sender == groupedImages[index].sender,
          width: width,
          height: height,
          id: groupedImages[index].id,
          date: date,
        );
      }
    },
    gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 2,
    ),
  ),
© www.soinside.com 2019 - 2024. All rights reserved.