Dart/Flutterのnull安全エラー「パラメータにnullを指定できません」の解決方法
Dartのnull安全機能を導入すると、パラメータがnullになる可能性がある場合にコンパイルエラーが発生します。この記事では、よく遭遇する「The parameter can't have a value of 'null' because of its type」エラーの原因と解決方法について詳しく説明します。
問題の原因
null安全が有効になっている場合、非null型(int
やKey
など)のパラメータは決してnullであってはならないという制約があります。
以下のコード例では、名前付きパラメータfactor
とkey
がnullになる可能性があるためエラーが発生します:
// エラーが発生する例
void calculate({int factor}) {
// ...
}
class Foo extends StatelessWidget {
const Foo({Key key}) : super(key: key);
// ...
}
このエラーは、関数がcalculate()
やFoo()
のようにパラメータを指定せずに呼び出された場合、パラメータがnullになってしまう可能性があるため発生します。
解決方法
この問題を解決するには、主に3つの方法があります。
1. required
キーワードを使用する
パラメータが必須であることを示す場合に使用します。最も一般的な解決方法です。
// 関数の場合
void calculate({required int factor}) {
// ...
}
// Widgetの場合
class Foo extends StatelessWidget {
const Foo({required Key key}) : super(key: key);
// ...
}
TIP
required
キーワードを使用すると、そのパラメータを指定せずに関数やコンストラクタを呼び出すとコンパイルエラーになります。
2. デフォルト値を設定する
パラメータが省略された場合に使用するデフォルト値を設定します。
// 関数の場合
void calculate({int factor = 42}) {
// ...
}
// Widgetの場合(Keyにデフォルト値を設定)
class Foo extends StatelessWidget {
const Foo({Key key = const Key("default_key")}) : super(key: key);
// ...
}
3. パラメータをnullableにする
パラメータがnullでも良い場合に、型をnullableにします。FlutterのWidgetでkeyを常に指定しない場合などに有用です。
// 関数の場合
void calculate({int? factor}) {
if (factor != null) {
// nullチェックして使用
}
}
// Widgetの場合(よく使われるパターン)
class Foo extends StatelessWidget {
const Foo({Key? key}) : super(key: key);
// ...
}
WARNING
nullableなパラメータを使用する場合、使用前にnullチェックを行う必要があります。
Flutter Widgetでの実践的な例
FlutterでWidgetを作成する際の一般的なパターン:
class MyHomePage extends StatefulWidget {
// requiredで必須パラメータに、Keyはnullableに
const MyHomePage({
Key? key,
required this.title
}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
位置パラメータの場合
名前付きパラメータだけでなく、位置パラメータでも同様の考慮が必要です:
// 非nullableな位置パラメータ
void foo(int param1) {} // foo(null) は無効
// nullableな位置パラメータ
void bar(int? param1) {} // bar(null) は有効
位置パラメータは常に必須であるため、required
キーワードやデフォルト値は使用できません。
まとめ
Dartのnull安全機能は実行時のnullエラーを防ぐ強力な仕組みです。パラメータがnullになる可能性がある場合、以下のいずれかの方法で対処しましょう:
- 必須パラメータ →
required
キーワードを使用 - オプションパラメータ(デフォルト値あり) → デフォルト値を設定
- オプションパラメータ(null許容) → nullable型(
Type?
)を使用
これらの方法を適切に使い分けることで、安全で読みやすいコードを書くことができます。