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

Posted

技术标签:

【中文标题】LateInitializationError:字段“_userData@32329253”尚未初始化【英文标题】:LateInitializationError: Field '_userData@32329253' has not been initialized 【发布时间】:2021-06-18 09:18:04 【问题描述】:

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

在构建 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。 请帮助我找到解决此错误的方法。

【问题讨论】:

你检查过你的日志吗?! Firebase 总是告诉你错误。不要使用 try catch。 顺便说一句,您在错误的范围内使用了 lateinit。删除 _userData 的 lateinit 关键字 首先我没有使用 try catch 仍然得到同样的错误并且删除 late 关键字不会编译,因为很明显最终变量需要初始化 如果你不打算使用lateinit,你需要使用可选参数 您正在尝试在对象构造中未发生的覆盖方法上使用来自未来方法的“最终”变量。 Lateinit 存在于特定情况下,但不适用于您尝试使用的逻辑。 【参考方案1】:

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

  await EasyLocalization.ensureInitialized();

在 main.dart 文件上。

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

【讨论】:

【参考方案2】:

即使您在initUser() 中初始化这些变量,但如果您在build() 方法中使用变量,您将收到此错误,因为initUser() 是异步的,这意味着从其中获取数据需要时间集合。要解决这个问题,您可以这样做:

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

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

【讨论】:

这个可以和OP中的sn-p一起使用吗?因为我收到一条错误消息,提示“此表达式的类型为 'void',因此无法使用其值”。【参考方案3】:

你必须明白,可能有不同的场景,但原因是一样的,你使用的变量没有初始化。在上述情况下,我们可以通过在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
  );
 

【讨论】:

【参考方案4】:

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

dart migrate --skip-import-check--ignore-exceptions

【讨论】:

以上是关于LateInitializationError:字段“_userData@32329253”尚未初始化的主要内容,如果未能解决你的问题,请参考以下文章

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

LateInitializationError:字段尚未在 Flutter 中初始化

LateInitializationError:字段“chatRoomsStream”尚未在 Flutter 中初始化

如何解决 Flutter 中的 LateInitializationError?

LateInitializationError:字段“显示名称”尚未在 Flutter 共享首选项中初始化?

即使我在 initState 中初始化变量,Dart 也会抛出 LateInitializationError