【发布时间】: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的用法没有任何问题(除了将.then与await混合使用是不好的风格)。但是,您依赖异步操作来初始化userdata,这对于late变量来说是个坏主意,因为这提供了在初始化之前访问它的更多机会。您没有看到回调触发,因为您访问了userdata并触发了LateInitializationError在回调执行之前。
标签: flutter future flutter-futurebuilder