Flutter重写createBoxPainter空安全报错的正确语法是什么?
Flutter空安全下自定义Decoration的createBoxPainter正确写法
问题场景
自定义Decoration类时,初始代码如下:
class FrameDecoration extends Decoration { @override BoxPainter createBoxPainter([onChanged]) { return _CustomDecorationPainter(); } }
编译触发以下问题:
- 空安全模式下(项目pubspec.yaml的sdk配置为
sdk: ">=2.12.0 <3.0.0"),onChanged参数未显式声明类型,隐式默认值为null不符合空安全要求,编译器提示需添加非空默认值或required修饰符 - 为参数添加required修饰符后,触发重写非法报错:
'FrameDecoration.createBoxPainter' 不是 'Decoration.createBoxPainter' 的合法重写,方法签名不匹配 - 完全省略参数、传空参数列表均无法解决问题
正确解决方案
重写方法时显式声明onChanged参数为可选可空类型即可,写法如下:
@override BoxPainter createBoxPainter([VoidCallback? onChanged]) { return _CustomDecorationPainter(); }
说明
- 父类
Decoration的createBoxPainter方法的onChanged参数本身就是可选可空类型,重写时必须保持签名完全一致 - 若自定义的Painter不会发生状态变更、不需要触发重绘,
onChanged参数可以直接忽略,无需传递给Painter实例
内容的提问来源于stack exchange,提问作者paulsm4
相关产品推荐
相关产品推荐

