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
相关产品推荐
相关产品推荐

