1 of 53

Dart3.0の概要と実務における活用

2 of 53

自己紹介

名前:ダイゴ

経歴:体育大 20 卒 → ユニクロ(半年)→ フリーランス Flutter エンジニア

最近のお仕事:NPO寄付プラットフォームアプリ, 地方銀行アプリ etc

一言:来年2月くらいまで海外を転々とします、オススメの国とかあれば教えてください

3 of 53

Dart3.0の概要と実務における活用

目次

  1. はじめに
  2. Dart / Flutter の歴史
  3. Dart 3.0 新機能の 概要 & 活用例
  4. まとめ

4 of 53

  1. はじめに

5 of 53

Flutter 3.10 / Dart 3 系、来ましたね!🎉

6 of 53

みなさんの

Flutter 3.10 / Dart 3系への対応状況知りたい

7 of 53

Dart 3 新機能をゴリゴリ使ってる

プロジェクトはまだ少ない(ハズ)

今回の発表が少しでも参考になれば幸いです!

8 of 53

2. Dart / Flutter の歴史

9 of 53

Dart / Flutter 進化の歴史

10 of 53

Dart / Flutter 進化の歴史

ここの話をします

11 of 53

3. Dart 3 新機能の 概要 & 活用例

12 of 53

  1. Record
  2. Patterns
  3. Class modifiers

13 of 53

  • Record
  • Patterns
  • Class modifiers

14 of 53

Record とは

  • 集合体を表す型
  • `[]`(List), `{}`(Set, Map)みたいに、`()` を使って書く

15 of 53

各フィールドの定義・取得

16 of 53

内部実装

17 of 53

ポイント①

デフォルトで == / hashCode を override する

18 of 53

ポイント②

immutable(不変)であり、フィールドの値を書き換えることはできない

19 of 53

活用例①

再利用することもない & 情報まとめるだけのクラスをシンプルにする

20 of 53

活用例② 複数 Future をまとめて扱う

21 of 53

活用例③ Provider の family として持たせる

22 of 53

  • Record
  • Patterns
  • Class modifiers

23 of 53

Patterns の説明に入る前に...

  • 構文(syntax)
    • プログラミング言語における形式的な構造のルール
    • Dart における「関数」の構文 → `<返り値の型※> <関数名>(<引数>) async※ {<関数の本体>}`
  • 式(expressions)
    • ざっくり言うなら「値を表す・返す構文」
    • 例:文字列などのリテラル ("Hello World" 等)、関数呼び出し (someObj.toString() 等)
  • 文(statements)
    • 「値は表さないが、特定の処理を行う構文」
    • 例:if 文 (if (someCondition) {} else {} 等)、for 文 (for (final value in list) {} 等)、return 文 (return someValue; 等)、throw 文 (throw someError; 等)

24 of 53

Patterns とは

  • 新しく追加された構文(syntax)
  • 式(expressions)っぽく動く Patterns も、文(statements)っぽく動く Patterns もあるが、Patterns は Patterns であり別物
  • 15 種類ある
  • MatchingDestructuring の 2つの機能を持つ(後述)

25 of 53

種類も多くかなり複雑です

今回は、ダイゴが完全に理解 () できた Pattern のみ抜粋して解説します

26 of 53

Pattern 構文がやること:Matching

  • 特定の条件に合致するかどうかを判定する
  • Constant pattern が馴染みのある Pattern だが、Dart 3 からはこの switch 内の記述がより柔軟になる

27 of 53

Pattern 構文がやること:Destructuring

  • List や record などのオブジェクトを分解しつつ、値を変数に取り出す

28 of 53

Pattern 構文が使える場所

  • ローカル変数の宣言・代入箇所
  • switch-case / if-case 文(new!!)
  • コレクション内の制御文(collection-if など)

29 of 53

活用例:Record の例で出した関数の呼び出し側

いちいち取り出すの面倒

30 of 53

  • Records
  • Patterns
  • Class modifiers

31 of 53

Class modifiers とは

  • クラス修飾子のこと
  • class や mixin の使用方法を制御することができる
  • 6種類あり、組み合わせ(Combine)可能
    • abstract(Dart 3以前から存在)
    • base
    • final
    • interface
    • sealed
    • mixin

32 of 53

No modifiers

  • 単に class {} とした場合
  • 無制限のインスタンス化・継承・実装が可能

インスタンス化

継承 (extends)

実装 (implements)

33 of 53

abstract(Dart 3以前から存在)

インスタンス化

継承 (extends)

実装 (implements)

34 of 53

base

インスタンス化

継承 (extends)

実装 (implements)

35 of 53

interface

インスタンス化

継承 (extends)

実装 (implements)

36 of 53

final

インスタンス化

継承 (extends)

実装 (implements)

37 of 53

sealed

インスタンス化

継承 (extends)

実装 (implements)

38 of 53

sealed 実用例

~ Result 型を使ったエラーハンドリング漏れ予防 ~

39 of 53

40 of 53

ハンドリング実装漏れ...

41 of 53

呼び出し側も try / catch 書かないといけないが

関数がエラーを投げるかどうかは実装を見ないと判断つかない

42 of 53

sealed を使った Result 型

43 of 53

Result 型を返すように修正

44 of 53

呼び出し側

45 of 53

呼び出し側

46 of 53

呼び出し側

ここをコメントアウトした場合

コンパイルエラーになる

47 of 53

記述可能な組み合わせ

48 of 53

4. まとめ

49 of 53

まとめ

  • Records
    • わざわざ class 定義しなくても () で集合体を表現
    • immutable で == / hashCode を override
  • Patterns
    • 新しい構文
    • switch 文の case あたり・if 文の () あたりの書き方が柔軟多様に(Matching)
    • List とか Record とかの構造体の各値を楽に分解(Destructuring)
  • Class modifiers
    • abstract とかのクラス修飾子が増えた
    • sealed はうまく使えると便利そう

50 of 53

参考

51 of 53

🙏 宣伝 🙏

52 of 53

7月14日(金)19:00 〜

第4回 FlutterGakkai

参加者・登壇者募集中!

53 of 53

ご清聴ありがとうございました