You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的问题提前触发。
修复方案
  1. 修正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时跳转到登录页的逻辑
  }

  // 其余代码保留
}
  1. 补充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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:15:09