Flutter从Firebase获取当前用户信息展示到个人profile时出现报错如何解决
报错核心原因
- 数据源类型不匹配:你代码中监听的是
doc(user!.uid).snapshots(),返回的是单个DocumentSnapshot对象,仅包含当前登录用户的单条文档数据,没有length属性,你调用snapshot.data.length就是触发崩溃的直接原因。 - 组件选型错误:个人Profile页面仅需要展示单条用户数据,不需要使用
ListView.builder组件,该组件是为多条同结构列表数据设计的。 - 边界场景未兼容:你直接使用
!非空断言访问user.uid,如果当前没有登录用户、FirebaseAuth.instance.currentUser返回null时会直接抛出空异常;同时也没有处理快照加载中、请求失败的异常场景。
修正方案
你可以直接参考下面的代码调整逻辑:
final auth = FirebaseAuth.instance; final db = FirebaseFirestore.instance; User? user = FirebaseAuth.instance.currentUser; Padding( padding: const EdgeInsets.only(left: 20, right: 20), // 先判断用户是否登录 child: user == null ? const Center(child: Text("请先登录")) : StreamBuilder<DocumentSnapshot>( stream: db .collection("Users") .doc("list_students") .collection("Students") .doc(user.uid) .snapshots(), builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) { // 处理加载状态 if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 处理错误状态 if (snapshot.hasError) { return Center(child: Text("加载失败:${snapshot.error}")); } // 处理文档不存在的情况 if (!snapshot.hasData || !snapshot.data!.exists) { return const Center(child: Text("用户数据不存在")); } // 拿到用户数据 Map<String, dynamic> userData = snapshot.data!.data() as Map<String, dynamic>; // 直接渲染用户信息,不需要ListView return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("用户名:${userData['name'] ?? ''}"), Text("邮箱:${userData['email'] ?? ''}"), // 其他你需要展示的用户字段直接在这里添加即可 ], ); }, ), )
如果你确实需要展示当前用户名下的多条列表数据,那需要调整你的Firestore查询路径,去掉末尾的.doc(user.uid)改为监听整个集合的快照,此时返回的是QuerySnapshot,可以正常访问length属性配合ListView.builder使用。
内容的提问来源于stack exchange,提问作者user13133459
相关产品推荐
相关产品推荐

