Flutter等待条件满足后再继续执行其余代码。

13
我需要我的异步函数在继续执行其余代码之前等待一些表达式进行验证(例如 x == true)。
目前我正在使用类似以下的 while 循环:
var x = false;

someFunction() async {

   // here I want to await for 
   // as long as it takes for x to become true

   while(!x) {
       await new Future.delayed(new Duration(milliseconds: 250));
   }

   // i put 250 millisecond intentional delay 
   // to protect process from blocking.
   // x is to be set true by external function
   // rest of code ...
}

await someFunction();

你认为在执行之前等待 x 变为 true 的更好方法是什么?谢谢。

4个回答

12

你可以做类似于这样的事情。

Future<void> _waitUntilDone() async {
    final completer = Completer();
    if (_loading) {
      await 200.milliseconds.delay();
      return _waitUntilDone();
    } else {
      completer.complete();
    }
    return completer.future;
  }

或者更好的是

var completer;

Future<void> _waitUntilDone() async {
  completer = Completer();
  return completer.complete();
}

void done() {
  if (completer)
    completer.complete();
}
在完成调用时,我们也可以发出一些值。

2

不需要将 'x' 定义为布尔型,可以将其定义为 Completer。

x.complete() 代替 x = true,用 x = Completer() 代替 x = false

你编写的函数将变成这样:

var x = Completer();

someFunction() async {

   // waiting for x to complete
   await x.future;

   // continue with executing this func
}

2
您可以使用三种方式来使用async/await:-
void method1(){
  List<String> myArray = <String>['a','b','c'];
  print('before loop');
  myArray.forEach((String value) async {
    await delayedPrint(value);
  });  
  print('end of loop');
}

void method2() async {
  List<String> myArray = <String>['a','b','c'];
  print('before loop');
  for(int i=0; i<myArray.length; i++) {
    await delayedPrint(myArray[i]);
  }
  print('end of loop');
}

Future<void> delayedPrint(String value) async {
  await Future.delayed(Duration(seconds: 1));
  print('delayedPrint: $value');
}

-1

像这样的东西?

delayed() async {
  await Future.delayed(Duration(seconds: 2));// or some time consuming call
  return true;
}

somefn() async{
    var x = await delayed();
    print(x);// gives true
}
somefn();

很不错,但不完全是我想要的,我编辑了我的问题以使其更直白。 - Rami Ibrahim
对于简单情况来说,更好的方法是将 x 定义为真正的全局变量,在其他函数中设置它,然后在这里反映出更改。或者您可以使用流。 - Doc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接