【问题标题】:How to properly generate a list from other two lists according to a condition in Flutter如何根据 Flutter 中的条件从其他两个列表中正确生成列表
【发布时间】:2021-04-06 18:55:28
【问题描述】:

我正在尝试根据其他两个列表生成一个名为 selectedBooks 的列表:

这是第一个列表:

    List<Book> availableBooks = [
       Book(
        id: 1,
        isActive: false,
        name: "Tipo 1"
       ),
       Book(
        id: 2,
        isActive: false,
        name: "Tipo 2"
       ),
       Book(
        id: 3,
        isActive: false,
        name: "Tipo 3"
       ),
       Book(
        id: 4,
        isActive: false,
        name: "Tipo 4"
       ),
    ]

这是第二个列表:

    List<Book> allowedBooks = [
       Book(
        id: 1,
        isActive: true,
        name: "Tipo 1"
       ),
       Book(
        id: 3,
        isActive: true,
        name: "Tipo 3"
       ),
    ]

这是我要生成的列表:

       selectedBooks = availableBooks
          .map((book) =>
              allowedBooks.contains(book.id)
                  ? Book(
                      id: book.id,
                      isActive: true,
                      name: book.name)
                  : Book(
                      id: book.id,
                      isActive: false,
                      name: book.name))
          .toList();

由于 allowedBooks 确实包含 id 1 和 3,我希望 selectedBooks 是:

    List<Book> selectedBooks = [
       Book(
        id: 1,
        isActive: true,
        name: "Tipo 1"
       ),
       Book(
        id: 2,
        isActive: false,
        name: "Tipo 2"
       ),
       Book(
        id: 3,
        isActive: true,
        name: "Tipo 3"
       ),
       Book(
        id: 4,
        isActive: false,
        name: "Tipo 4"
       ),
    ]

但是,这不起作用,因为 selectedBooks 最终将所有 book.isActive 设置为 false。

我认为在此处包括的情况下,有些东西没有按预期工作:

selectedBooks = availableBooks
          .map((book) =>
              allowedBooks.contains(book.id) ? ...

有什么线索吗?非常感谢。

【问题讨论】:

  • 您在Book 类中是否覆盖了operator==contains 方法使用它
  • 嗨@pskink,不,它没有被覆盖。
  • @pskink 我在其他地方使用了运算符 ==,所以我认为我不应该覆盖它。在你看来,我可以改变条件以不同的方式达到结果吗?

标签: list flutter


【解决方案1】:

你应该使用allowedBooks.any((allowedBook) =&gt; allowedBook.id == book.id)而不是allowedBooks.contains(book.id)

【讨论】:

    【解决方案2】:

    contains 比较整个对象,试试这个方法

     List<Book> selectedBooks = availableBooks
              .map((book) => allowedBooks.singleWhere((it) => it.id == book.id, 
              orElse: () => null) != null ? Book(
                          id: book.id,
                          isActive: true,
                          name: book.name) : Book(
                          id: book.id,
                          isActive: false,
                          name: book.name)).toList();
    

    dartpad.dev测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多