You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore中arrayRemove无法从数组字段删除数据的问题求助

问题描述

调用acceptFriendRequest函数处理好友请求时,对方ID可成功添加到当前用户的friends数组,但无法从当前用户的friendRequest数组中移除,FieldValue.arrayRemove代码失效。

函数代码

Future<void> acceptFriendRequest(String id) async {
  try {
    
    CollectionReference user = FirebaseCollectionsEnum.user.col;
    user.doc(id).update({
      "friends": FieldValue.arrayUnion([box.read("userUID")])
    });
    user.doc(box.read("userUID")).update({
      "friendRequest": FieldValue.arrayRemove([id])
    });
  } catch (e) {
    errorSnackbar(
        "FirebaseFireStoreController, acceptFriendRequest ERROR:", "$e");
  }
}

补充信息

  • 接受请求后,对方ID成功出现在当前用户的friends数组中,但friendRequest数组中的对应ID未被移除
  • 已附上Firestore数据变化及相关截图

排查方案与解决办法

1. 校验ID匹配度

arrayRemove要求传入元素与数组中存储的元素完全一致,包括大小写、空格、特殊字符等。比如Firestore存的是"user_123",传入"user123"就会删除失败。可以在代码中添加日志,对比传入的id和数组中的实际元素:

// 在update操作前添加日志
String currentUserId = box.read("userUID");
print("待移除的请求ID: $id");
DocumentSnapshot userDoc = await user.doc(currentUserId).get();
List<dynamic> currentRequests = userDoc["friendRequest"] ?? [];
print("当前friendRequest数组内容: $currentRequests");

2. 确认字段类型

检查Firestore控制台,确保当前用户文档的friendRequest字段类型为Array。如果是字符串、Map等其他类型,arrayRemove会直接失效。

3. 改用事务保证操作原子性

当前两个update是独立操作,改用事务可以确保两个操作要么都成功要么都失败,同时避免潜在的并发修改问题:

Future<void> acceptFriendRequest(String id) async {
  try {
    CollectionReference user = FirebaseCollectionsEnum.user.col;
    String currentUserId = box.read("userUID");
    
    await FirebaseFirestore.instance.runTransaction((transaction) async {
      transaction.update(user.doc(id), {
        "friends": FieldValue.arrayUnion([currentUserId])
      });
      transaction.update(user.doc(currentUserId), {
        "friendRequest": FieldValue.arrayRemove([id])
      });
    });
  } catch (e) {
    errorSnackbar(
        "FirebaseFireStoreController, acceptFriendRequest ERROR:", "$e");
  }
}

4. 排查其他代码干扰

检查是否有其他异步代码、Stream监听等,在执行arrayRemove后又将该ID重新添加到friendRequest数组中,导致看起来删除失效。

5. 更新Firebase依赖版本

旧版cloud_firestore SDK可能存在arrayRemove的已知bug,尝试升级到最新稳定版,修改pubspec.yaml:

dependencies:
  cloud_firestore: ^latest_version

内容的提问来源于stack exchange,提问作者user14828291

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:12:23