Flutter报错copyWith无法无条件调用,接收方可能为null,如何解决?
报错触发原因
这个报错是Flutter空安全机制的编译拦截:
你代码中用到的Theme.of(context).textTheme.headline4属于可空类型,Flutter官方的主题规范中,并没有强制要求所有textTheme的文本样式属性都必须赋值,当你当前应用的主题没有为headline4配置对应样式时,这个属性的返回值就为null。
空安全规则不允许直接对可能为null的对象调用方法,所以你直接调用.copyWith()方法时就会触发这个报错。
可行的解决办法
空感知运算符+默认值兜底(最推荐)
用?.做非空判断,再用??给空场景设置默认样式,既保证不会触发空异常,也能兼容主题配置存在/不存在两种场景,示例代码:style: Theme.of(context) .textTheme .headline4 ?.copyWith(color:Colors.white) ?? const TextStyle(color: Colors.white)非空断言(仅适用于确定
headline4一定不为空的场景)
如果你已经在全局主题配置中明确设置了headline4的样式,可以直接加!强制声明该属性不为空,示例代码:style: Theme.of(context) .textTheme .headline4! .copyWith(color:Colors.white)注意:如果实际运行时
headline4为null,会直接抛出空指针异常。不依赖主题样式直接自定义
如果你的文本样式不需要跟随全局主题变化,可以直接声明自定义TextStyle,完全避免空问题,示例代码:style: const TextStyle( fontSize: 34, fontWeight: FontWeight.w400, color: Colors.white )提前判空处理
适合需要针对空情况做更多自定义逻辑的场景,示例代码:TextStyle? customStyle = Theme.of(context).textTheme.headline4; if(customStyle != null){ customStyle = customStyle.copyWith(color: Colors.white); }else{ customStyle = const TextStyle(color: Colors.white, fontSize: 34); } // 后续直接使用customStyle即可
内容的提问来源于stack exchange,提问作者leauradmin
相关产品推荐
相关产品推荐

