flutter 等待条件满足,然后再继续其余代码

问题描述 投票:0回答:5

我需要我的异步函数等待某些表达式进行验证(例如 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 后再继续执行吗? 谢谢你

flutter dart
5个回答
13
投票

你可以做这样的事情。

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
投票

您可以使用三种方式进行异步/等待:-

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');
}

2
投票

您可以将“x”设为 Completer,而不是将其设为布尔值。

x = true
替换为
x.complete()
x = false
x = Completer()

你写的函数会变成这样:

var x = Completer();

someFunction() async {

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

   // continue with executing this func
}

0
投票

这是我的解决方案:

 Future<bool> waitForCondition(bool Function() condition,
  {Duration checkInterval = const Duration(milliseconds: 200),
  Duration timeout = const Duration(seconds: 30)}) async {
bool response = true;
bool done = false;
Future.delayed(
  timeout,
  () {
    response = false;
    done = true;
  },
);
while (!condition()) {
  await Future.delayed(checkInterval);
  if (done) {
    break;
  }
}
return response;

}


-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();
© www.soinside.com 2019 - 2024. All rights reserved.