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

Dan*_*ton 6 flutter

我在返回 Future 的类的末尾调用 notifyListeners() ,就在 return 语句之前。由notifyListeners发起的action在调用return和后续语句处理之前没有完全完成,导致错误。看来notifyListeners 以某种方式异步完成。

我在另一个论坛上询问了这个问题,并被告知这是一个常见的颤动错误,尤其是与动画相关的问题。在我看来,我的语法有问题的可能性更大。有没有人遇到过这个“错误”?

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

Future<bool> updateProduct(Map<String, dynamic> updatedProduct)
Run Code Online (Sandbox Code Playgroud)

...

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;
Run Code Online (Sandbox Code Playgroud)

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

Mig*_*ivo 7

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

根据官方文档

通过此函数注册的回调始终按顺序执行,并保证在其他异步事件(如计时器事件或 DOM 事件)之前运行。

只想到一个可能适合您的情况的丑陋await Future.delayed(Duration(milliseconds: 300))解决方案,即在之前运行return true,以便给它一点时间来完成其任务。

  • 谢谢,这是一个明智而富有洞察力的回应。由此我得出结论,notifyListeners() 不是一种非常可靠的实现方式,这相当令人失望。我想知道这种方式是否有好处,或者是否有任何计划来“修复”它。我试图了解何时以及为什么应该使用notifyListeners(),以及更可靠的替代方案可能是什么。这似乎是一个根本性的问题,我无法想象不一直遇到这个问题。再次感谢您,您的回答100%符合目标。任何进一步的建议将不胜感激。 (4认同)

Rém*_*let 5

不可以。同步调用的唯一方法.then是使用SynchronousFuture,它是 future 的自定义重新实现。

如果不是,则即使 future 立即完成,该调用也是异步的。