gpt4 book ai didi

Flutter Firestore getDocuments() 不适用于 initState

转载 作者:行者123 更新时间:2023-12-03 03:00:13 27 4
gpt4 key购买 nike

我在尝试从 initState 中的 Firestore 调用文档时遇到问题。我可以从 StreamBuilder 中提取数据就好了,但我只想在 initState 上调用一次数据。

这是我在做什么:

class _PainLevelState extends State<PainLevel> {
final FirebaseAuth _auth = FirebaseAuth.instance;
final CollectionReference userCollection =
Firestore.instance.collection('users');
static final now = DateTime.now();
String _uid;
double myPainLevel = 0;

Future<void> getCurrentUser() async {
final FirebaseUser user = await _auth.currentUser();
if (mounted) {
setState(() {
_uid = user.uid;
});
}
}

Future<void> getCurrentPainLevel() async {
await userCollection
.document(_uid)
.collection('pain')
.where('time',
isGreaterThanOrEqualTo: DateTime(now.year, now.month, now.day))
.getDocuments()
.then((QuerySnapshot docs) {
if (docs.documents.isNotEmpty) {
print('yes');
} else {
print('no');
}
});
}

@override
void initState() {
super.initState();
getCurrentUser();
getCurrentPainLevel();
}

...

每次打印到控制台时,我都会得到一个“不”。当有文件时,它不会得到任何文件。如果我在 future 使用相同的代码并将其放在其他地方,例如在 build 方法中,它可以工作,但它会不断构建,我不想要那样。关于为什么它不起作用的任何建议?提前致谢。

最佳答案

我在这里猜测您的代码不会总是有效,因为 getCurrentPainLevel可能会在 getCurrentUser 之前被调用完成,这将导致 _uid为空,因此无法按预期工作。试着放 then getCurrentUser 之后的关键字方法,像这样:

@override
void initState() {
super.initState();
getCurrentUser().then((_) {
getCurrentPainLevel();
});
}

顺便说一句,您不应该在 initState 中调用异步方法。尝试将代码放在其他地方,例如 WidgetsBinding.instance.addPostFrameCallback(...) .

关于Flutter Firestore getDocuments() 不适用于 initState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62270233/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com