当前位置: 首页 > 知识库问答 >
问题:

使用我自己的比较函数对Flutter小部件列表进行排序

顾英发
2023-03-14

我正在使用Flutter构建一个TODO应用程序。我需要做的是使用自己的比较方法对存储在列表中的任务进行排序(完成的任务必须在底部)。

我需要排序的列表:

var taskWidgets = List<Widget>();

TaskWidgets列表的元素是TaskCard类对象

class TaskCard extends StatefulWidget {

我的比较方法:

  int compareTasks(TaskCard a, TaskCard b) {
    if (a.state._checked == b.state._checked) {
      return 0;
    }
    if (a.state._checked && !b.state._checked) {
      return 1;
    }
    return -1;
  }
taskWidgets.sort(compareTasks);
type '(TaskCard, TaskCard) => int' is not a subtype of type '((Widget, Widget) => int)?'
  int compareTasks(Widget a, Widget b) {
    if (a.state._checked == b.state._checked) {
      return 0;
    }
    if (a.state._checked && !b.state._checked) {
      return 1;
    }
    return -1;
  }
lib/main.dart:98:11: Error: The getter 'state' isn't defined for the class 'Widget'.
 - 'Widget' is from 'package:flutter/src/widgets/framework.dart' ('../../AppData/flutter/packages/flutter/lib/src/widgets/framework.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'state'.
    if (a.state._checked == b.state._checked) {

共有1个答案

花永昌
2023-03-14

如果您知道所有taskwidgets元素都是taskcard类型,那么您可以将taskwidgets更改为list 类型,以便使第一个compare方法工作。

如果希望保留列表 类型列表,则需要手动检查小部件是否属于taskcard类型,并考虑它们不属于以下类型:

int compareTasks(Widget a, Widget b) {
  if (!(a is TaskCard)) {
    return -1; // if a is not of type Taskcard, make it go before b
  }
  if (!(b is TaskCard)) {
    return 1; // if a is a TaskCard and b is not Taskcard, make b go before a
  }

  TaskCard taskA = a as TaskCard;
  TaskCard taskB = b as TaskCard;
  if (taskA.state._checked == taskB.state._checked) {
    return 0;
  }
  if (taskA.state._checked && !taskB.state._checked) {
    return 1;
  }
  return -1;
}

 类似资料:
  • 我目前有一个应用程序,可以显示1.5公里半径内附近的医院,它看起来是这样的: 我遇到的麻烦是,我不知道如何根据他们从最低到最高的计算距离来排序卡片。 我创建了一个来存储计算的距离列表,并用对其进行排序。 我如何确保小部件将遵循排序的距离值的顺序?

  • 问题内容: 我知道有几个这样的问题,但是它们似乎对我没有用。 我有一个列表,5元素乘以50。我想通过对每个元素应用自定义比较功能来对列表进行排序。此函数计算要对元素进行排序的列表的适用性。我创建了两个函数,比较和适应性: 和 然后我尝试通过以下方式致电给他们: 要么 要么 要么 我也尝试了具有相同参数的list.sort()。但是无论如何,函数都不会将列表作为参数,而是作为参数。我不知道为什么,这

  • 我一直在做拼字游戏作业。我需要从列表中读取单词,然后读取每个字符并赋值,最终为每个单词分配一个总分。已经完成了!唷。现在我需要使用比较器将单词从最高分到最低分进行排序。读了很多,还是很迷茫。我知道我可以使用接口,但也有使用lambda表达式的比较器,这是我想去的方向。我只是不知道该怎么做。我需要比较每个单词的sumValue,然后按降序打印单词。 我创建了 2 个循环来读取单词 (i),然后是字符

  • 所以我正在使用一些预先存在的比较器,它们比较两个元组中的某些值,如果第一个大于第二个,则返回true,否则返回false。这是其中之一的代码: 现在,我有一个字典,里面有许多上面比较的类型的元组条目。我想以相反的顺序对它们进行排序,但我真的不知道如何完成。我在想这样的事情: 但是我不知道向比较器传递什么,因为每个比较器都有两个参数(subInfo1、subInfo2)。我不能更改比较器函数。

  • 我有以下清单: 这是我的比较器函数: 我正在尝试使用它排序如下: 我不明白为什么第一个NaN不在列表的末尾。 我对升序排序列表的预期输出是: 我对降序排序列表的预期输出是: 在升序排序和降序排序的情况下,我希望NaNs在最后。 我知道sortwith使我们能够编写自己的比较器。有人能帮我吗?

  • 是的,这是家庭作业,但我一直在想什么。comparator类应该实现java。util。sort()方法的第二个参数应该是我的Comparator类的一个实例。 到目前为止,我的comparator类如下所示: 我有一个单独的方法对数组进行排序,但此方法使用compareTo() 除了使用单独的comparator类之外,我应该使用什么方法?我完全不知道该怎么办。 我的Rational类看起来像: