【问题标题】:Run Firebase Cloud Function before page load Flutter在页面加载 Flutter 之前运行 Firebase Cloud Function
【发布时间】:2021-04-08 09:29:46
【问题描述】:

我有一个 Firebase 云函数,可以在新用户注册时创建一个文档。该函数创建的文档是存储用户数据的位置。流程是这样的:

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

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

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

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

我想知道如何确保 Firebase 函数已执行并且在加载主页之前创建了“其他”文档?

初始化状态

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

【问题讨论】:

    标签: firebase flutter google-cloud-functions


    【解决方案1】:

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

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

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2011-03-01
      • 1970-01-01
      • 2018-08-16
      • 2021-05-26
      相关资源
      最近更新 更多