7

This should be an easy answer but I do not find the solution yet on the internet.

Let say I have 1 VoidCallback field name onStart in a constructor, and I want this field to have a default value when there is no parameter pass it to the constructor. I already try some code but the IDE gives me a warning. How to provide this default value?

class DefaultCallbackExample {
  final VoidCallback onStart;
  final VoidCallback onFinish;
  final bool isEnable;

  DefaultCallbackExample({
    this.onStart = (() => {}), // IDE Warning
    required this.onFinish,
    this.isEnable = true,
  });
}
class DefaultCallbackExample {
  final VoidCallback onStart;
  final VoidCallback onFinish;
  final bool isEnable;

  DefaultCallbackExample({
    this.onStart = const (() => {}), // IDE Warning
    required this.onFinish,
    this.isEnable = true,
  });
}

There is a solution from jamesdin, but I hope there is a simpler solution not to have to write constant sentinel value. Maybe in the future dart version, there is a possible solution

4
  • Why did you wrap ( ) => in ( )? Commented Aug 8, 2021 at 12:25
  • If I'm not wrapping it, it still not working Commented Aug 8, 2021 at 12:26
  • You should let it be null, and then where you want to call it: onStart?.call(); This way you won’t get an exception when no value is passed in. Commented Aug 8, 2021 at 12:28
  • Yes, I can do that, but I don't want it to be null. Commented Aug 8, 2021 at 12:29

2 Answers 2

10

Either the callback should be nullable or it must be initialized with a default value. Default arguments must be constants, so as usual, if you can't provide a constant directly, use a constant sentinel value:

class DefaultCallbackExample {
  final VoidCallback onStart;
  final VoidCallback onFinish;
  final bool isEnable;

  DefaultCallbackExample({
    VoidCallback? onStart,
    required this.onFinish,
    this.isEnable = true,
  }) : onStart = onStart ?? (() {});
}

Also note that () => {} creates an anonymous function that returns an empty Set. An anonymous function with an empty body should be just () {}. Function bodies either should use => (if possible) or curly braces, but not both.

Sign up to request clarification or add additional context in comments.

3 Comments

Yes I know this solution, but I hope there is a simple similar like this code this.onStart = const (() => {})
If you're unwilling to create a named function, then no. You can't use const with a lambda, and Function is an abstract class without a const constructor.
1

Create a static method that will be the default value of the function in your class.

class Class{
  final Function function;
  Class({this.function = _defaultFunction});
  static _defaultFunction() {}
}

1 Comment

This solution work, but I think it's a little bit ugly.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.