对于何时应该使用哪种感到困惑?有什么区别?
async await
会在执行完之后才执行函数中的下一行代码吗?它是否会退出函数的一般顺序?如果是,then
的作用是什么?
如果我想确保在调用该方法以获取值之前已做完一些事情,以便它不会返回应该使用的空值?
例如,我想从数据库中获取信息,然后在屏幕加载后立即为该数据设置一个变量,因此我在initState()
内进行定义,
@override
void initState() {
// TODO: implement initState
super.initState();
currentUser= new User();
currentUser.getInfo().then((_) =>setState(() { bio = currentUser.getBio(); print(bio); }));
}
getInfo
是async
的功能,我尝试了一下,但是最终发生的事情是它先以某种方式打印null,然后再打印实际的bio,这是从getinfo方法内部调用的。如何切换订单?
更新: 这是用户类:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
class User {
final _firestore = Firestore.instance;
final _auth= FirebaseAuth.instance;
FirebaseUser loggedInUser;
String displayName;
String email;
String bio;
String photoUrl;
Future<void> getCurrentUser() async{
try{
final user= await _auth.currentUser();
if(user!=null){
loggedInUser=user;
email=loggedInUser.email;
}}
catch(e){
print(e);
}
}
Future<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");
}
});
}
User({String bio,String displayName}){
if(bio!=null){
this.bio= bio;
print(this.bio);
}
if(displayName!=null){
this.displayName = displayName;
}
}
void updateData({String bio, String displayName}){
if(bio!=null){
this.bio=bio;
print(this.bio);
}
if(displayName!=null){
this.displayName=displayName;
}
_firestore.collection('users').document('$email').setData({
'bio':this.bio,
'displayName':this.displayName
});
}
String getBio(){
return bio;
}
}
更新:
已将getinfo更改为此,并且现在可以正常使用了,但是并没有真正了解为什么:
Future<void> getInfo() async {
await getCurrentUser();
DocumentReference documentReference =
_firestore.collection("users").document("$email");
await 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");
}
});
}
答案 0 :(得分:0)
await
是只能在async
方法中使用的关键字。
then()
是一种方法。
示例:
Future<void> A() async {
await Future.delayed(_duration);
print("A");
}
void B() {
print("B");
}
void C() {
print("C");
}
有等待
void withAwait() async {
await A();
B();
C();
}
/// Print A, B, C respectively
与然后
void withThen() {
A().then((_) => B());
C();
}
/// Print C, A, B respectively
void withThen2() {
A().then((_) {
B();
C();
});
}
/// Print A, B, C respectively