Flutter Firebase中如何让不同用户获取各自专属数据?
解决方案
核心问题分析
你当前的代码硬编码了集合名'Harris'和文档名'username',所以无论哪个用户登录,都会读取同一个固定文档,自然始终显示同一个用户名。正确的做法是用当前登录用户的UID作为文档标识,关联到对应的用户数据。
步骤1:调整Firestore数据结构
从你的控制台截图看,当前数据结构不合理,应该:
- 创建一个统一的集合(比如命名为
users) - 每个用户的文档ID使用该用户在Firebase认证中的UID(可在Firebase认证控制台查看用户UID)
- 每个文档内存储对应用户的
username等信息
步骤2:修改代码获取当前用户数据
替换原有的集合和文档引用逻辑,通过当前登录用户的UID动态获取对应文档:
// 获取当前登录用户 final currentUser = FirebaseAuth.instance.currentUser; // 用户未登录时返回登录提示 if (currentUser == null) { return Center(child: Text('请先登录')); } // 用当前用户UID作为文档ID,读取users集合下的对应文档 CollectionReference users = FirebaseFirestore.instance.collection('users'); return FutureBuilder<DocumentSnapshot>( future: users.doc(currentUser.uid).get(), builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) { if (snapshot.hasError) { return Center(child: Text("Something went wrong")); } if (snapshot.hasData && !snapshot.data!.exists) { return Center(child: Text("用户数据不存在")); } if (snapshot.connectionState == ConnectionState.done) { Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>; return Container( height: double.infinity, width: double.infinity, decoration: BoxDecoration( color: brightGray, ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Welcome,', style: ktextFont3, ), Text( '${data['username']}', style: ktextFont4, ), ], ), ); } return Center( child: CircularProgressIndicator( color: mintGreen, ), ); }, );
关键修改点说明
FirebaseAuth.instance.currentUser:获取当前已登录用户实例,提取uid作为文档唯一标识users.doc(currentUser.uid):动态关联当前用户的专属文档,确保不同用户读取自己的数据- 增加用户未登录判断,避免空指针异常
关于之前变量替换后为空的问题
大概率是因为:
- 未正确获取当前用户UID(比如用户未登录时UID为空)
- Firestore中未创建对应用户UID的文档,或文档内无
username字段 - 热重启时Auth状态未同步,可尝试冷启动应用,或用
StreamBuilder监听FirebaseAuth.instance.authStateChanges()
内容的提问来源于stack exchange,提问作者Harris Shah
相关产品推荐
相关产品推荐

