Flutter出现The getter 'isNotEmpty' was called on null报错是什么原因
错误原因排查
- 核心触发原因:
userId变量为空,传递到Firestore的collection()方法时触发SDK内部校验异常
你当前代码在_LogsState类中直接对userId赋值firebaseUser.uid,存在两处严重逻辑问题:
一是类实例变量的赋值操作不能直接放在类定义顶层,必须放在构造函数、生命周期方法(如
initState)中执行,当前写法本身就不符合Dart语法规范,实际运行时userId不会被正确赋值,最终为null;
二是如果当前没有用户登录,firebaseUser本身就是null,即使赋值逻辑正确也可能拿到null的userId。
后续你构建Firestore查询流时,将null的userId传入collection()方法,Firestore SDK内部会校验传入的集合名是否isNotEmpty,就直接触发了你遇到的空对象调用isNotEmpty的异常。
- 潜在问题:StreamBuilder快照校验不完整
你只判断了加载状态,没有判断snapshot.hasData就直接访问snapshot.data.docs,如果查询返回空数据也会触发空异常,只是本次报错还没执行到这一步就被userId的问题提前触发。
修复方案
- 修正
userId初始化逻辑,改为在initState生命周期中获取登录用户,增加空兜底处理
class _LogsState extends State<Logs> { String? userId; // 改为可空类型 @override void initState() { super.initState(); // 安全获取当前登录用户 final firebaseUser = FirebaseAuth.instance.currentUser; if (firebaseUser != null) { userId = firebaseUser.uid; } // 可在此处补充userId为null时跳转到登录页的逻辑 } // 其余代码保留 }
- 补充build阶段的空校验,完善StreamBuilder的判断逻辑
@override Widget build(BuildContext context) { // 优先判断用户登录状态 if (userId == null) { return Scaffold( appBar: AppBar( title: const Text("Smart Electric"), foregroundColor: Colors.white, backgroundColor: Colors.yellow[600] ), body: const Center(child: Text("请先登录后查看记录")), ); } return StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance.collection(userId!).snapshots(), builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) { if (snapshot.hasError) { return const Center(child: Text('加载失败,请稍后重试')); } if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 补充数据非空判断 if (!snapshot.hasData || snapshot.data?.docs == null) { return const Center(child: Text(" No readings Received yet")); } final List storedocs = []; snapshot.data!.docs.map((DocumentSnapshot document) { Map a = document.data() as Map<String, dynamic>; storedocs.add(a); a['id'] = document.id; }).toList(); var n = storedocs.length; // 原有Scaffold渲染逻辑保持不变即可,注意检查原代码中多余的闭合括号避免语法报错
内容的提问来源于stack exchange,提问作者Arpit Lekurwale
相关产品推荐
相关产品推荐

