Flutter / Dartで、条件付きifステートメントで「==」と「is」を使用する場合の違いは何ですか[重複]

Dec 02 2020

私はFlutterでBLoCのチュートリアルを行っていますが、講師は条件付きのifステートメントでキーワード「is」を使用しており、状態を「スマートキャスト」すると述べています。「is」演算子が以下のコードのブロックの状態にアクセスする方法を理解するのを誰かが助けてくれますか?

BlocBuilder<WeatherBloc, WeatherState>(
            builder: (context, state) {
              if (state is WeatherLoaded) {
                return buildColumnWithData(context,state.weather);
              }

if(state == WeatherLoaded)で同じコードを試したところ、state.weatherをbuildColumnWithData関数に渡すことができません。どうしてこれなの?

回答

4 Lesiak Dec 02 2020 at 05:08

'=='は等式演算子です。

2つのオブジェクトxとyが同じものを表すかどうかをテストするには、==演算子を使用します。(2つのオブジェクトがまったく同じオブジェクトであるかどうかを知る必要があるまれなケースでは、代わりにsidentity()関数を使用してください。)==演算子のしくみは次のとおりです。

xまたはyがnullの場合、両方がnullの場合はtrueを返し、一方だけがnullの場合はfalseを返します。

メソッド呼び出しx。==(y)の結果を返します。(そうです、==などの演算子は、最初のオペランドで呼び出されるメソッドです。詳細については、演算子を参照してください。)

「is」は型テスト演算子です

obj is TobjがTで指定されたインターフェースを実装している場合、の結果はtrueです。たとえば、obj isObjectは常にtrueです。

あなたのコードでは:

is状態がWeatherLoadedクラスのインスタンスであるかどうかを確認します。

その上WeatherLoaded、チェックが成功したかどうかにキャストする必要はありません-ifステートメントの状態変数がダウンキャストされるスコープ内でWeatherLoaded(「状態をスマートキャストする」)。

では==オペレータ、あなたはクラスの2つのインスタンスを比較することができます。