及时从Firestore检索数据

时间:2020-11-11 00:56:40

标签: firebase flutter dart google-cloud-firestore

我在互联网上四处寻找解决问题的方法,但找不到任何解决方案。我在Firestore中使用Flutter制作应用程序。我要这样做,以便当用户登录到顶部的应用程序时显示其名称(简单右侧)。我可以从Firestore获取数据:


Future<void> getName() async {
  print("Attemping to get name!");
  final firestoreInstance = await FirebaseFirestore.instance;
  FirebaseAuth auth = FirebaseAuth.instance;
  String uid = auth.currentUser.uid.toString();
  await firestoreInstance.collection("Users").doc(uid).get().then((value) {
    print("Name: " + value.data()["firstName"]);
    info.firstName=((value.data()["firstName"]));
  })

class info {
  static String firstName;
}


但是它来得太晚了,因此该应用仅显示“欢迎回来” As you can see here,而不是“欢迎回来,康纳” As seen here

当我在控制台中查看时,该函数确实运行,但程序未等待它,并继续导致null。

谢谢

根据请求的用户界面代码进行编辑:


class Home extends StatelessWidget {
  final DatabaseReference = FirebaseDatabase.instance;
  final FirebaseAuth auth = FirebaseAuth.instance;

  static String firstName;
  static String lastName;
  static String email;
  static String companyName;
  static bool isNewAccount = false;
  static String name = "Welcome back";

  Home();

  @override
  Widget build(BuildContext context) {
    final User user = auth.currentUser;
    final uid = user.uid;
    final ref = DatabaseReference.reference();

    if (isNewAccount == true) {
      userSetup(firstName, lastName, email, companyName);
      isNewAccount = false;
    }

    getName(); //does get the name from the database but name will error out as it doesn't get the name fast enough (or that's what I think)
    name= "Welcome back, "+info.firstName;

    return WillPopScope(
      onWillPop: () async => false,
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        home: Scaffold(
          backgroundColor: Colors.cyan,
          body: SingleChildScrollView(
            child: Container(
              margin:
                  EdgeInsets.only(top: MediaQuery.of(context).size.height / 16),
              child: Column(
                children: [
                  Container(
                    margin: EdgeInsets.only(bottom: 10),
                    child: Text(
                      name,
                      textAlign: TextAlign.center,
                      style: new TextStyle(
                        color: Colors.white,
                        fontSize: MediaQuery.of(context).size.width / 16,
                      ),
                    ),
                  ),
                  Container(
                    width: 260,
                    height: 125,
                    child: RaisedButton(
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(20.0),
                      ),
                      child: Text(
                        "CHECK-IN",
                        style: new TextStyle(
                          color: Colors.white,
                          fontSize: 40.0,
                        ),
                      ),
                      color: Colors.grey[850],
                      onPressed: () {
                        Navigator.push(context,
                            MaterialPageRoute(builder: (context) => Checkin()));
                      },
                    ),
                  ),
                  Container(
                    width: 260,
                    height: 140,
                    padding: EdgeInsets.only(top: 20),
                    child: RaisedButton(
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(20.0),
                      ),
                      child: Text(
                        "CHECK-OUT",
                        style: new TextStyle(
                          color: Colors.white,
                          fontSize: 38.0,
                        ),
                      ),
                      color: Colors.grey[850],
                      onPressed: () {
                        Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => Checkout()));
                      },
                    ),
                  ),
                  Container(
                    margin: EdgeInsets.only(top: 55),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Container(
                          padding: EdgeInsets.only(right: 20),
                          child: Text(
                            "Sign out: ",
                            style: new TextStyle(
                              fontSize: 15.0,
                              fontWeight: FontWeight.bold,
                            ),
                          ),
                        ),
                        Container(
                          child: RaisedButton(
                            child: Text(
                              "SIGN OUT",
                              style: new TextStyle(
                                fontSize: 14.0,
                                color: Colors.white,
                              ),
                            ),
                            color: Colors.grey[700],
                            onPressed: () {
                              context.read<AuthenticationService>().signOut();
                              //return MyApp();
                            },
                          ),
                        )
                      ],
                    ),
                  ),
                  Container(
                    margin: EdgeInsets.only(top: 10),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Container(
                          padding: EdgeInsets.only(right: 20),
                          child: Text(
                            "View Stats: ",
                            style: new TextStyle(
                              fontSize: 15.0,
                              fontWeight: FontWeight.bold,
                            ),
                          ),
                        ),
                        Container(
                          child: RaisedButton(
                            child: Text(
                              "STATS",
                              style: new TextStyle(
                                fontSize: 14.0,
                                color: Colors.white,
                              ),
                            ),
                            color: Colors.grey[700],
                            onPressed: () {
                              Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => Stats()));
                            },
                          ),
                        ),
                      ],
                    ),
                  ),
                  Container(
                    margin: EdgeInsets.only(top: 10),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Container(
                          padding: EdgeInsets.only(right: 20),
                          child: Text(
                            "View Profile: ",
                            style: new TextStyle(
                              fontSize: 15.0,
                              fontWeight: FontWeight.bold,
                            ),
                          ),
                        ),
                        Container(
                          child: RaisedButton(
                            child: Text(
                              "PROFILE",
                              style: new TextStyle(
                                fontSize: 14.0,
                                color: Colors.white,
                              ),
                            ),
                            color: Colors.grey[700],
                            onPressed: () {
                              /*Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => Stats()));*/
                            },
                          ),
                        ),
                      ],
                    ),
                  ),
                  Container(
                    width: 240,
                    height: 55,
                    margin: EdgeInsets.only(
                        top: MediaQuery.of(context).size.height / 12),
                    child: RaisedButton(
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(20.0),
                      ),
                      child: Text(
                        "EMERGENCY REPORT",
                        style: new TextStyle(
                          color: Colors.white,
                          fontSize: 20.0,
                        ),
                      ),
                      color: Colors.grey[700],
                      onPressed: () {
                        Navigator.push(context,
                            MaterialPageRoute(builder: (context) => EmergencyReport()));
                      },
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }

  static getAccountDetails(
      String firstName1, String lastName1, String email1, String companyName1) {
    firstName = firstName1;
    lastName = lastName1;
    email = email1;
    companyName = companyName1;
    isNewAccount = true;
  }

  static getFirstName(String nameFirst) {
    name = "Welcome back, "+nameFirst;
  }
}

2 个答案:

答案 0 :(得分:0)

您需要将StatelessWidget转换为StatefullWidget。 之后,您必须在initState方法中编写此代码

void initState() {
    super.initState();
        getName().then((){
           setState(() {
               name= "Welcome back, "+info.firstName;
           });
        });  
}

答案 1 :(得分:0)

FutureBuilder<DocumentSnapshot>(
          future: firestoreInstance.collection("Users").doc(uid).get(),
          builder: (_,snap){
          return snap.hasData ? Text(snap.data.data()["firstName"]):CircularProgressIndicator();
        },)