notifyListeners()有时会异步完成吗?

时间:2018-12-27 13:15:22

标签: flutter

我要在类的结尾处调用notifyListeners(),该类将在返回语句之前返回Future。由notifyListeners发起的操作在调用返回和处理后续语句之前未完全完成,从而导致错误。看来notifyListeners是以某种方式异步完成的。

我在另一个论坛上问了这个问题,并被告知这是一个常见的抖动错误,尤其是在动画方面。在我看来,我的语法有可能做错了。有人遇到过这个“错误”吗?

我尝试同时使用.then()和async / await。两者都有相同的结果。

Future<bool> updateProduct(Map<String, dynamic> updatedProduct)

...

return http
    .put(
        'https://chocolate-f3e81.firebaseio.com/products/${newProduct.serverID}.json',
        body: json.encode(newProductMap))
    .then<bool>((http.Response response) {
  if (response.statusCode == 200 || response.statusCode == 201) {
    _products[selectedProductIndex] = newProduct;
    setIsLoading(false);
    print('model selectedProductIndex ${selectedProductIndex}');
    print('model selectedProductServerID ${_selectedProductServerID}');
     notifyListeners();
    return true;

我希望由notifyListeners()启动的所有操作在“返回true”之前完成。不会发生这种情况,而是要执行返回操作,并且其他代码将继续执行,并领先于notifyListeners()启动的代码。

2 个答案:

答案 0 :(得分:1)

不。同步调用.then的唯一方法是使用SynchronousFuture,这是对将来的自定义重新实现。

如果不是,那么即使将来立即完成,调用也是异步的。

答案 1 :(得分:0)

实际上,notifyListeners()实际上将异步运行,因为它通过使用scheduleMicrotask()来调用所有已注册的侦听器来调度微任务。

根据official documentation

  

通过此功能注册的回调始终在   并保证在其他异步事件(例如   计时器事件或DOM事件。

仅记住一个可能适用于您的情况的 ugly 解决方案,该解决方案是在await Future.delayed(Duration(milliseconds: 300))之前运行return true,以便给它一些时间。完成任务。