1. ホーム
  2. flutter

[解決済み] Dartのパラメータは、その型のために'null'という値を持つことができません。

2023-05-06 23:21:03

質問

ダーツ機能

以下のDart関数がありますが、現在null safetyを使用しています。

void calculate({int factor}) {
  // ...
}

アナライザが文句を言う。

パラメータ 'factor' はその型から 'null' という値を持つことができず、null でないデフォルト値も提供されていません。

Flutterウィジェット

これは、私の StatelessWidget をFlutterで使用した場合です。

class Foo extends StatelessWidget {
  const Foo({Key key}): super(key: key);

  // ...
}

以下のようなエラーが出ます。

パラメータ 'key' はその型から 'null' という値を持つことができず、null でないデフォルト値も提供されていません。


この問題を解決するにはどうすればよいですか。

どのように解決するのですか?

なぜ

このようなことが起こるのは null セーフティが有効で で、あなたの 非ヌル パラメータ factor または key できない である null .

関数とコンストラクタの中で、これらの値 があるかもしれません。 である null という名前のパラメータ無しで関数が呼ばれた場合。 calculate() または Foo() . しかし、型 ( intKey ) は NULLでない であり、これは 無効 のコードであり、決してNULLであってはなりません。

ソリューション

これを解決するには、基本的に3つの方法があります。

required

これはおそらくこの問題に対する最も一般的な解決策であり、これは変数 が設定されなければならないことを表しています。 . これはつまり、もし私たちが(注目すべきは required キーワード)。

void calculate({required int factor}) {
  // ...
}

ということを示しています。 factor パラメータは常に指定されなければならないので、問題は解決されます。 calculate(factor: 42) などだけが有効な関数の呼び出しとなるため、問題が解決されます。

デフォルトの値

もう一つの解決策は、デフォルト値を提供することです。パラメータにデフォルト値があれば、関数を呼び出す際にパラメータを指定しなくても、デフォルト値が代わりに使用されるため安全です。

void calculate({int factor = 42}) {
  // ...
}

では calculate() の呼び出しは 42factor として、明らかに非NULLであることがわかります。

Null可能なパラメータ

3つ目の解決策は、本当に検討したいことです。すなわち、NULL可能なパラメータを持ちたいですか?もしそうなら、関数で使用するときにパラメータをヌルチェックする必要があります。

しかし、これは、最も一般的に Key key の問題を解決する方法です。なぜなら、Flutter では常にウィジェットにキーを提供したいとは思わないからです (nullable の Key? 型に注意)。

class Foo extends StatelessWidget {
  const Foo({Key? key}): super(key: key);

  // ...
}

これで、安全に Foo() を安全に構築できるようになりました。

位置決めパラメータ

にも適用されることに注意してください。 位置パラメーター パラメータも同様です。すなわち、それらは nullable または non-nullable にすることができますが、それらは required でアノテーションすることはできず、デフォルト値を持つことはできません。 常に必要 を渡さなければならないからです。

void foo(int param1) {} // bar(null) is invalid.

void bar(int? param1) {} // bar(null) is valid.