Flutter项目迁移空安全时创建Timer出现操作符调用及赋值错误如何解决
Flutter空安全迁移Timer可空变量自减报错解决方案
报错原因
- 第一个报错
*The method '-' can't be unconditionally invoked because the receiver can be 'null'*:因为secondsRemaining被声明为可空类型int?,Dart空安全规则禁止对可能为null的变量直接执行算术操作 - 第二个报错
*Illegal assignment to non-assignable expression*:因为!运算符返回的是不可赋值的右值,无法直接对secondsRemaining!执行自增/自减这类需要赋值的操作
解决方案
方案1(优先推荐):改为非空变量
如果业务逻辑中secondsRemaining在调用startTimer前一定会被赋值,不会出现null值,直接修改变量声明即可,无需修改其他核心逻辑:
// 将int?改为late int,声明为延迟初始化的非空整数 late int secondsRemaining; bool enableResend = false; late Timer timer; void startTimer() { timer = Timer.periodic(Duration(seconds: 1), (_) { if (secondsRemaining != 0) { setState(() { secondsRemaining--; }); } else { setState(() { enableResend = true; // 计时结束主动取消timer,避免内存泄漏 timer.cancel(); }); } }); }
方案2:保留可空类型的修正写法
如果业务确实需要secondsRemaining为可空类型,需要补全null校验,同时修改自减的写法:
int? secondsRemaining; bool enableResend = false; late Timer timer; void startTimer() { timer = Timer.periodic(Duration(seconds: 1), (_) { // 先校验非空,再判断剩余时间 if (secondsRemaining != null && secondsRemaining! != 0) { setState(() { // 正确的非空自减写法,先取值再运算赋值 secondsRemaining = secondsRemaining! - 1; }); } else { setState(() { enableResend = true; timer.cancel(); }); } }); }
内容的提问来源于stack exchange,提问作者MURALI KRISHNAN MT
相关产品推荐
相关产品推荐

