如何使用 flutter 和 dart 从 Cloud Firestore 检索特定数据?

Eso*_*age 2 dart firebase flutter google-cloud-firestore

我一直在阅读与 StackOverflow 相关的帖子。但是,我还没有找到一个简单的解决方案,对于像我这样的初学者来说很容易理解。目前,我的 Cloud Firestore 数据库如下所示:

My Cloud Firestore 数据库布局

在用户输入足够的信息来填充文档中的每个字段后(ID 是通过电话身份验证的经过身份验证的用户的 UID),然后它会被发送到数据库中。之后,用户将被重定向到主屏幕,其中应显示每个字段。这就是我被困的地方。下面是我开始实施的一个方法,它将返回一个字符串,该字符串将位于文本小部件内,以显示在数据库中找到的用户名。

String getUsername(FirebaseUser user, Firestore firestore) {

    //get the document reference
    DocumentReference docReference = firestore.document("Users/" + user.uid);

    Future<DocumentSnapshot> snapshot = docReference.get();

    Stream<DocumentSnapshot> stream = snapshot.asStream();

    //stub to ignore compiler warnings
    return null;
 }
Run Code Online (Sandbox Code Playgroud)

如您所见,在使用 Futures 和 Streams 时,我相当迷茫。我在 youtube 上观看了 google flutter 开发人员的视频,他们帮助我做到了这一点。我还尝试使用 Future 对象提供的 then() 和 whenCompleted() 方法,但是我发现自己挖了一个越来越大的洞。

非常感谢所有帮助!

Pet*_*dad 6

要获取用户信息,请尝试以下操作:

Future<DocumentSnapshot> getUserInfo()async{
var firebaseUser = await FirebaseAuth.instance.currentUser();
return await Firestore.instance.collection("users").document(firebaseUser.uid).get();
}
Run Code Online (Sandbox Code Playgroud)

然后FutureBuilder在您的build()方法中使用:

          FutureBuilder(
            future: getUserInfo(),
            builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                return ListView.builder(
                    shrinkWrap: true,
                    itemCount: 1,
                    itemBuilder: (BuildContext context, int index) {
                      return ListTile(
                        title:
                            Text(snapshot.data.data["email"]),
                      );
                    });
              } else if (snapshot.connectionState == ConnectionState.none) {
                return Text("No data");
              }
              return CircularProgressIndicator();
            },
          ),
Run Code Online (Sandbox Code Playgroud)

在方法await内部使用时,需要声明该方法async。您还需要返回一个Future, 才能在屏幕上显示结果,然后您需要使用FutureBuilder小部件。

https://dart.dev/codelabs/async-await