【问题标题】:flutter await for condition to fulfill before continue with rest of code在继续其余代码之前颤动等待条件满足
【发布时间】:2019-12-24 04:12:28
【问题描述】:

在继续执行其余代码之前,我需要我的异步函数等待某个表达式进行验证(例如 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


    【解决方案1】:

    你可以这样做。

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

      【讨论】:

        【解决方案3】:

        这样的?

        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();
        

        【讨论】:

        • 很好,但不是我想要的,我编辑了我的问题以使其更简单
        • 对于简单的情况,更好的方法是在此处使x 成为真正的全局变量,由您的其他函数设置,然后在此处反映更改。或者你可以使用流
        猜你喜欢
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 2019-05-05
        • 2011-11-01
        • 1970-01-01
        • 2022-06-15
        • 2011-04-24
        • 1970-01-01
        相关资源
        最近更新 更多