flutter - Flutter:在使用 Provider 构建期间调用 setState() 或 markNeedsBuild()
问题描述
我正在ChangeNotifier
从initState()
方法调用其中一个函数,并且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
解决方案
日志消息中提到的此问题的原因是,即使在第一次构建完成之前,内部的函数initState()
正在请求重建notifyListener()
(如果我们也使用也会发生同样的情况)。setState()
解决方案是在其中添加一个addPostFrameCallback
并执行重建功能,使其仅在第一次构建小部件后执行
void initState() {
super.initState();
WidgetsBinding
.instance
.addPostFrameCallback((_){
Provider.of<MessengerRepository>(context, listen: false).setUnreadCount(0);
}
);
}
推荐阅读
- splunk - 将多个搜索组合到单值可视化的格状布局中
- pycharm - 如何在 PyCharm 中启用 Cython 代码折叠?
- pandas - 分组并加入 Pandas Dataframe 中的列
- vbscript - 将字符串转换为 CDate 格式时出现 MissMatch 错误
- jquery - 刷新或重定向后无法删除 Cookie
- python - 在 Mac OS 中将自定义 Python 模块保存在哪里?
- html5-video - 如何绕过 HTML5 视频自动播放
- javascript - Jest + React:IntersectionObserver 模拟不起作用?
- json - 如何解析动态 Json - Power Automate
- android - 设置指向将打开站点的文本视图的链接时遇到问题