I've copied/pasted some sample code for creating a custom BoxDecoration:
class FrameDecoration extends Decoration {
@override
BoxPainter createBoxPainter([onChanged]) {
return _CustomDecorationPainter();
}
I get this error:
The parameter 'onChanged' can't have a value of 'null' because of its type, but the implicit default value is 'null'.
Try adding either an explicit non-null default value or the 'required' modifier.
OK, that makes sense: it's a null safety issue. My pubspec.yaml "environment": sdk: ">=2.12.0 <3.0.0"
So I try adding "required":
class FrameDecoration extends Decoration {
@override
BoxPainter createBoxPainter(required [onChanged]) {
return _CustomDecorationPainter();
}
This time the error is:
'FrameDecoration.createBoxPainter' ('BoxPainter Function(void Function())'] isn't a valid override of 'Decoration.createBoxPainter' ('BoxPainter Function('void Function()])').
I tried several other things - no joy.
Both messages also say:
The onChanged argument ... can be omitted if there is no change that the painter will change.
I tried "no parameters" ("createBoxPainter()"), and I tried an empty list ("createBoxPainter([])"). Still no joy.
All I want is to create my own "Decoration" class, with a custom "paint()" method.
Q: What's the correct syntax for omitting onChanged from createBoxPainter()?
Q: What's the recommended syntax for "createBoxPainter()" in this example?
pedro pimont gave me the syntax I was lookingfor:
@override
BoxPainter createBoxPainter([VoidCallback? onChanged]) {
return _CustomDecorationPainter();
}
// <= Explicitly adding the type, and making it nullable, resolved the compile error
CodePudding user response:
The createBoxPainter
from the Decoration
class you're trying to override takes an optional VoidCallback onChanged
parameter so if you don't provide it with a default value, you must also mark it as nullable using ?
, try this:
BoxPainter createBoxPainter([VoidCallback? onChanged])
Also, although none of these below will work, regarding the Dart syntax, you're marking an optional parameter as required, this is not allowed.
Either use a named parameter to use the required keyword using {}
:
BoxPainter createBoxPainter({required Function onChanged})
Or make it required by removing []
BoxPainter createBoxPainter(Function onChanged)