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

我在即将返回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()调用所有已注册的侦听器来调度微任务,因此它们实际上将异步运行。

根据官方文件

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

唯一想到的是一个可能适合您的情况的 丑陋 解决方案,该解决方案是运行await

Future.delayed(Duration(milliseconds: 300))之前return true,以便给它一点时间来完成其任务。

以上是 notifyListeners()有时是否异步完成? 的全部内容, 来源链接: utcz.com/qa/428519.html

回到顶部