LateInitializationError: 字段 '_userData@32329253' 尚未初始化

尝试初始化数据时得到这个。

在构建 UserProfile(dirty, state: _UserProfileState#752a9) 时引发了以下 LateError:LateInitializationError:字段 '_userData@32329253' 尚未初始化。”

这是代码:

    late final User _user;
    late final DocumentSnapshot _userData;

      @override
      void initState() {  
        super.initState();
        _initUser();
      }

      void _initUser() async {
        _user = FirebaseAuth.instance.currentUser!;
        try {
          _userData = await FirebaseFirestore.instance
              .collection('users')
              .doc(_user.uid)
              .get();
        } catch (e) {
          print("something went wrong");
        }
      }

当我尝试打印 _user 和 _userData 以检查它们是否已初始化时,构建功能甚至没有运行。
如果我尝试在 initUser() 函数中打印 _user 和 _userData,则会在错误语句之后打印 _user 并打印 _userData。
请帮助我找到解决此错误的方法。

stack overflow LateInitializationError: Field '_userData@32329253' has not been initialized
原文答案
author avatar

接受的答案

即使您在 initUser() 中初始化这些变量,但如果您在 build() 方法中使用变量,您将收到此错误,因为 initUser() 是异步的,这意味着从集合。要解决此问题,您可以执行以下操作:

@override
      void initState() {  
        super.initState();
        _initUser().whenComplete((){
          setState(() {});
       });
      }

这将使用新值重建小部件树。


答案:

作者头像

就我而言,我在使用 easy_localization 时遇到了这个错误。我忘了:

  await EasyLocalization.ensureInitialized();

在 main.dart 文件上。

附言我知道这不是这个问题的答案,我是为像我这样面临这个问题的人写的。

作者头像

我通过简单地运行以下命令解决了这个问题:

dart migrate --skip-import-check--ignore-exceptions
作者头像

您必须了解可能存在不同的方案,但是原因是相同的,您使用的变量未初始化。在上述条件下,我们可以通过在 initState 方法中设置值来解决:例如:

late String name;

@override
void initState() {
  name = "Flutter Campus";
  super.initState();
}

@override
Widget build(BuildContext context) {
  return Scaffold(
        body: Text(name)
  );
} 

注意:使用之前,您必须将某些内容分配给 late 变量。

您也可以通过使“迟到”变量为无效变量来解决此问题,例如:

String? name;

@override
Widget build(BuildContext context) {
  return Scaffold(
        body: Text(name??"") 
        //if "name" is null, the text will have empty
  );
}