週刊 Dart & Flutter インプット 45

ntaoo
10 min readNov 20, 2020

--

https://cdn-images-1.medium.com/max/1760/1*L7Mmc_dhEiJfS_kHXhj4rQ.png

毎週金曜日に、@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 などのオンラインビデオトレーニングコース、または書籍などで体系的に学んで習得しましょう。

--

--