2021/12/9 : Dart : Conditional member access ( ?. )について

 

(この記事、というかこのブログ全体で、言葉の定義として

フィールド = プロパティ

です。)

Conditional member access

nullableな変数に対して使うことで実行時エラーを防げる。

//sample_1
void main() {
  P? p1;
  
  int n = p1.y; //←error
  print('$n');
  
}

class P{
  int y=0;
}

 

//result of sample_1
line 4 • The property 'y' can't be 

2021/2/15 Learn (null-safety) with Snippets! 8〜14の訳

<< 2021/2/15 Learn (null-safety) with Snippets! 1〜7の訳(前ページ


Snippets 8: The assertion operator

nullableな式をnon-nullableな変数に代入したい場合、代入演算子を使うことができます。(` ! `付きで。)

式の後ろに` ! `を付けることで、Dartに対してその式の値がnullでないことを示すことができます。

これはnon-nullableな変数へ安全に代入する方法です。

Note:nullでないことが確実な時に上記の方法を使ってください。値がnullである式に` ! `を付けると例外がthrow(スロー)されます。

` ! `を追加して、下記のコードの3つの間違った割り当て(代入)を修正してみてください。

↑のように書いているが、実際動かしてみると、最初の文はエラーは出ない。(2021年2月15日時点)

ただ、そのような挙動の違いがあっても、基本的な考え方として「nullableな変数はnullチェックが必要」ということは言えるはず。

int? couldReturnNullButDoesnt() => -3;

void main() {
  int? couldBeNullButIsnt = 1;
  List<int?> 

2021/2/15 Learn (null-safety) with Snippets! 1〜7の訳

Snippet 1: Introducing non-nullable types

DartPadのヌルセーフティバージョンへようこそ!
これは、nullの安全性のための新しい構文とコーディングパターンを説明するために設計された一連のコード例の最初のものです。
各スニペットは、不良または壊れた状態で始まります。
Dartアナライザーからの警告が表示され、コードがコンパイルされない可能性があります。
しかし、指示に従い、コードを編集することで、
各スニペットを動作状態に更新できます。
その過程で、nullの安全性について学びます!

この最初の例は、基本的なものです。
以下の変数 `a`は` int`として宣言されています。
Dartプロジェクトでnullセーフティが有効になっている場合、デフォルトではすべての型がnon-nullable型です。
割り当ての値を3または145に変更してみてください。
null以外のもの!

void main() {
  int a;
  a = 24;
  print('a is $a.'); //24
}


Snippet 2:Nullable types

null値を保持できる変数が必要な場合はどうなりますか?
タイプの最後に疑問符を追加することで、null許容(null可型、nullable型)として宣言できます。
この場合、 `int?`を試してください。

void 

2021/2/14 Migrating to null safetyの訳

Migrating to null safety

このページでは、コードをnullセーフティに移行する方法とタイミングについて説明します。

所有している各パッケージを移行するための基本的な手順は次のとおりです。

migrate:移住する、移行する、移動する

ここではnull-safetyバージョンに移行する、null-safetyに対応する、という意味。

  1. あなたのパッケージ内で使用しているパッケージがマイグレートされるのを持ちます。
  2. あなたのパッケージのコードをマイグレートします。できれば、インタラクティブ移行ツールを使用しましょう。
  3. あなたのパッケージのコードを静的に分析します。
  4. 変更(マイグレート)が機能するかテストします。
  5. もしパッケージがすでにpub.devに公開されている場合は、prereleaseバージョンとしてnull-safeバージョンを公開ましす。

アプリの移行は、技術的にはパッケージの移行と同じです。 アプリを移行する前に、nullの安全性が安定したリリースになり、すべての依存関係の準備が整うまで待つことを検討してください。

マイグレーションツールの使用体験に関する非公式の動画を以下に示します。


1. Wait to migrate

依存関係のグラフの葉を最初にマイグレートして、順番にマイグレートを進めていくことを強くお勧めします。

例えば、

パッケージCの中でパッケージBを使用している(パッケージBに依存している)。

パッケージBの中でパッケージAを使用している(パッケージAに依存している)。

という状況では、まず最初にパッケージAをマイグレートし、次にパッケージBを、その次にパッケージCをマイグレートすべきです。

Illustration of C/B/A sentence

自分のパッケージが依存しているパッケージがnull-safetyをサポートする前に、自分のパッケージをマイグレートすることも可能です。

しかし、自分のパッケージのマイグレート後に、「依存しているパッケージ」がマイグレートされると、また自分のパッケージのコードを変更しないといけなくなる可能性があります。

自分のパッケージ内の、ある関数の引数をnullable型と予想として実装したあとで、依存しているパッケージが、対応する変数の型をnon-nullable型で実装(マイグレート)していた場合、nullable型の値を渡そうとするとコンパイルエラーになります。

あなたのパッケージに依存しているパッケージ(あなたのパッケージを利用しているパッケージ)をマイグレートする前に、あなたのパッケージをマイグレートするべきです。nullセーフパッケージは、Dart 2.12ベータ以降を使用している限り、まだnullセーフティを使用していないパッケージやアプリで使用できます。 たとえば、DartおよびFlutterコアライブラリはnullセーフであり、nullセーフティに移行していないアプリでも引き続き使用できます。

このセクションでは、null-safetyモードのdart pub outdatedコマンドを使用して、パッケージの依存関係を確認および更新する方法について説明します。 この手順では、変更を簡単に元に戻すことができるように、コードがソースコントロール下にあることを前提としています。


Switch to a

2020/11/10 Understanding null safetyの訳パート1

 

null-safetyは、 Dart 2.0で元の不健全なオプションの型システムを健全な静的型システムに置き換えて以来、Dartに加えた最大の変更です。

Dartが最初にリリースされたとき、コンパイル時のnullの安全性は、長い導入を必要とするまれな機能でした。今日、Kotlin、Swift、Rust、およびその他の言語はすべて、非常によく知られている問題に対する独自の答えを持っています次に例を示します。

// Without null safety:
bool isEmpty(String string) => string.length == 0;

main() {
  isEmpty(null);
}

conditional property access

上記のコードをnull-safety無しで実行すると、.lengthにおいてNoSuchMethodError …

2020/11/10 Dart sound null safety: technical preview 2の訳

Dartは、Flutterで特別な役割を果たし、ホットリロードなどの開発者機能を強化し、Dartの柔軟なコンパイラテクノロジーを介してモバイル、デスクトップ、およびWeb用のマルチプラットフォームアプリを有効にします。私たちは、Dart言語をFlutterアプリ開発者にとって最も生産的なものにするよう努めています。たとえば、FlutterウィジェットツリーをコーディングするためのDart構文を最適化するために、UI-as-code言語構造を追加しました。

6月に、Dartのnull safetyの最初の技術プレビューを提供しました。今日は、私たちがしばらく楽しみにしていたもう1つの主要なマイルストーンです。Flutterフレームワークのサポートを含む、サウンドヌルセーフティの2番目の技術プレビューを発表します。

null safetyは、発見がしいことが多いバグのクラスであるnull exceptionsを回避するのに役立つ主要な新しい生産性機能です。追加のボーナスとして、この機能により、さまざまなパフォーマンスの向上も可能になります。皆様からのフィードバックをお待ちしております。


Why null safety?

Dartはタイプセーフ(型安全)な言語です。これは、あるタイプ(型)の変数を取得すると、コンパイラーがそのタイプ(型)であることを保証できることを意味します。ただし、型安全性自体は、変数がnullでないことを保証するものではありません。

Null errorsは非常に一般的です。GitHubで検索すると、Dartコードの予期しないnullによって引き起こされる何千もの問題が発生し、さらに何千ものコミットがそれらの問題を修正しようとします。以下のFlutterアプリサンプルでNULL値に関する問題を見てみてください。ConfigWeatherServiceはアプリで使用されるバックエンドサービスであると想定してください。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // ↓サービスからデータを取得します。普通これらの処理は
    // 非同期処理ですが、簡単にするためにこのサンプルでは
    // 同期処理としてコードを書いています。
    

2020/9/19 Dart: Sound null safetyの訳

Sound null safety

Dart言語にnull安全が導入されます。(現在ベータ版です(2021年2月時点))

null安全を導入した場合、デフォルトでは普通に型宣言したら、それはnon-nullable型になります。つまり普通に宣言した変数は、nullを持つことができない。普通に宣言した変数の値がnullということはない。

null安全を導入することで、null-dereference errorが実行時に発生することがなくなり、代わりにコード編集時の静的解析エラーとなります。

次のスクリーンショットに示すように、通常の開発環境でnullセーフティを試すか、既存のコードを移行してnullセーフティを使用するか、WebアプリDartPad with NullSafetyでヌルセーフティの使用を練習できます。

Screenshot of DartPad null safety snippet with analysis errors

important

null安全はまだテクニカルプレビューなので、製品版で使用しないでください。特にFlutterフレームワークはまだnull安全に対応していません。(2020年9月19日時点)(2021年2月時点で削除されている。)


Null safety principles

Dart null安全サポートは、次の3つのコア設計原則に基づいています。

Non-nullable by default.明示的にnull値をとることができると示さない限り、non-nullable型とみなされます。このデフォルトは、APIでnull以外が断然最も一般的な選択であることが調査で判明した後に選択されました。

Incrementally adoptable. 何をnull safetyにマイグレートするか、そしていつマイグレートするかを選択できます。同じプロジェクトでnull-safeなコードとnon-null-safeなコードを混在させることができます。徐々にマイグレートしていくことが可能です。マイグレーションを助けるツールを提供しています。

Fully sound. Dartのnullセーフティは健全であり、コンパイラの最適化を可能にします。型システムがnullではないと判断した場合、値がnullになることはありません。プロジェクト全体とその依存関係をnullセーフティに移行すると、健全性のメリットを最大限に活用できます。バグが少なくなるだけでなく、バイナリが小さくなり、実行が高速になります。


A tour of