2

我复制/粘贴了一些用于创建自定义 BoxDecoration 的示例代码:

class FrameDecoration extends Decoration {
  @override
  BoxPainter createBoxPainter([onChanged]) {
    return _CustomDecorationPainter();
  }
  

我收到此错误:

参数“onChanged”因其类型而不能具有“null”值,但隐含的默认值为“null”。

尝试添加显式的非空默认值或“必需”修饰符。

好的,这是有道理的:这是一个零安全问题。我的 pubspec.yaml “环境”:sdk: ">=2.12.0 <3.0.0"

所以我尝试添加“必需”:

class FrameDecoration extends Decoration {
  @override
  BoxPainter createBoxPainter(required [onChanged]) {
    return _CustomDecorationPainter();
  }

这次的错误是:

'FrameDecoration.createBoxPainter' ('BoxPainter Function(void Function())'] 不是 'Decoration.createBoxPainter' ('BoxPainter Function('void Function()])') 的有效覆盖。

我尝试了其他几件事 - 没有快乐。

两条消息还说:

onChanged 参数 ... 如果没有画家会改变的变化,则可以省略。

我尝试了“无参数”(“createBoxPainter()”),并尝试了一个空列表(“createBoxPainter([])”)。仍然没有喜悦。

我想要的只是使用自定义的“paint()”方法创建自己的“装饰”类。

问:从 createBoxPainter() 中省略 onChanged 的​​正确语法是什么?

问:本例中“createBoxPainter()”的推荐语法是什么?


pedro pimont 给了我我正在寻找的语法:

 @override
 BoxPainter createBoxPainter([VoidCallback? onChanged]) {
   return _CustomDecorationPainter();
 }
 // <= Explicitly adding the type, and making it nullable, resolved the compile error
4

1 回答 1

2

您尝试覆盖的类中的 接受一个可选参数createBoxPainter,因此如果您不为其提供默认值,您还必须使用将其标记为可空,试试这个:DecorationVoidCallback onChanged?

BoxPainter createBoxPainter([VoidCallback? onChanged])

此外,尽管以下这些都不起作用,但关于 Dart 语法,您将可选参数标记为必需,这是不允许的。

使用命名参数来使用所需的关键字{}

BoxPainter createBoxPainter({required Function onChanged})

或者通过删除使其成为必需[]

BoxPainter createBoxPainter(Function onChanged)
于 2021-10-25T20:47:08.283 回答