【问题标题】:flutter Force listview builder to show only 1 item based on condition颤振强制列表视图构建器根据条件仅显示 1 个项目
【发布时间】:2022-01-18 14:07:16
【问题描述】:

我正在使用 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"
                            ),
                          );
                  },

【问题讨论】:

    标签: flutter flutter-listview flutter-hive


    【解决方案1】:

    您还必须对 itemCount 设置条件。

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

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

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

    在builder中,你必须检查completedItems.lenth是否为零,然后返回Text,否则返回相应的卡片。

    【讨论】:

    • 如何在项目生成器之前或列表视图之外访问已完成的项目
    • 您必须过滤您的列表。类似于:todoList.filter((element) => element.isCompleted)
    【解决方案2】:

    我已经解决了这个问题,首先我过滤并检查是否没有完成的项目,如果是,我将项目数显示为 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

    【讨论】:

      【解决方案3】:

      在构建器之外实现数据

       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;
      }
                                },
      

      【讨论】:

      • 如何在item builder之外获取索引?
      • 您不需要在项目构建器之外建立索引。更新
      • 我已经检查并确认它是相同的,Hive.box___.length 是 2 即使没有完成的项目它运行了两次
      • 试试这个我编辑代码
      • 输入else后只需要停止builder即可
      猜你喜欢
      • 2021-09-28
      • 2020-08-14
      • 2015-12-22
      • 2021-08-29
      • 2021-08-19
      • 2021-09-24
      • 2018-10-26
      • 2020-01-18
      • 1970-01-01
      相关资源
      最近更新 更多