使用Firebase Auth邮箱登录的应用如何固定发布内容用户名不随账号切换变更
问题根源
- 展示历史内容用户名时,你调用了当前登录的Firebase Auth用户的
displayName,所有内容都共享当前登录账号的用户名,自然会跟着账号切换变动 - 发布内容时你在Firestore的
thread集合里存储的是用户邮箱displayName.email,和注册环节设置的用户昵称没有关联
修复步骤
1. 修改内容发布逻辑,存储发布时的用户昵称
发布内容时直接把对应用户的昵称作为固定值存入帖子文档,保证后续账号切换不会影响历史数据:
static Future<void> sendPostInFirebase(String postID, String postContent, MyProfileData displayName, String postImageURL) async { String postFCMToken; if (displayName.myFCMToken == null) { SharedPreferences prefs = await SharedPreferences.getInstance(); postFCMToken = prefs.get('FCMToken'); } else { postFCMToken = displayName.myFCMToken; } Firestore.instance.collection('thread').document(postID).setData({ 'postID': postID, // 把原来的displayName.email改成你MyProfileData中对应用户昵称的字段,比如myDisplayName 'displayName': displayName.myDisplayName, 'userThumbnail': displayName.myThumbnail, 'postTimeStamp': DateTime.now().millisecondsSinceEpoch, 'postContent': postContent, 'postImage': postImageURL, 'postLikeCount': 0, 'postCommentCount': 0, 'FCMToken': postFCMToken }); }
2. 修改内容展示逻辑,从帖子文档读取用户名
展示历史帖子时,不要用当前Auth用户的信息,直接读取对应帖子Firestore文档中存储的displayName字段即可,示例逻辑如下:
// 展示单条帖子的用户名示例,postSnapshot是单条thread文档的查询快照 Widget displayPostAuthorName(postSnapshot) { return Padding( padding: const EdgeInsets.all(8.0), child: Text( postSnapshot.data()['displayName'], style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), ), ); }
你原来的displayUserInformation方法是用来展示当前登录用户信息的,不要复用这个方法展示历史内容的发布者信息即可。
可选优化
如果后续需要支持用户修改昵称后,所有历史帖子的昵称同步更新,可以单独维护一个users集合,存储每个用户uid对应的最新昵称,发布帖子时只存发布者的uid,查询帖子时再联查对应用户的最新昵称即可。如果不需要同步更新,按上面的方案直接把昵称固定存入帖子文档即可。
内容的提问来源于stack exchange,提问作者Soo
相关产品推荐
相关产品推荐

