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
相关产品推荐
相关产品推荐

