什么时候应该使用异步等待,什么时候应该在扑打中使用?

时间:2019-06-14 04:32:45

标签: asynchronous flutter dart

对于何时应该使用哪种感到困惑?有什么区别?

async await会在执行完之后才执行函数中的下一行代码吗?它是否会退出函数的一般顺序?如果是,then的作用是什么?

如果我想确保在调用该方法以获取值之前已做完一些事情,以便它不会返回应该使用的空值?

例如,我想从数据库中获取信息,然后在屏幕加载后立即为该数据设置一个变量,因此我在initState()内进行定义,

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

  }

getInfoasync的功能,我尝试了一下,但是最终发生的事情是它先以某种方式打印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");
          }

        });

      }

1 个答案:

答案 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