我要在类的结尾处调用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()启动的代码。
答案 0 :(得分:1)
不。同步调用.then
的唯一方法是使用SynchronousFuture,这是对将来的自定义重新实现。
如果不是,那么即使将来立即完成,调用也是异步的。
答案 1 :(得分:0)
实际上,notifyListeners()
实际上将异步运行,因为它通过使用scheduleMicrotask()
来调用所有已注册的侦听器来调度微任务。
通过此功能注册的回调始终在 并保证在其他异步事件(例如 计时器事件或DOM事件。
仅记住一个可能适用于您的情况的 ugly 解决方案,该解决方案是在await Future.delayed(Duration(milliseconds: 300))
之前运行return true
,以便给它一些时间。完成任务。