在页面加载Flutter之前运行Firebase Cloud Function



我有一个Firebase Cloud函数,当新用户注册时,它会创建一个文档。函数创建的文档是存储用户数据的地方。过程如下:

  1. 用户注册
  2. 在Firestore中创建的用户文档
  3. 触发Firebase函数以创建"其他"文档
  4. 用户看到主页
  5. 主页使用"其他"文档中的数据

我遇到的问题是,在执行Firebase功能之前,用户直接进入主页,而"其他"文档尚未创建。

这意味着用户只看到CircularProgressIndicator,因为页面是在"其他"文档存在之前加载的。

如果用户点击离开该页面并返回到该页面,它会正常工作,因为到那时"其他"文档已经存在。同样,当我在最初加载主页时添加5秒的延迟时,它是有效的,因为Firebase函数有时间执行——但这不是一个好的解决方案。

我想知道在加载主页之前,如何确保Firebase功能已经执行,并且"其他"文档已经创建

initState

void initState() {
super.initState();
final user = Provider.of<UserClass>(
context,
listen: false); 
final uid = user.uid;
_houseID = getHouseID(uid);
}

Firebase函数创建的文档的未来返回ID

Future<String> getHouseID(uid) async {
String houseID;
await Future.delayed(Duration(milliseconds: 5000)); // with this delay it works fine 
await FirebaseFirestore.instance
.collection('users')
.doc(uid)
.collection('userHouses') // this collection is being created by a Cloud Function
.get()
.then(
(value) {
houseID = value.docs.single.id;
},
);
return houseID;
}

FutureBuilder

return FutureBuilder(
future: _houseID,
builder: (BuildContext context, AsyncSnapshot snapshot) {
hhid = snapshot.data;
if (!snapshot.hasData) {
return Center(child: CircularProgressIndicator()); // this runs forever when the user first signs up
} else {
return // homepage using hhid to retrieve user data

您可以打开一个流,在用户注册后监听该特定文档。流最初可能是空的,因此您可以检查文档是否存在。文档编写完成后,流将被更新,如果完成,则可以关闭它。

这里有一个简单的代码来解释这个想法:

final subscription = FirebaseFirestore.instance.doc('path-to-document').snapshots().listen((event) {
if (event.exists) {
// do something with the data
final data = event.data();
// update your state
// .... some code
// call a function to close the subscription if you don't need it
closeSubscription();
}
});
closeSubscription() {
subscription.cancel();
}

相关内容

  • 没有找到相关文章

最新更新