Flutter 构造函数中的 VoidCallback 字段默认值

NM *_*ldo 7 constructor dart flutter

这应该是一个简单的答案,但我尚未在互联网上找到解决方案。

假设我在构造函数中有 1 个VoidCallback字段名称onStart,并且当没有参数将其传递给构造函数时,我希望该字段具有默认值。我已经尝试了一些代码,但 IDE 给了我一个警告。如何提供这个默认值?

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

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

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

jamesdin有一个解决方案,但我希望有一个更简单的解决方案,不必编写constant sentinel value。也许在未来的dart版本中,有一个可能的解决方案

jam*_*lin 10

回调应该可以为 null,或者必须使用默认值进行初始化。默认参数必须是常量,因此像往常一样,如果无法直接提供常量,请使用常量哨兵值:

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

  DefaultCallbackExample({
    VoidCallback? onStart,
    required this.onFinish,
    this.isEnable = true,
  }) : onStart = onStart ?? (() {});
}
Run Code Online (Sandbox Code Playgroud)

另请注意,() => {}创建一个返回空的匿名函数Set。具有空函数体的匿名函数应该只是() {}. 函数体应该使用=>(如果可能)或花括号,但不能同时使用两者。


And*_*rej 1

创建一个静态方法,该方法将作为类中函数的默认值。

class Class{
  final Function function;
  Class({this.function = _defaultFunction});
  static _defaultFunction() {}
}
Run Code Online (Sandbox Code Playgroud)