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

FireStore存储FCM Token时丢失UserId的问题求助

问题解决:Firestore存储FCM Token时保留用户ID

对,你完全应该改用**更新(update)**方法,或者给set方法加上merge: true参数,这两种方式都能解决文档字段被覆盖的问题。

问题根源

Firestore的set()方法默认会完全替换目标文档的全部内容:第一次调用addUserDataToFireStore用set存入userId,第二次调用generateDeviceToken再用set存入fcmToken时,整个文档会被新的键值对替换,旧的userId自然就被删除了。

两种可行方案

方案1:使用update()方法修改Token存储函数

直接把set换成update,update只会更新你指定的字段,不会影响文档中已存在的其他字段:

generateDeviceToken() async {
  String? fcmToken = await FirebaseMessaging.instance.getToken();
  final userId = FirebaseAuth.instance.currentUser!.uid;
  await FirebaseFirestore.instance
      .collection('users')
      .doc(userId)
      .update({'fcmToken': fcmToken});
}

方案2:给set()方法添加merge: true参数

保留set方法,但通过SetOptions(merge: true)让新字段合并到现有文档中,而非替换整个文档:

generateDeviceToken() async {
  String? fcmToken = await FirebaseMessaging.instance.getToken();
  final userId = FirebaseAuth.instance.currentUser!.uid;
  await FirebaseFirestore.instance
      .collection('users')
      .doc(userId)
      .set({'fcmToken': fcmToken}, SetOptions(merge: true));
}

额外优化建议

可以把用户信息存储和Token存储合并成一个函数,避免分开调用可能出现的时序问题,同时保证字段完整性:

Future<void> saveUserAndDeviceToken() async {
  final userId = FirebaseAuth.instance.currentUser!.uid;
  String? fcmToken = await FirebaseMessaging.instance.getToken();
  
  await FirebaseFirestore.instance
      .collection('users')
      .doc(userId)
      .set({
        'userId': userId,
        'fcmToken': fcmToken
      }, SetOptions(merge: true));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:10:31