【问题标题】:Sort a list of Flutter widgets using my own compare function使用我自己的比较功能对 Flutter 小部件列表进行排序
【发布时间】:2020-12-03 01:17:23
【问题描述】:

我正在使用 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 对象列表?

【问题讨论】:

  • 你应该只坚持这个,但你需要将 TaskCards 作为参数传递。目前,如果您看到代码,您会这样做错误 taskWidgets.sort(compareTasks);。这是不正确的。 正确 taskWidgets.sort(compareTasks(TaskCard a, TaskCard b));。如果这对你有意义
  • @Alok,这不起作用:lib/main.dart:84:48: Error: Expected ',' before this. taskWidgets.sort(compareTasks(TaskCard a, TaskCard b)); ^ lib/main.dart:84:60:错误:在此之前应为“,”。 taskWidgets.sort(compareTasks(TaskCard a, TaskCard b)); ^
  • lib/main.dart:84:48:错误:没有为类 '_MyHomePageState' 定义 getter 'a'。 - '_MyHomePageState' 来自'package:flutter_app/main.dart' ('lib/main.dart')。尝试将名称更正为现有 getter 的名称,或定义名为“a”的 getter 或字段。 taskWidgets.sort(compareTasks(TaskCard a, TaskCard b));

标签: sorting flutter dart


【解决方案1】:

如果您知道所有taskWidgets 元素都是TaskCard 类型,您可以将taskWidgets 更改为List&lt;TaskCard&gt; 类型,以使您的第一个比较方法起作用。

如果您想保留List&lt;Widget&gt; 类型的列表,您需要手动检查您的小部件是否为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;
}

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2019-02-24
    • 2013-02-13
    • 2022-01-05
    相关资源
    最近更新 更多