毎週金曜日に、@ntaoo がインプットした Dart & Flutter の情報のリンク集をまとめて共有します。
Announcing null safety beta. Migrate your packages now! | Dart
Null safety 機能が Dart と Flutter のbeta版にマージされました。
- 既に Dart のコアライブラリと Flutter フレームワークが Null safety 版に移行済み。
- SDK の制約を
2.12.0-0
以上にすることで Null safety 機能が有効になる。
environment:
sdk: ">=2.12.0-0 <3.0.0"
- 来春に、Null safety 対応が stable になる予定。
Null-safety 版への移行方法
ステップ1. 依存している package がまだ null safety に対応していない場合は、その作者に連絡することを検討してください。依存している package の Null safety 対応へ状況を可視化するには、 dart pub outdated --mode=null-safety
を使用する。
ステップ2. 1.で依存 package がすべて null-safety 対応しているのを確認したら、次は自身の app または package の移行を行う。dart migrate
コマンドで、app または package のコードを Null safety 版へ移行するインタラクティブなツールが起動するので、それを利用してコードを編集する。
ステップ3. 静的解析ツールで移行したコードを検証する。
$ dart pub get
$ dart analyze
または
$ flutter pub get
$ flutter analyze
ステップ4. テストコードを実行して検証する。
ステップ5. package のメジャーバージョンを上げ、そしてそれをprerelease versionとして、 pub.dev に公開する。
ベネフィット
- Null safety が有効になると、Flutter フレームワーク自体のコンパイル後コードサイズが 3.9%減少する。
- Null safety を信用してコンパイルするので、ランタイムの Null チェックが不要になる分、性能が向上する。(将来のブログ記事で解説予定)
プロダクションアプリの null safety への移行については、来春予定の stable 版を待つことを推奨されています。Flutter Web は beta 版なので、Web 版を開発している人は今から移行してみる冒険をするのも面白いかも知れません。
これからしばらくは package の Null safety 移行についてのオープンソースのコミュニケーションが活発になりそうですね。NNBD が発表されてから、たしか 7 年くらい経ったと思いますが、ようやく実現されそう。
Null safety in Dart — Introduction — YouTube
DartがNullに関してのSoundnessを獲得したことを、他の言語との比較とともに示した図。これにより、Null safetyを前提としたRuntimeの性能向上が図れます。
(Null safety 構想当初の Dart は、プロダクションでもJITコンパイラで動作させる動的言語の潜在能力を知らしめる言語として設計され、その構想の元、型システムを意図的に言語から切り離していた(Optional Typing)のですが、 JITコンパイラが許可されない iOS ネイティブアプリ対応のためにAOTコンパイルを重視する意思決定の結果として、型システムを言語のセマンティクスに組み込んだ静的型付き言語へと大改装された経緯があります。)
Deprecation Lifetime in Flutter. Reliably removing deprecated code on a… | by Kate Lovett | Flutter | Nov, 2020 | Medium
Flutter の破壊的変更による deprecated code の削除に関するポリシーを策定しましたとのこと。
language/records-feature-specification.md at master · dart-lang/language
Pattern matching の仕様策定の一部として、Record の仕様策定が進行中。
Many languages, especially those with a static functional heritage, have tuple or product types:
var tuple = ("first", 2, true);
A tuple is an ordered list of unnamed positional fields. These languages also often have record types. In a record, the fields are unordered, but named:
var record = (number: 123, name: "Main", type: "Street");
In Dart, we merge both of these into a single construct, called a record. A record has a series of positional fields, and a collection of named fields:
var record = (1, 2, a: 3, b: 4);
derry | Dart Package
pubspec.yaml にスクリプトを書いて実行できる。npm run
のような使い勝手。Grinder と使い分ける場面もあるかも...?
cli_pkg | Dart Package
Sass の作者 (元 Dart Team の方)が、スタンドアロンのコンソールアプリ用の package を公開していました。Grinder をラップしたものです。
Grinder tasks for releasing Dart CLI packages.
Flutter + Firestore: You may be using it wrong. | by Michel Feinstein | Flutter Community | Medium
公式サイトや在野のブログでよく見られるサンプルコードをそのままプロダクションコードに適用して、ユニットテストができずメンテナンスも難しいコードに苦しむのを避けるためにどうするか -> Smart UI を避けて MVC する、というだけのお話でした。
分かっている組織は普通に実践しているけど、経験の少ない組織はサンプルコードの構成を真に受けてしまって苦労していることも多そう。
Flutter アプリをテストして、カバレッジを見える化する — ANDPAD Tech Blog
Controlling time in Dart unit tests, the better way | iiro.dev
package:clcok を使用しての時刻のテスト方法についての解説。
私ならば、テスト対象の DateTime はコンストラクタの optional named parameter で差し替え可能にしておくか、 @visibleForTesting アノテーションを付けたフィールドまたはメソッドにして、テストコードではその値を setter で差し替えるか継承で override します。それで解決できるので、本当に解決できない問題が出てくるまでは DateTime とは API が異なる package:clock に依存したくない気持ち。
Amazon | Flutter Complete Reference: Create beautiful, fast and native apps for any device (English Edition)
まだ買っていないのですが、目次を見る限り信用できそう。英語ですが。
情報源
https://twitter.com/ntaoo が、follow させていただいている方々
最新の情報を中心にしますが、少し古めでも私が見つけた際に有益と判断した情報も載せていきます。情報の網羅性の高さは不明です。継続を重視して省力化しています。
- 公式情報は優先順位最高にして載せます。
- それら以外の情報は、私の関心に基づいて適当に間引きます。
- 基礎は、https://dart.dev/codelabs , https://flutter.dev/docs , Udemy などのオンラインビデオトレーニングコース、または書籍などで体系的に学んで習得しましょう。