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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:45:04