首页 > 解决方案 > Flutter:在使用 Provider 构建期间调用 setState() 或 markNeedsBuild()

问题描述

我正在ChangeNotifierinitState()方法调用其中一个函数,并且notifyListener()函数内部的调用抛出 setState() or markNeedsBuild() called during build.异常

void initState(){
 Provider.of<MessengerRepository>(context, listen: false).setUnreadCount(0);
 super.initState();
}
class MessengerRepository with ChangeNotifier {
  int unreadCount;
  void setUnreadCount(int value){
     unreadCount = value;
     notifyListeners();
}

我需要调用notifyListener()内部setUnreadCount(),因为我setUnreadCount()在执行期间在多个地方调用该函数。所以不能删除notifyListener()唯一的里面initState()

使用provider版本 4.0.4

标签: flutterflutter-provider

解决方案


日志消息中提到的此问题的原因是,即使在第一次构建完成之前,内部的函数initState()正在请求重建notifyListener()(如果我们也使用也会发生同样的情况)。setState()

解决方案是在其中添加一个addPostFrameCallback并执行重建功能,使其仅在第一次构建小部件后执行

void initState() {
    super.initState();
    WidgetsBinding
     .instance
     .addPostFrameCallback((_){ 
      Provider.of<MessengerRepository>(context, listen: false).setUnreadCount(0);
     }
    );
  }

推荐阅读