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

NM Naufaldo
  • 1,032
  • 1
  • 12
  • 30

2 Answers2

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.

jamesdlin
  • 81,374
  • 13
  • 159
  • 204
  • Yes I know this solution, but I hope there is a simple similar like this code `this.onStart = const (() => {})` – NM Naufaldo Aug 08 '21 at 16:52
  • 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. – jamesdlin Aug 08 '21 at 16:57
  • @NMNaufaldo See https://github.com/dart-lang/language/issues/1048. – jamesdlin Aug 08 '21 at 17:08
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() {}
}
C. Skjerdal
  • 2,750
  • 3
  • 25
  • 50
Andrej
  • 2,743
  • 2
  • 11
  • 28