Flutter中将可空int?转为int类型传入Duration的实现方法
可空int值传入Duration构造方法的解决方案
问题背景
通过SharedPreferences类的getInt()方法获取到的是int?可空类型值,但Duration构造方法要求传入非空int类型参数,直接传参会触发类型错误,问题代码如下:
int? duration = ParametersHelper.getDuration(); Future.delayed(const Duration(milliseconds: duration)); // ParametersHelper类getDuration方法实现 static int? getDuration() { return _pref.getInt("Duration"); }
注意:只要Duration的参数依赖运行时读取的SharedPreferences值,就不能给Duration加
const修饰符——const要求所有传入参数都是编译期即可确定的常量值。
可选处理方案
- 空值合并运算符
??设置兜底默认值(最推荐)
用??指定null场景下的默认时长,保证传入参数永远非空,适配绝大多数业务场景,你可以根据业务需求调整默认时长数值:int? duration = ParametersHelper.getDuration(); // 示例兜底为500毫秒,可自行替换 Future.delayed(Duration(milliseconds: duration ?? 500)); - 空断言
!强制转换非空(谨慎使用)
如果你能100%保证业务流程中一定会提前写入Duration配置,getDuration()永远不会返回null,可以用!标记告知编译器该值非空。但如果实际运行时拿到null,会直接触发空指针崩溃,没有特殊把握不要用:int? duration = ParametersHelper.getDuration(); Future.delayed(Duration(milliseconds: duration!)); - 提前判空走分支逻辑
如果null场景下不需要执行延迟逻辑,可以提前做判空分支处理,从根源避免非法传参:int? duration = ParametersHelper.getDuration(); if (duration != null) { Future.delayed(Duration(milliseconds: duration)); // 正常延迟后执行的逻辑 } else { // 配置缺失的兜底逻辑:比如直接执行目标逻辑、上报配置异常日志等 }
内容的提问来源于stack exchange,提问作者franzi98
相关产品推荐
相关产品推荐

