87

ダーツ機能

次の Dart 関数があり、現在 null 安全性を使用しています。

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

アナライザーは次のように不平を言います。

パラメーター 'factor' は、その型のために 'null' の値を持つことができず、null 以外の既定値が提供されていません。

フラッター ウィジェット

これはStatelessWidget、Flutter の場合にも当てはまります。

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

  // ...
}

次のエラーが表示されます。

パラメーター 'key' は、その型のために 'null' の値を持つことはできず、null 以外の既定値は提供されません。


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

4

5 に答える 5

154

どうして

これが発生する理由は、null の安全性が有効になっているため、null非許容パラメーターfactororを にkey できないためnullです。

関数とコンストラクターでは、これらの値は、名前付きパラメーターなしで関数が呼び出された場合に発生する可能性があります:または. ただし、型 (および) はnull 非許容であるため、これは無効なコードです。決して null であってはなりません。nullcalculate()Foo()intKey

ソリューション

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

required

これは、おそらくこの問題に対する最も一般的な解決策であり、変数を設定する必要があることを示しています。これは、(requiredキーワードに注意してください) 次の場合を意味します。

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

factorパラメータを常に指定する必要があることを示します。これにより、問題が解決されますcalculate(factor: 42)。関数の有効な呼び出しになります。

デフォルト値

別の解決策は、デフォルト値を提供することです。パラメータにデフォルト値がある場合、代わりにデフォルト値が使用されるため、関数を呼び出すときにパラメータを安全に指定できません。

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

これで、calculate()呼び出しは として使用42されますがfactor、これは明らかに非 null です。

Null 許容パラメーター

3 番目の解決策は、本当に検討したいことです。つまり、null 許容パラメーターを使用しますか? その場合、関数で使用するときにパラメーターを null チェックする必要があります。

Key keyただし、 Flutter でウィジェットに常にキーを提供する必要があるとは限らないため、問題を解決する最も一般的な方法です(null 許容Key?型に注意してください)。

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

  // ...
}

これで、キーを指定せずに安全に構築できFoo()ます。

定位置パラメーター

同じことが位置パラメータにも当てはまることに注意してください。つまり、null 許容または非 null 許容にすることができますが、常に渡す必要requiredがあるため、注釈を付けたり、デフォルト値を設定したりすることはできません。

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

void bar(int? param1) {} // bar(null) is valid.
于 2020-10-27T18:09:43.007 に答える
8

以前の@creativecreatorormaybenotの回答への追加情報として、デフォルトで必須の位置パラメータ(中括弧なし) を使用することもできます。

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

パラメータに名前を付けずに呼び出されます。

calculate(12);

これらの種類のパラメーターは、コンストラクターで次のように使用できます。

class Foo extends StatelessWidget {
  final String myVar;

  const Foo(this.myVar, {Key? key}): super(key: key);

  // ...
}

および「名前付きパラメーターまたはオプションの位置パラメーター (両方ではない) のいずれかを続けることができます」、こちらのドキュメントを参照してください: dart parameters

名前付きパラメーターと位置パラメーターの違いに関する興味深い回答: Dart の名前付きパラメーターと位置パラメーターの違いは何ですか?

于 2020-12-21T21:15:51.797 に答える