簡體   English   中英

為什么它不運行等待

[英]Why isn't it run await

print(2);
print(_emailTaken);
print(2);
await isRegister(emailController.value.text);
print(3);
print(_emailTaken);
print(3);

和我的 isRegister 方法

Future<void> isRegister(String email) async {
    fireStore.collection('Users').doc(email).get().then((DocumentSnapshot ds) {
      print(1);
      print(ds.exists);
      print(1);
      _emailTaken = ds.exists;
    });
  }

但是 output 是

我/撲 (20531): 2

我/顫動(20531):假

我/撲 (20531): 2

我/撲 (20531): 3

我/顫動(20531):假

我/撲 (20531): 3

我/撲 (20531): 1

我/撲 (20531): 是的

我/撲 (20531): 1

為什么不在 await 語法中等待?

您不是在等待 get inside 注冊 function。因此要修復它,請將其更改為以下內容:

Future<void> isRegister(String email) async {
   await  fireStore.collection('Users').doc(email).get().then((DocumentSnapshot ds) {
      print(1);
      print(ds.exists);
      print(1);
      _emailTaken = ds.exists;
    });
  }

要么:

Future<void> isRegister(String email) {
   return fireStore.collection('Users').doc(email).get().then((DocumentSnapshot ds) {
      print(1);
      print(ds.exists);
      print(1);
      _emailTaken = ds.exists;
    });
  }
print(2);
print(_emailTaken);
print(2);
await isRegister(emailController.value.text);
print(3);
print(_emailTaken);
print(3);

和我的 isRegister 方法

Future<void> isRegister(String email) async {
    fireStore.collection('Users').doc(email).get().then((DocumentSnapshot ds) {
      print(1);
      print(ds.exists);
      print(1);
      _emailTaken = ds.exists;
    });
  }

但 output 是

我/顫振(20531):2

我/顫動(20531):假

我/顫振(20531):2

我/顫振(20531):3

我/顫動(20531):假

我/顫振(20531):3

我/顫振(20531):1

我/顫振(20531):真

我/顫振(20531):1

為什么不在 await 語法中等待?

您也可以返回Future ,而不是像 Kishan 建議的那樣在您的isRegisterawaiting

Future<bool> isRegister(String email) {
  return fireStore
      .collection('Users')
      .doc(email)
      .get()
      .then((DocumentSnapshot ds) => _emailTaken = ds.exists);
}

注意:一個額外的好處是isRegister的返回現在是Future<bool> 結果仍然緩存在_emailTaken中以供將來參考,但也由您的方法直接返回。

return的最小工作示例:

bool x = false;

Future<bool> _fetchData() {
  return Future.delayed(Duration(seconds: 1)).then((_) => x = true);
}

Future<void> main() async {
  print('1. $x');
  print('2. ${await(_fetchData())}');
  print('3. $x');
  await Future.delayed(Duration(seconds: 1));
  print('4. $x');
}

結果是:

1. false
2. true
3. true
4. true

沒有return的最小工作示例:

bool x = false;

Future<void> _fetchData() async {
  Future.delayed(Duration(seconds: 1)).then((_) => x = true);
}

Future<void> main() async {
  print('1. $x');
  await(_fetchData());
  print('3. $x');
  await Future.delayed(Duration(seconds: 1));
  print('4. $x');
}

結果是:

1. false
3. false
4. true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM