如何显示Flutter中仍从Firestore加载的数据?

时间:2019-06-14 01:04:48

标签: flutter dart google-cloud-firestore

我正在尝试设置基本用户注册,登录,编辑个人资料,查看个人资料页面。目前,注册,登录和编辑配置文件工作正常,我可以写到Firestore。但是在检索数据时遇到一些问题,我还是看了一下如何检索数据的代码,但是它不适用于我的代码。我有一个用户类,它获取用户的当前信息并为其设置一些变量,以便我只能从数据库中获取一次信息。但是,当我尝试在配置文件页面类中构造用户并获取信息时,发生的事情是它跳过了get info方法,因为嵌套在内部的getCurrentUser是异步的,因为它的异步,因为auth.currentuser方法需要异步。

因此,我了解问题所在,并对其进行了测试,并在控制台中获得了证明这一点的值,但是我该如何解决呢?我可以在代码中进行哪些更改,以便在调用获取信息并返回null之前不跳过获取信息?我是新手,所以很抱歉,如果这很明显,非常感谢您的帮助,

我的代码也可以从数据库中获取特定的值,所以不用担心它是否无关,因为它在控制台中正确显示,但是在异步之后被跳过。

这些是我提到的在User类中存在的方法:

final _firestore = Firestore.instance;
  final _auth= FirebaseAuth.instance;
  FirebaseUser loggedInUser;

Future<void> getCurrentUser() async{
      try{
        final user= await _auth.currentUser();

        if(user!=null){
          loggedInUser=user;
          email=loggedInUser.email;
        }}
      catch(e){
        print(e);
      }
    }

    void getInfo() async {
        await getCurrentUser();
        DocumentReference documentReference =
        _firestore.collection("users").document("$email");
        documentReference.get().then((DocumentSnapshot datasnapshot) {
          if (datasnapshot.exists) {
            displayName=datasnapshot.data['displayName'].toString();
            bio=datasnapshot.data['bio'].toString();
            print(bio);
          }
          else {
            print("No such user");
          }
        });
      }

如您所见,getCurrentUser需要异步。我还有其他变量,方法和构造函数,但我尝试仅共享需要显示的内容。

然后我在profilepagestate内有以下代码:

User currentUser;
  String bio;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    currentUser= new User();
    currentUser.getInfo();
    bio= currentUser.getBio();
  }

然后在个人资料页面的下方创建一个文本小部件:

Text('$bio', style: TextStyle(fontSize: 30.0, ))

但是,文本始终在屏幕上显示为空,我理解发生了什么,但我不知道如何解决。我已经尝试过围绕使事情变得不异步或至少尝试的事情进行切换,但我无法弄清楚。请不要删除我的帖子,香港专业教育学院环顾四周,这个问题是我的代码所特有的,我真的不知道该如何解决,我只是不想浪费更多的时间。

1 个答案:

答案 0 :(得分:0)

在数据仍在加载时,您需要显示一个备用小部件(通常是加载指示器)。

return bio == null
  ? CircularProgressIndicator()
  : Text('$bio', style: TextStyle(fontSize: 30.0, ));

更新

您的加载指示器卡住了,因为加载数据时永远不会重建页面。当currentUser数据加载完成时,您需要通过调用setState来重建页面。

@override
void initState() {
  // TODO: implement initState
  super.initState();
  currentUser= new User();
  currentUser.getInfo().then((_) => 
    setState(() => bio = currentUser.getBio()));
}

要链接async调用,您需要将getInfo()的返回值从void切换到Future<void>

Future<void> getInfo() async {
  await getCurrentUser();
  // ..
}