メインコンテンツにスキップ

Sound null safety

Dart 言語はサウンド null セーフティを強制します。

null セーフティは、`null` に設定された変数の意図しないアクセスに起因するエラーを防ぎます。

たとえば、メソッドが整数を期待しているのに `null` を受け取ると、アプリは実行時エラーを引き起こします。この種のエラー(null デリファレンス エラー)はデバッグが困難な場合があります。

サウンド null セーフティでは、すべての変数に値が必要です。これは、Dart がすべての変数を非 null 可能と見なすことを意味します。宣言された型のみの値(例: `int i=42`)を代入できます。デフォルトの変数型に `null` の値を代入することはできません。変数の型が `null` 値を持つことができることを指定するには、型アノテーションの後に `?` を追加します(例: `int? i`)。これらの特定の型には、`null` *または*定義された型の値を含めることができます。

サウンド null セーフティは、潜在的な実行時エラー編集時の解析エラーに変換します。null セーフティを使用すると、Dart アナライザーとコンパイラーは、非 null 可能変数に以下のいずれかが含まれている場合にフラグを立てます。

  • 非 null 値で初期化されていない
  • `null` 値が代入されている。

これらのチェックにより、アプリをデプロイする*前に*これらのエラーを修正できます。

例による紹介

#

null セーフティを使用すると、以下のコードの変数は `null` になることはありません。

dart
// With null safety, none of these can ever be null.
var i = 42; // Inferred to be an int.
String name = getFileName();
final b = Foo();

変数が `null` の値を持つ可能性があることを示すには、型宣言に `?` を追加するだけです。

dart
int? aNullableInt = null;
  • インタラクティブな例を試すには、Dart チートシートにある null セーフティ指向の例をいくつか試してみてください。
  • null セーフティについてさらに学習するには、null セーフティの理解をご覧ください。

null セーフティの原則

#

Dart は、以下の 2 つのコア設計原則を使用して null セーフティをサポートしています。

デフォルトで非 null 可能
変数が null になる可能性があることを Dart に明示的に伝えない限り、非 null 可能と見なされます。このデフォルトは、API では非 null が圧倒的に一般的な選択であることが研究によって判明した後に選択されました。
完全にサウンド
Dart の null セーフティはサウンドです。型システムが変数または式が非 null 可能型であると判断した場合、実行時に `null` に評価されることが決してないことが保証されます。

プログラム全体でのサウンド null セーフティにより、Dart はこれらの原則を活用して、バグの削減、バイナリサイズの縮小、実行速度の向上を実現できます。

Dart 3 と null セーフティ

#

Dart 3 にはサウンド null セーフティが組み込まれています。Dart 3 は、それなしではコードが実行されるのを防ぎます。

Dart 3 への移行方法を学習するには、Dart 3 Migration Guide を参照してください。null セーフティのサポートなしで開発されたパッケージは、依存関係を解決する際に問題を引き起こします。

dart pub get

Because pkg1 doesn't support null safety, version solving failed.
The lower bound of "sdk: '>=2.9.0 <3.0.0'" must be 2.12.0 or higher to enable null safety.

Dart 3 と互換性のないライブラリは、解析またはコンパイル エラーを引き起こします。

dart analyze .
Analyzing ....                         0.6s

  error • lib/pkg1.dart:1:1 • The language version must be >=2.12.0. 
  Try removing the language version override and migrating the code.
  • illegal_language_version_override
dart run bin/my_app.dart
../pkg1/lib/pkg1.dart:1:1: Error: Library doesn't support null safety.
// @dart=2.9
^^^^^^^^^^^^

これらの問題を解決するには

  1. pub.dev からインストールしたパッケージの null セーフなバージョンを確認してください。
  2. ソース コード全体をサウンド null セーフティを使用するように 移行してください。

Dart 3 は、Dart および Flutter の安定チャネルで利用できます。詳細については、ダウンロード ページで詳細をご確認ください。Dart 3 との互換性をコードでテストするには、Dart 3 以降を使用してください。

dart --version                     # make sure this reports 3.0.0-417.1.beta or higher
dart pub get / flutter pub get     # this should resolve without issues
dart analyze / flutter analyze     # this should pass without errors

`pub get` ステップが失敗した場合は、依存関係のステータスを確認してください。

`analyze` ステップが失敗した場合は、アナライザーによってリストされた問題を解決するようにコードを更新してください。

Dart 2.x と null セーフティ

#

Dart 2.12 から 2.19 では、null セーフティを有効にする必要があります。Dart 2.12 より前の SDK バージョンでは null セーフティを使用できません。

サウンド null セーフティを有効にするには、SDK 制約の下限を 2.12 以降の 言語バージョンに設定します。たとえば、`pubspec.yaml` ファイルには次のような制約がある場合があります。

yaml
environment:
  sdk: '>=2.12.0 <3.0.0'

既存コードの移行

#

null セーフティのサポートなしで書かれた Dart コードは、null セーフティを使用するように移行できます。Dart SDK バージョン 2.12 から 2.19 に含まれている `dart migrate` ツールを使用することをお勧めします。

cd my_app
dart migrate

コードを null セーフティに移行する方法を学習するには、移行ガイドをご覧ください。

さらに学習するために

#

null セーフティについてさらに学習するには、以下のリソースを確認してください。