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
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)