我在即将返回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()启动的代码。
实际上,notifyListeners()由于它将通过scheduleMicrotask()调用所有已注册的侦听器来调度微任务,因此它们实际上将异步运行。
notifyListeners()
scheduleMicrotask()
根据官方文件
通过此函数注册的回调始终按顺序执行,并保证在其他异步事件(如Timer事件或DOM事件)之前运行。
唯一想到的是一个可能适合您的情况的 丑陋 解决方案,该解决方案是运行await Future.delayed(Duration(milliseconds: 300))之前return true,以便给它一点时间来完成其任务。
await Future.delayed(Duration(milliseconds: 300))
return true