【问题标题】:How can I wait for a method that doesn't return a Future?如何等待不返回 Future 的方法?
【发布时间】:2021-10-18 23:48:01
【问题描述】:

我正在使用无法修改的现有模型类在应用程序中构建屏幕。该模型有一个名为 refreshList() 的方法,该方法从 API 获取一些数据,对其进行处理,最后使用获取的数据更新模型中的 List 成员。

我想知道列表的状态 - 即它是未初始化、正在获取还是已获取 - 以便我可以相应地更新 UI。

问题是refreshList()不是async,而是在内部使用async方法。此外,内部方法不返回Future

void refreshList(){
    if( someCondition ){
        _doRefreshList();
    }
}

void _doRefreshList() async{
    // ... do stuff 

    http.Response response = await http.get(url);

    // ... do some more stuff
}

我想做类似的事情

setState((){ _isLoading = true; });
await model.refreshList(); 
setState((){ _isLoading = false; });

但不幸的是,我无法修改模型中的方法以返回 Future

有什么方法可以在不修改refreshList()async 并返回Future 并修改_doRefreshList() 以返回Future 的情况下实现此目的?

【问题讨论】:

  • 你为什么不直接做async?我怀疑还有其他方法。
  • 你可以使用 Completer 来强制方法返回一个 Future

标签: asynchronous dart flutter async-await dart-async


【解决方案1】:

不,没有办法等待异步操作完成,除非 提供了某种方法来在完成时获取回调。 通常的方法是返回一个未来。有一个回调函数参数是另一种方法,但它很少比只返回一个未来更好。

在您的示例中,refreshVerList 无法报告何时完成,_doRefreshList 也没有。您必须以某种方式添加,返回未来是解决这两个函数问题的最简单和最一致的方法。

(从技术上讲,_doRefreshList 函数确实会返回一个未来,它只是输入为void。您可以将该未来转换为Future,但我强烈不鼓励这种恶作剧。如果函数作者稍后决定返回其他内容,比如null,他们完全有权这样做,因为返回类型是void。)

【讨论】:

    【解决方案2】:

    您可以使用 Completer。

    Completer<Null> onFetchCompleter;
    
     Future<Null> _doRefreshList() async{
     onFetchCompleter = Completer();
    // ... do stuff 
    
     http.Response response = await http.get(url);
    
    // ... do some more stuff
     onFetchCompleter.complete();
    
     return onFetchCompleter.future;
    }
    

    以同样的方式,您可以在 refreshVerList 方法中使用完成者。

    【讨论】:

      【解决方案3】:

      使用函数引用作为参数创建Future

      Future(model.refreshList); 
      

      现在您可以使用await,因为上面为您提供了Future&lt;void&gt;

      setState(() { _isLoading = true; });
      await Future(model.refreshList);
      setState(() { _isLoading = false; });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 2022-01-13
        • 2016-09-12
        相关资源
        最近更新 更多