-1

null 安全性を有効にして一部のコードを Dart 2.12 に移行しようとしていますが、遅延ロード/キャッシュされた値を持つメソッドを移行する良い方法を見つけるのに問題があります。

MyObjectgetValue() の戻り値の型を からに変更しない限り、Dart 2.12 は次のコードをコンパイルしませんMyObject?。しかしgetValue()、決して戻りませんnull

class MyObject {
  // ...
}

MyObject? _cachedValue;

MyObject getValue() {
  if (_cachedValue == null) {
    _cachedValue = MyObject();
    // some heavy computing...
  }
  return _cachedValue;
}

更新 2021-03-17

stephenの回答とMattiaのコメントに基づいて、私は現在使用しています:

class MyObject {
  // ...
}

MyObject _computeValue() {
  MyObject obj = MyObject();
  // some heavy computing...
  return obj;
}
late final MyObject cachedValue = _computeValue();
4

2 に答える 2

2

_cachedValue読み取られる前に初期化されることを確認できる場合は、 late「これは最終的に値を持ち、その後は永遠にnullにはなりません。その間、そうしないようにするのは私次第です」というキーワードを使用できます値を持つ前にアクセスしないでください」

 late MyObject _cachedValue;

late値で初期化される前に変数にアクセスすると、エラーがスローされます。

または、プレースホルダー値が適切である場合は、その使用を検討することもできます。

最後に、 を使用!して、値が null ではないことを確認できます。あなたの場合、これはおそらく最も適切なソリューションです。getValue()あなたreturn _cachedValue!;の代わりにreturn _cachedValue;

編集:Irnの答えも良いものです。私も使用しているのに、??=オペレーターはなんとか私の心を滑らせました。

それとは別に、null 可能な値があるため、ゲッターはMyObject?

于 2021-03-16T19:13:44.370 に答える
0

null 安全なコードを取得するには、言語の null 安全機能を使用する必要があります。

この場合、次のように書き直しgetValueます。

MyObject getValue() => _cachedValue ??= MyObject();

(null の安全性も前にそのように書いていたでしょうnull。初期化されていないことを表すために使用する変数を遅延して初期化する慣用的な方法です)。

于 2021-03-16T22:21:28.997 に答える