flutter Force listview builder 根据条件只显示 1 个项目

flutter Force listview builder to show only 1 item based on condition

我正在使用 hive 制作一个待办事项项目,我想在不同的行中显示标记为已完成和未完成的待办事项。现在,当标记为已完成的行为空时,我想显示一条消息,例如“您可以在完成待办事项后将待办事项标记为已完成”。我已经实现了这些功能,但问题是消息“您可以在完成待办事项后将待办事项标记为已完成”随着待办事项中的项目数量重复出现。例如,如果待办事项包含 2 个待办事项并且都未完成,那么我会收到消息:

“您可以在完成待办事项后将其标记为已完成” "您可以在完成待办事项后将其标记为已完成"

我正在使用的代码:

ListView.builder(
                  primary: false,
                  itemCount: Hive.box___.length,
                  itemBuilder: (context, index) {
                    Todo? data = Hive.box____.getAt(index);
                    return data!.isCompleted
                        ? _______ //show the todos that are completed
                        : const Center(
                            child: Text(
                              "You can mark todos as completed after completing the todo"
                            ),
                          );
                  },

您还必须对 itemCount 设置条件。

所以你有 2 个列表视图。一个用于未完成的项目,一个用于完成的项目。

在每个 ListView 中,您必须过滤您的列表,以便将过滤后的项目传递到每个列表。在你写的完整列表视图中

itemCount: completedItems.lenth == 0 ? 1 : completedItems.lenth

并且在生成器中,您必须检查 completedItems.lenth 是否为零然后 return Text 否则 return 相应的卡片。

在构建器外部实现数据

 List<Todo>? data = Hive.box____.get('name')
 int count = Hive.box___.length;
        ListView.builder(
                          primary: false,
                          itemCount:count,
                          itemBuilder: (context, index) {
                           );
                            if(data![index].isCompleted){
                                return _______ //show the todos that are completed
}
                                else {return const Center(
                                   child: Text(
                                      "You can mark todos as completed after completing the todo"
                                    ),
                                  );
count = 0;
}
                          },

我已经解决了这个问题,首先我过滤并检查是否没有完成的项目,如果是,我将项目计数显示为 1 否则它将是待办事项列表的长度。

这是我的代码

ListView.builder(
                  primary: false,
                  itemCount: Hive.box___.length,
                  itemBuilder: (context, index) {
                    Todo? data = Hive.box__.values
                          .where((element) => element.iscompleted == true)
                          .isEmpty
                      ? 1
                      : Hive.box____.length,;
                    return data!.isCompleted
                        ? _______ //show the todos that are completed
                        : const Center(
                            child: Text(
                              "You can mark todos as completed after completing the todo"
                            ),
                          );
                  },

此外,我的代码受到@Riza 分享的代码的启发,感谢您让我知道 Hive.box____.get('name') @Giorgi