一尘不染

notifyListeners()有时是否异步完成?

flutter

我在即将返回Future的类的末尾调用notifyListeners(),就在return语句之前。由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()启动的代码。


阅读 805

收藏
2020-08-13

共1个答案

一尘不染

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

根据官方文件

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

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

2020-08-13