Flutter:在使用 Provider 构建期间调用 setState() 或 markNeedsBuild()

Kri*_* CN 3 flutter flutter-provider

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

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

我需要调用notifyListener()内部setUnreadCount(),因为我setUnreadCount()在执行过程中在多个地方调用该函数。所以无法删除notifyListener()里面唯一的initState()

使用provider4.0.4版本

Kri*_* CN 7

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

解决方案是添加一个addPostFrameCallback并在其中执行重建函数,以便它仅在第一次构建小部件后执行

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