【问题标题】:Future Function Returning Null Firestore未来函数返回 Null Firestore
【发布时间】:2020-10-19 09:07:20
【问题描述】:

我正在尝试创建一个函数,以查看用户使用哪种方法登录,例如。谷歌。我创建了一个名为 getProvider() 的函数。这是函数的代码。

Future<String> getProvider (FirebaseAuth _auth) 
                              async {
                                var user = await _auth.currentUser();
                                var provider;
                                Firestore firestore = Firestore.instance;
                                await firestore
                                    .collection('Users')
                                    .document('${user.uid}')
                                    .get()
                                    .then((value) {
                                    provider =
                                    value.data['Authentication Provider'];
                                    return provider;
                                });
                              }

但是,当我在函数本身之外打印函数的输出值时,我得到 null。 print(await getProvider(_auth)) //This prints null 但是,当我在函数内打印提供者的值时,它不为空,在这种情况下,我得到了谷歌。当我删除这个函数并在任何需要它的地方调用所有代码时,它按预期工作。

这说明这个getProvider()函数的返回值有问题。有人可以告诉我如何解决这个问题,以便它真正返回正确的值吗?

【问题讨论】:

    标签: firebase flutter asynchronous dart google-cloud-firestore


    【解决方案1】:

    试试这个:

    Future<String> getProvider(FirebaseAuth _auth) async {
      var user = await _auth.currentUser();
      Firestore firestore = Firestore.instance;
      return firestore
          .collection('Users')
          .document('${user.uid}')
          .get()
          .then((value) => value.data['Authentication Provider']);
    }
    

    then() 返回一个Future,您可以稍后通过await 获取该值。由于您的方法已经返回Future&lt;String&gt;,您应该能够只返回由then() 生成的Future

    【讨论】:

    • 谢谢你能解释一下它是如何工作的吗?没看懂
    • then() 只是使用await 的另一种方式。 then() 用于提供一个回调方法,当您的 Future 中的值最终准备好时调用该方法。回调的结果然后作为另一个 Future 返回,这是您通过调用 then() 获得的 Future
    • 当您将方法标记为async 时,它会在您每次使用await 时自动将您的代码打包到then()。因此,您的方法最终必须返回 Future&lt;T&gt;,在本例中为 Future&lt;String&gt;
    • 所以,既然我们知道then() 在这种情况下会返回Future&lt;String&gt;,那么只返回这个Future 是完全有效的。或者,您可以像使用 await _auth.currentUser() 一样使用 await 来获取 String,然后返回 String
    • 我还更新了我的解决方案以稍微简化您的代码并删除不必要的变量。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多