我正在尝试设置基本用户注册,登录,编辑个人资料,查看个人资料页面。目前,注册,登录和编辑配置文件工作正常,我可以写到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, ))
但是,文本始终在屏幕上显示为空,我理解发生了什么,但我不知道如何解决。我已经尝试过围绕使事情变得不异步或至少尝试的事情进行切换,但我无法弄清楚。请不要删除我的帖子,香港专业教育学院环顾四周,这个问题是我的代码所特有的,我真的不知道该如何解决,我只是不想浪费更多的时间。
答案 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();
// ..
}