Home > Software design >  BoxPainter createBoxPainter([onChanged]) => The parameter onChanged can't have a value of nu
BoxPainter createBoxPainter([onChanged]) => The parameter onChanged can't have a value of nu

Time:10-26

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