我正在使用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对象列表进行正确排序?
答案 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;
}