最近通过sentry平台,看到了很多奇怪的异常,有些异常甚至达到了百万级别,仔细去看才发现问题所在,报错是这样的:
_CastError
Null check operator used on a null value
change_notifier.dart in ChangeNotifier.notifyListeners at line 218
看到之后根据对应提示找到了代码,发现是notifyListeners报的,也就是说,在notifyListeners的时候,被通知的‘对象’已经被销毁了,这种情况出现的场景比较有限,博主这里出现的场景是倒计时。
那怎么解决这种奇怪的异常呢?最好的办法就是重写notifyListeners方法,然后在重写的notifyListeners中判断所要通知的widget的state的mouted状态是否是true,如果为false,则不执行,具体的操作是这样的:
void notifyListeners() {
if (widgetState.mounted) super.notifyListeners();
}
这个_pageState一定要注意了,是widget传过来的,
需要写个属性:
//xxxxxx部分是要通知的widget的类名
State<xxxxxxxxxxxx> widgetState;
//在xxxxxxxxxxxx这个widget中对widgetState传入this即可。
另外还需要注意,在setState的时候也可能会出现类似问题,也可以通过判断mounted的方式来解决:
if (mounted) {
//要处理的操作
}
//可能出现的地方为dispose的时候,setState的时候
更多异常类型请查看:异常信息汇总