【问题标题】:LateInitializationError: Field has not been initialized.' .then() command not running after running firebase query in FutureBuilderLateInitializationError:字段尚未初始化。在 FutureBuilder 中运行 firebase 查询后,.then() 命令未运行
【发布时间】:2021-10-22 10:10:55
【问题描述】:

我正在尝试检索 Firestore 快照,但我的代码似乎无法正常工作。我确保 fireUser.uid 工作正常,它打印了正确的 ID,但奇怪的是我的 .then() 代码根本没有运行,我将 print('then') 放入其中并且没有出现在我的控制台上

这是发生错误的地方:

FutureBuilder(
      future: Future.wait([
      DatabaseService.getUserDataFromFirestore(FirebaseAuth.instance.currentUser!),
      GeoService.getPosition(),
      ]),
      builder: (context, snap) {
        if (snap.connectionState == ConnectionState.done) {
          return Frame();
        }
        else return Container(
          color: Colors.black,
          child: Center(
            child: spinKit,
          ),
        );
      }
    );

未来有错误:

static Future<Userdata> getUserDataFromFirestore (User fireUser) async {
    await usersRef.doc(fireUser.uid).get().then((val) {
      print('then');
      userdata = Userdata.fromDoc(val);
    });
    return userdata;
  }

错误信息:

LateInitializationError: Field 'userdata' has not been initialized.

【问题讨论】:

  • 您确定错误来自return userdata 行吗?
  • 当我尝试使用'userdata'时,错误来自我的代码后面,抱歉我不太清楚
  • late 使用,前提是您可以从逻辑上保证在使用 userdata 之前对其进行初始化。如果您无法保证,则将其设为可空,并在您使用它的任何地方检查 null 值。
  • 它应该总是被初始化这个代码以前对我有用,但是当我今天打开颤振突然停止工作。我认为问题出在“.then()”的位置,因为该代码甚至根本没有运行
  • .then 的用法没有任何问题(除了将.thenawait 混合使用是不好的风格)。但是,您依赖异步操作来初始化userdata,这对于late 变量来说是个坏主意,因为这提供了在初始化之前访问它的更多机会。您没有看到回调触发,因为您访问了userdata 并触发了LateInitializationError回调执行之前。

标签: flutter future flutter-futurebuilder


【解决方案1】:

我有一个不同的问题,然后我想。 Firestore 必须已更新,因为我的 Firestore 数据库的规则将我锁定在外,所以我更新了规则,现在我的代码可以正常工作了。非常感谢您的帮助

【讨论】:

  • 仅供参考,LateInitializationError 可能表示您的Future 未完成而暴露的另一个问题。也就是说,如果你不修复它,如果 Future 恰好比平时需要更长的时间才能完成,它可能会再次发生。
猜你喜欢
  • 1970-01-01
  • 2022-07-27
  • 2021-10-27
  • 2021-12-29
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多