【问题标题】:Sort list of objects in a stream and return the sorted list as a stream in flutter对流中的对象列表进行排序,并将排序后的列表作为流返回
【发布时间】:2021-04-19 02:53:35
【问题描述】:

我有用户列表。我需要根据性别对这些用户数据进行排序。性别 = { 0: '男', 1: '女', 2: '其他'}.

我希望以这样的方式排序日期,即首先列出女性,然后是男性,然后是其他人,即 {1, 0, 2}。

class User {
  String id;
  String name;
  int gender;

  User({
    this.id,
    this.name,
    this.gender,
  })

  factory users.fromMap(Map<String, dynamic> data, String documentId) {
    if (data == null) {
      return null;
    }

    return User(
      ...
    );
  }

  Map<String, dynamic> toMap() => <String, dynamic>{
    ...
  }
}

有没有办法根据上面的条件对数据进行排序,再次返回一个流?

我从数据库收到的流如下:

Stream<List<User>> users =
        database.usersStream();

现在,用户对象可以使用 rxdart 排序还是有其他方法? 以及如何做到这一点?

【问题讨论】:

  • 为什么不直接从数据库中检索用户列表?您可以过滤对数据库的请求中的数据并立即仅获取所需的实体,而无需为无法使用的对象创建实例。
  • 谢谢你,但我稍后有一个场景,我需要解决它。此排序不是升序或降序,而是 1,0,2。
  • 您可以在 rxdart GitHub 存储库中看到 issue 关于 sort。否则,您可以通过thisthis 链接实现对答案的排序。

标签: flutter rxdart


【解决方案1】:

您可以在usersStream 方法中对列表进行排序。

尝试以下步骤。

1。在 User 类中实现 Comparable 并覆盖 compareTo 方法。

class User implements Comparable<User> {
  String id;
  String name;
  int gender;

  User({
    this.id,
    this.name,
    this.gender,
  });

  @override
  String toString() {
    return "User(id: $id, gender: $gender)";
  }

  @override
  int compareTo(User other) {
    if (gender == 1) {
      return -1;
    }
    if (other.gender == 1) {
      return 1;
    }
    return gender.compareTo(other.gender);
  }
}

2。使用compareTo 方法对usersStream 中的列表进行排序。

Stream<List<User>> usersStream() async* {

  //This is dummy data for users.
  List<User> users = List.generate(20, (index) {
    Random random = Random();
    int gender = random.nextInt(3);
    return User(id: index.toString(), gender: gender, name: "User $index");
  });

  //Sorting the list.
  users.sort((User a, User b) {
    return a.compareTo(b);
  });

  yield users;
}

【讨论】:

  • 我没有投反对票,可能有人这么做了。 compareTo 实际上应该以特定顺序 [1, 0, 2] 而非一般顺序 [0, 1, 2] 进行排序。大概那时我们可以使用下面的代码对流进行排序并返回。 ``` return users.asyncMap((users) { checkIns.sort((User a, User b) { return a.compareTo(b); }); return users; }); ```
  • 我不明白“实际上应该按特定顺序排序 [1, 0, 2] 而不是一般顺序”这个@RameshKumar
  • 谢谢@Zeus! compareTo 像你一样工作。 int compareTo(User other) { if (gender == 1) { return -1; } if (other.gender == 1) { return 1; } return gender.compareTo(other.gender); } 和以下代码返回排序用户列表流:return users.asyncMap((users) { checkIns.sort((User a, User b) { return a.compareTo(b); }); return users; });
猜你喜欢
  • 2021-07-18
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多