Dart 1.12 リリースノート

More than 3 years have passed since last update.


はじめに

8月31日にDart1.12がリリースされました。今回は大きな変更があったので、記事にまとめておきたいと思います。大分遅くなってしまいましたが…


1.12 リリース

リリースノートはこちらです。

今回大きな変更としてNull-Aware Operatorの追加が上げられます。他にも、.package fileの追加などの更新があります。


言語仕様の変更


Null-Aware Operator

これは、nullである可能性があるオブジェクトを扱う際にコードをシンプルにし、減らすのを手助けしてくれるものとなります。コードの読み書きの容易さを上げるために導入される、いわゆる糖衣構文です。


??

print(null ?? "this is null") // this is null

var val = 1;
print(1 ?? "this is null") // 1

これは、if null operatorであり、 expr1 ?? expr2 は、もしexpr1がnullでなかったらexpr1を、nullだった場合はexpr2になるようになっています。


??=

var x = null;

x ??= "This is null";

??=は、nullだった場合の代入であり、 v ??= expr は、vがnullだった場合のみ、vにexprを代入する式となります。


x?.p

x?.pはxがnullでなかった場合はx.pを、xがnullであった場合はnullを返します。


x?.m()

x?.m()はxがnullでなかった場合のみ、x.m()を実行します。もしxがnullだった場合も例外を投げません。

DartPadの方に実行できるサンプルプログラムを作っておきましたので、是非試してみてください。

こちらも合わせてどうぞ。

Seth Ladd's Blog: Null-aware operators in Dart


コアライブラリの変更


dart:async

Streamを操作するStreamControllerクラスにonListen, onPause, onResume, onCancel のコールバックのsetterが追加されました。

treamController class - dart:async library - Dart API


dart:convert

Stringを行ごとに分割してくれるLineSplitterクラスにsplitというstatic methodが追加されました。

///Code Example

import "dart:convert";

void main() {
String text = "firstline\nSecondLine\nThirdLine";
var strings = LineSplitter.split(text);
var count = 1;
for(var line in strings){
print(count.toString() + " : " + line);
count++;
}
}
// Output
/// 1 : firstline
/// 2 : SecondLine
/// 3 : ThirdLine

LineSplitter class - dart:convert library - Dart API


dart:core

UriがURIが作られた時に標準化を行うようになりました。また、hasAbsolutePath, hasEmptyPath, hasSchemeプロパティが追加されました。

Uri class - dart:core library - Dart API


dart:developer

Observatoryにログイベントを伝えるlog関数が追加されました。

dart:developer library - Dart API


dart:html

setInnerHtml などのテキストからDOMを生成する関数を呼ぶ際に、NullTreeSanitizerを宣言するかわりとなるものとして、NodeTreeSanitizerconst trustedが追加されました。

NodeTreeSanitizer class - dart:html library - Dart API


dart:io

ファイルモードに、書き込みオンリー権限であるWRITE_ONLYWRITE_ONLY_APPENDが追加されました。

FileMode class - dart:io library - Dart API


dart:isolate

Isolate.spawnUri関数にonError, onExit, errorsAreFatalパラメーターが追加されました。

spawnUri method - Isolate class - dart:isolate library - Dart API


dart:mirrors

InstanceMirror.delegateObjectMirror に移動しました。

ObjectMirror class - dart:mirrors library - Dart API


周辺ツールの変更


.packages file

pub get、もしくはpub upgradeをした際に、.packagesというファイルが生成されるようになりました。これは、pubを利用する際に生成されるシンボリックリンクのかわりに使われるものとなります。

詳しくはSeth Ladd氏のこちらのブログ記事をご覧ください。

Seth Ladd's Blog: New Dart SDK helps eliminates symlinks

これからはシンボリックリンクを生成しなくても、コマンドラインで --packages=path/to/a/.packagesオプションを使うことで、dartを実行できるようになるようです。多分もうちょっとバージョンがあがると、.packagesを参照することがデフォルトになるのだと期待できます。時間があればその辺もまとめておきたいです。


dartdoc

今までので作られていたAPI Docよりも、ロードが早く、見やすいAPI Docを作ってくれるdartdocが、dartdocgenのかわりとして使われるようです。モバイルからのアクセスなどが改善されているとのことです。docgenとdartdocgenは、どちらも1.13でSDKから無くなるようです。


dartfmt

50個以上のバグを改善し、複雑なコードでの行の最適化がより早く、より良いコードを生成するようになりました。


Observatory

多くの機能が追加されました。詳細はこちらをご確認ください。


pub


pub getについて

今まで pub get を前もって実行する必要があった多くのコマンドが、これからは実行する必要がなくなります。.packagesファイルがpubspec.yamlに比べて古くないか、というのを確認するためだけにpub getを走らせればよいことになります。


--verbosity=error と --verbosity=warning

pubを実行する際のオプションとして、エラーだけを表示する--verbosity=error オプションとエラーと警告だけを表示する --verbosity=warning オプションが追加されました。


pub serve コマンドのoutput

pub serve コマンドにて、GETリクエストが複数まとめて表示されるようになりました。

サンプル画像

↑のようになります。全てのRequestを表示したい場合、--verboseオプションを利用してください。


pub run , pub global run

pub runpub global runを実行する際、チェックモードがデフォルトではなくなります。--checkedオプションを利用してください。


pub get

pub getは上記の通り、.packagesファイルを生成するようになりました。また、ダウンロードにかかった時間を表示しなくなるようです。(何が理由なんでしょうかね...)


pub publish

pub publishコマンドを実行している際、もしコードにエラーが発見された場合は0でないexitコードを返すようになりました。また、Gitのトップレポジトリでない場合にも、.gitignoreを適用するようになりました。


最後に

実際にコードを書く・Dartを使う際に重要そうな内容を上げてみました。こちらに書いていない・書けなかった更新もありますので、細部はCHANGELOGを確認してみてください。

個人的には、今回の変更はnull-aware Operatorsの追加も大きいですが、.packagesファイルによりシンボリックリンクを生成しなくてもよくなることの方も結構注目点かなと思っています。Windowsでウィルスセキュリティ関係のソフトによってpubが参照できなくなる、みたいなこともありましたし…

ミスなどがありましたら、コメントなどで指摘していただけるとありがたいです。


参考

Dart News & Updates: Dart 1.12 Released, with Null-Aware Operators and more