Flutter访问Firebase用户子集合时报Null check operator空值错误
错误原因
- 变量作用域错误:
getCurrentUser方法内通过var LoginUser声明了局部变量,赋值操作仅作用于局部变量,类属性LoginUser始终为null - 异步时序问题:
getCurrentUser执行逻辑未触发页面重绘,即使后续拿到用户信息,页面也不会刷新,build方法执行时LoginUser仍为null,调用空断言!直接抛出异常 - 缺少空安全判断:StreamBuilder未对快照加载状态、空数据、异常状态做判断,直接使用
!调用快照数据也会触发同类异常 - 多余异步等待:
FirebaseAuth.instance.currentUser是同步获取当前登录用户的API,不需要加await
修复代码
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; class UserProductList extends StatefulWidget { UserProductList({Key? key}) : super(key: key); @override _UserProductListState createState() => _UserProductListState(); } class _UserProductListState extends State<UserProductList> { User? loginUser; // 建议统一使用小驼峰命名规范 @override void initState() { super.initState(); getCurrentUser(); } void getCurrentUser() { // 直接给类属性赋值,不需要await和局部变量声明 loginUser = FirebaseAuth.instance.currentUser; if (loginUser != null) { print(loginUser!.email); // 拿到用户信息后触发重绘 setState(() {}); } } @override Widget build(BuildContext context) { return Scaffold( body: loginUser == null // 未获取到用户时展示加载占位 ? const Center(child: CircularProgressIndicator()) : StreamBuilder<QuerySnapshot<Map<String, dynamic>>>( stream: FirebaseFirestore.instance .collection('users') .doc(loginUser!.uid) .collection('products') .snapshots(), builder: (context, 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!.docs.isEmpty) { return const Center(child: Text('暂无产品数据')); } // 正常渲染产品列表 return ListView( children: snapshot.data!.docs.map((document) { // 可根据业务需求替换为自定义产品项布局 return ElevatedButton( onPressed: getCurrentUser, child: Text(document['productName'] ?? '未命名产品') ); }).toList(), ); }, ), ); } }
内容的提问来源于stack exchange,提问作者Md. Fazle Rabbi
相关产品推荐
相关产品推荐

