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

Flutter Firebase匿名登录后点击按钮报Null check operator空值错误

问题根因

你在initState中调用的connectToFirebase是异步函数,Dart不会等待异步函数执行完成再执行后续的build方法,所以页面渲染完成、你点击按钮的时候,匿名登录的异步请求还没返回结果,user变量还是初始的null值,此时你用!强制解包user!.uid就触发了空值报错,和Firebase后台是否存在用户记录无关。

Null check operator used on a null value.

修复方案

1. 新增加载状态控制

在State类中新增加载状态变量,异步请求未完成时页面展示加载组件,避免用户在user未赋值时点击按钮:

class _ToDo1State extends State<ToDo1> {
  User? user;
  late DatabaseService database;
  // 新增加载状态变量
  bool _isLoading = true;

  Future<void> connectToFirebase() async{
    final FirebaseAuth auth = FirebaseAuth.instance;
    UserCredential result = await FirebaseAuth.instance.signInAnonymously();
    user = result.user;
    database = DatabaseService(user!.uid);

    if (!(await database.checkIfUserExists())) {
      await database.setTodo('To-Do anlegen', false);
    }
    // 异步逻辑执行完成,更新页面状态
    if(mounted) {
      setState(() {
        _isLoading = false;
      });
    }
  }
  // 其余原有代码保持不变
}

2. 改造build方法适配加载状态

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Center(
          child: Text(
        'Stufe 1',
        style: TextStyle(
            fontStyle: FontStyle.italic,
            decoration: TextDecoration.underline),
      )),
      backgroundColor: Color.fromRGBO(35, 112, 192, 1),
    ),
    body: Center(
      child: _isLoading 
      // 加载中展示进度条
      ? const CircularProgressIndicator() 
      // 加载完成展示功能按钮
      : ElevatedButton(
        onPressed: () {
          // 增加非空判断双重保险
          if(user != null) {
            // 可直接复用已经初始化完成的database实例,不需要重复创建
            print(database.userID);
          }
        },
        child: const Icon(Icons.question_answer_outlined)
      )
    )
  );
}

内容的提问来源于stack exchange,提问作者Lars

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:15:04