【问题标题】:Flutter - removing duplicates from arrayFlutter - 从数组中删除重复项
【发布时间】:2021-10-25 04:30:22
【问题描述】:

底线:如何从 firebase 数据库中检索数据、插入数组并刷新列表视图而不获取重复项?

我正在从 Firebase 数据库获取数据并将其加载到颤振应用程序中的数组中。然后,我使用 Listview.Builder 来制作数组项的列表。

问题是,当我刷新页面(使用刷新包)时,列表中的项目会重复。它们从 firebase 加载并再次加载到阵列上。

我尝试使用array.contains(element.id)(因为每个项目都有一个唯一的 ID)有条件地将项目插入到数组中,如果它不存在的话。

然而,这个条件总是错误的,尽管数组中的 ID 是相同的(我打印出来检查)。我怎样才能使这种情况或类似情况起作用?

检查重复的功能:

bool isDuplicate(Group group) {
bool result = false;
if (groupList.contains(group.id)) {
  result = true;
} else {
  result = false;
}
return result;}

从数据库中获取项目的功能:

Future searchGroupsDB() async {
return await userGroupsRef.once().then((snapshot1) {
  Map<dynamic, dynamic>? groupTitles = snapshot1.value;
  if (groupTitles != null) {
    groupTitles.forEach((key, value1) {
      userGroupsRef.child(key).once().then((snapshot2) {
        String? title = snapshot2.key;
        String id = snapshot2.value["ID"];
        String colors = snapshot2.value["Colors"];
        String description = snapshot2.value["Description"];
        if (snapshot2.value != null) {
          Group groupToInsert = Group(
              id: id,
              title: title!,
              description: description,
              containsImage: (displayImage != null) ? true : false,
              color: GradientColors.black,
              textColor: Colors.white);
          if (isDuplicate(groupToInsert) == true) {
            print("group already exists"); //this is never printed
          } else if (isDuplicate(groupToInsert) == false){
           groupList.insert(0, groupToInsert);
          }
        }
      });
    });
  }
});}

提前感谢您的帮助!

【问题讨论】:

  • groupList.set();
  • @RaineDaleHolgado 你的意思是 toSet() 吗?

标签: firebase flutter dart firebase-realtime-database


【解决方案1】:

如果您只想在数组中包含唯一项,请考虑使用 arrayUnion 操作符,它正是这样做的。有关这方面的更多信息,请参阅 updating an item in an array 上的 Firebase 文档和 FieldValue.arrayUnion method 上的 FlutterFire 文档。


更新(因为您使用的是实时数据库)

在 Firebase 的实时数据库中,您通常不希望使用数组来存储唯一值。一组唯一值的惯用 JSON 数据结构是:

{
  "value1": true,
  "value2": true
}

这里的true 只是一个虚拟值。更重要的是,您要唯一存储的项目是此结构中的键,这意味着它们在定义上是唯一的。 Flutter 的 arrayUnion 等价物现在变成了简单的 ref.update({ "value1": true })

【讨论】:

  • 这个答案看起来很棒!但是,我忘了提到我使用的是 Firebase 实时数据库,而不是云 Firestore。有没有与您的答案相同的答案?
  • 啊,我确实错过了。在实时数据库上,通常最好将字典用于类似集合的数据结构。请参阅我刚刚添加到答案中的更新。
【解决方案2】:

经过1个月的尝试,我终于解决了。 回答

@override bool operator ==(other) {
return (other is Group)
    && other.id == id; }

我需要这样做,以便 Flutter 了解如果两个组的 ID 相同,则它们是相同的。

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 2011-01-04
    • 2013-08-03
    • 2017-11-06
    • 2019-03-15
    相关资源
    最近更新 更多