Dart でデフォルト引数を使う

Dart でデフォルト引数を使いたくて、こんな感じで書いてみると The default value of an optional parameter must be constant. というエラーが出てしまう。

class HogeClass {
  // The default value of an optional parameter must be constant.
  HogeClass({Object object = Object()}) : _object = object;

  final Object _object;
}

どうやら const しかデフォルト引数に持てないっぽい。でも工夫すればデフォルト引数っぽいことは可能になる。

nullable で引数を設定する

nullable で引数を設定して、引数が null だったらクラス側で Object() を作っている。これで実質デフォルト引数と同じことができる。

class HogeClass {
  HogeClass({Object? object}) : _object = object ?? Object();

  final Object _object;
}

final hogeClass1 = HogeClass();
final hogeClass2 = HogeClass(object: Object());

これは Class のコンストラクタだが、メソッドでも同様のことができる。

たまに HogeClass({Object? object}) : _object = Object();と書いてしまって引数が設定されないが? とミスることがあるので注意。

Named constructor を使う (コンストラクタのみ)

https://dart.dev/guides/language/language-tour#named-constructors

Named constructor を利用することで複数のコンストラクタを用意できる。

class HogeClass {
  HogeClass(this._object);

  HogeClass.noArgs() : _object = Object();

  final Object _object;
}

var hogeClass1 = HogeClass(Object());
var hogeClass2 = HogeClass.noArgs();

この書き方だとコンストラクタで何か処理をする場合、2箇所に処理を書かなければならなくなる。

class HogeClass {
  HogeClass(this._object) {
    print(_object);
  }

  HogeClass.noArgs() : _object = Object() {
    print(_object);
  }

  final Object _object;
}

おわり

2箇所に処理を書きたくないので nullable を使ってデフォルト引数を利用するのが良さそう。