💙

Flutter 2.5 💙 忙しい人のためのアップデートまとめ (21/9/9)

2021/09/10に公開

はじめに

この記事は9月9日付のFlutter 2.5公式アナウンスの(自分なりに咀嚼したつもりの)まとめです。

Dart 2.14についてはこちら
https://zenn.dev/inari_sushio/articles/6e8993cb466be7

リリースハイライト

  • 4600ものissueがクローズし、3932のプッシュリクエストがマージされた。Flutterリリース史上2番目の規模
  • ツール類とパフォーマンスの改善のほか、いくつかの新機能追加
  • Androidのフルスクリーンモードの種類に対応したオーバーレイ周りの調整が可能に
  • Material You(v3)対応
  • OSのデフォルトキーボードショートカットのoverrideに対応(Shorcuts, DefaultTextEditingShortcuts)
  • Widget InspectorでWidgetの情報がより見やすく
  • VS Codeコマンドパレットから依存パッケージを追加できるように
  • IntelliJ/Android Studioでインテグレーションテストが可能に
  • より実用的な新テンプレートの追加(flutter create -t skeleton プロジェクト名)
  • などなど

フレームワーク

  • #25785: Androidのフルスクリーンモードの種類に応じた画面オーバーレイ、SystemChrome周りの改修
  • #86441: FloatingActionButton周りの改修
    • .large .small コンストラクタ追加
    • .extended コンストラクタにおいてiconとlabelの間のスペースが調節可能に
    • 上記変更に付随するFABThemeDataのプロパティ追加
  • #79999 MaterialStateに .scrolledUnder追加(Sliver/AppBarの下方にあるScrollableをAppBarの下に潜らせた状態)
  • #85221 #85499: NotificationScrollMetricsNotificationが追加。ScrollNotificationと異なりユーザーのスクロール動作と無関係のScrollMetricsの通知(枠のサイズ変更、リストにアイテムを追加した場合のスクロールバーの再描画などに利用)
  • ScaffoldMessengerState(ScaffoldMessenger.of(context)の戻り値)にMaterialコンポーネントMaterialBannerを表示するためのshowMaterialBannerなど関連メソッド追加(SnackBarと異なり上に出る&明示的にdismissする前提)
  • #85381: テキスト編集時に使うキーボードショートカット(shift, option/alt, command/windowsなどと組み合わせるものやBackspaceなど)をカスタマイズする機能の役割をRawKeyboardListenerからShortcuts Widgetへ移行。
    • Shortcutsクラスを継承するDefaultTextEditingShortcutsが各OSの組み合わせキーとその動作内容の情報を保持。WidgetsApp / MaterialAppにはこれが組み込まれている。
  • (追記)#84041 SizedBox.square()コンストラクタが追加。

パフォーマンス

  • #25644: iOS Metalシェーダーの事前コンパイル周りの調整による描画遅延問題の改善
  • #25789: UIスレッドがフレーム周りの処理をしている間は他の非同期イベントの処理を後回しにすることで遅延問題改善
  • #26219, #82883, #84740: ガーベッジコレクターのメモリ確保周りの挙動を変更することでUIスレッドが停止する頻度(ガーベッジコレクションの頻度)を減らす
    • たとえば、20秒GIFの再生テストで400から4にガーベッジコレクションが減った(アニメーション画像の表示を繰り返すときの遅延が減り、CPUへの負荷も減る)
  • #25988, #26331: Dart <-> Objective-C/Swift, Java/Kotlin 間のメッセージの受け渡しの際の遅延を最大50%改善
  • #85642: M1 MacでARM版iOS simulatorでデバッグが実行できるように(Rosettaを通さないのでRosettaに関係する問題も発生しない)

プラグイン

  • camera_webプラグインがプレビュー公開(上記のWeb版)
  • cameraプラグインの改良(主にAndroidのApi周りの機能追加)
  • image_pickerプラグインの改良(Google Playの新しいルールに合わせた修正、アクセスリクエストの重複解消など)
  • 本2.5リリースに伴い、Flutterチームによるいくつかのプラグインが非推奨になり、代わりに対応するPlus Pluginsのものが推奨になる(対応表

DevTool

  • Performanceツールで特定のフレームとイベントの紐付けがより正確に(フレーム単位の状況を示したチャートがライブ表示かつインタラクティブに)
  • シェーダーのコンパイルイベントを識別できるようになったのに合わせて遅延、フレーム欠けの診断ができるように
    • flutter run --purge-persistent-cache コマンドによりシェーダーのキャッシュが作られる前の状態でアプリを走らせることができる(開発途上なので何か問題があればここに報告
  • CPU Profilerツールでデータのフィルタリングができるように (ネイティブコード、Dartライブラリ、Flutterライブラリ由来のデータ)
    • CPUフレームチャートはデータの集類によって色分けされるように
  • Widget Inspectorのツリーをホバーすることで詳細が出るように
  • Codemateとの協業によりツールの見た目や体験の改善
    • デバッグのトグルボタンが何をするものなのかよりわかりやすくした
    • Widgetツリーで主要なWidgetの位置をアイコンなどでわかりやすくした
    • Widgetツリーとレイアウトエクスプローラーで色を合わせた

Visual Studio Code

  • コマンドパレットに Dart: Add Dependency と Dart: Add Dev Dependency コマンドが追加され、パッケージが追加できるように(Pubspec Assistを代替)
    • インクリメント検索が可能
  • Fix Allコマンドが追加され、ファイル単位でdart fixと同じ修正ができるように
    • VSCode設定のeditor.codeActionsOnSaveにsource.fixAllを追加することで保存時に実行も可能
  • dart.previewVsCodeTestRunnerをオンにすることでテストをVSCodeの新しいテストランナーで走らせることができる
    • 将来のリリースでFlutter Dartのテストランナーはなくなる予定
  • など多数

IntellJ/Android Studio

  • インテグレーションテスト(実機を使ったテスト)が実行できるように
    • 合わせてDebugボタンの隣のボタンからカバレッジ情報を見れるように。コードのガーター部分がテスト実行済みが否かによって色分け表示される
  • Pub.devにあるTrueTypeフォント系のアイコンパッケージのアイコンがプレビュー表示されるように(static定数として定義されたアイコンのみ)
    • settings/preferencesに新しい設定項目があるのでそこにパッケージ名を入れる
  • など多数

例外処理、新テンプレート、その他

  • #17007: デバッグ実行で例外が投げられたときにSDKの深いところにガイドする代わりに、実際に自分のコードのどこから例外が発生したのかガイドしてくれるように
  • #84308: FutureBuilderに静的プロパティdebugRethrowErrorが追加され、例外をrethrowするか否か選択できるように
  • カウンターアプリ以外の新しい叩き台のテンプレートが追加。flutter create -t skeleton プロジェクト名 か ドット で作成
  • Flutterとホストプラットフォーム間の通信を型安全に、より簡単にしてくれるCode生成ツールのPigeon 1.0がリリース。
  • (追記)Flutter Webでアプリ立ち上げ前に画面上方にロードインジケーターが出るようになった。
  • (追記)Flutter Webとデスクトップで画面遷移のエフェクトがデフォルトでオフになった。ただし、まだpop時に300msの遅延がある。
  • (追記)flutter create 時に analysis_options.yaml が自動で生成されdev_dependenciesに flutter_lints が付くようになった

破壊的変更

  • ThemeDataのaccent〜のプロパティが非推奨に(今後はcolorShceme>secondaryを使う)
  • iOS 8がサポート対象外に
  • などなど

Discussion