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

时间:2020-08-13 08:18:32

标签: sorting flutter dart

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

我需要排序的列表:

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) {

总而言之,问题是: 如何使用自己的比较功能对TaskCard对象列表进行正确排序?

1 个答案:

答案 0 :(得分:2)

如果您知道所有taskWidgets元素都是TaskCard类型,则可以将taskWidgets更改为List<TaskCard>类型,以使第一个比较方法起作用

如果要保留类型为List<Widget>的列表,则需要手动检查窗口小部件是否为Taskcard类型,并考虑不存在的情况:< / p>

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

相关问题