Chapter 06

チュートリアル編4:Dartの基本

kazutxt
kazutxt
2021.05.15に更新

このチャプターでは、Flutterのプログラミング言語であるDartの特徴について解説します。

Dartの構文やキーワードなどをまとめて解説します。

全体的な特徴

Flutterは、Dartというオリジナルのプログラミング言語を用います。

このチャプターでは、Dartの基本的な構文/要素/予約語を紹介します。

本チャプターでは、Dartの基本や特徴的な部分だけを取り上げます。
詳細については、公式ドキュメントなどをご参照ください。

Flutterには、JavaやPythonのような、基本的なプログラミングの変数や定数、制御構文、クラス/メソッドが準備されています。
また、private、static、finalなどの修飾子に加え、ジェネリクスやイテレーション、匿名関数なども一通り使えます。
一方で、javascriptのawait/asyncのような非同期も使えます。

そのため、一般的なプログラミング言語を理解されている方であれば、ほぼ抵抗なく利用できると思います。

詳細

演算

  • +,-,*,/,% (四則演算)
  • ++,-- (インクリメント,デクリメント)
  • >> (シフト)
  • &,^,! (ビット演算)
  • &&,||,! (AND,OR,NOT)
  • ?? (null判定)
  • += (複合代入)
  • as (型キャスト)
  • is (型チェック)

制御構文

  • if,else (条件分岐)
  • switch,case (多分岐)
  • for,while,forEach, for in, dowhile (ループ)
  • break,continue (制御)

変数の型

  • int (整数)
  • double (実数)
  • num (数値)
  • String (文字列(Runesも可))
  • bool (ブール値)
  • [] (配列)
  • List (リスト)
  • Set (集合)
  • Map (Key/Value)
  • Symbol (識別子)
  • late (遅延初期化)
    • Dart2で導入

文字列

下記のように文字列の中で、変数や式の評価を行い、その結果を表示することができます。

snipet.dart
print("文字列の表示") // 文字列の表示
print("$_counter") // 変数の表示
print("${_counter + 1}") // 式の展開

""と''のどちらも文字列リテラルを表します。
その際に、文字列展開される・されないの違いはありません。

変数修飾子

  • final (再代入不可)
  • const (定数)
  • var (型推論)

例外処理

  • try (例外が起きる可能性)
  • catch (例外が起きたときの処理)
  • finally (例外に関わらず実施する処理)
  • throw (例外を投げる)

クラス

  • class (クラスの定義)
  • コンストラクタ
    • インスタンス生成時に呼ばれる
    • 下記のようにthisで直接指定することもできます。
snipet.dart
class MyData {
  String name;
  // MyData(String name){ this.name = name;}と等価
  MyData(this.name);
}
  • new (インスタンスの生成)
    • 省略可
  • extends (継承)
    • 1つだけ
  • abstruct (抽象クラス)
    • newできない
  • implements (インタフェース)
    • interfaceはキーワードは無いが、classでインタフェースを作る
    • 複数可
  • with (mixin)

フィールド/メソッド

  • _xxx
    • _ではじめるとプライベート変数/メソッド扱い
  • static (static化)
    • クラスに属するフィールド/メソッド
  • noSuchMethod() (メソッドがない時に呼ばれるメソッド)
    • メタプログラミング
  • アノテーション (メタ情報を付加)
    • @override (オーバーライド)
    • @deprecated (非推奨)
  • get/set (getter,setter)
    • 以下のようにgetter/setterを設定するのが一般的
snipet.dart
//hogeクラス
int get data => _data; //getter
set data(int data){this._data = data}; //setter

//使う側
hoge.data = data;
print(hoge.data);
  • class(String name) : super(name) (イニシャライザリスト)
    • :で区切った初期化処理を実施
  • factory (factoryコンストラクタの定義)

インポート

  • import
    • パッケージをインポート
  • import as xxx
    • xxxで名前をつける
  • import show yyy
    • yyy のみを使う
  • import hide zzz
    • zzz は除外する

メソッド

  • method1(param: 1, param2: "data")
    • 名前付きパラメタ
  • method2(String key, [String opt])
    • オプションパラメタ
    • 引数がなくても呼び出せる
  • method3(ip = '127.0.0.1', port = 8080)
    • デフォルトパラメタ
    • 引数がない時に値を入れる
  • methods4(func)
    • funcはメソッド。関数を変数に入れて渡せる
    • 関数の引数を第一級クラスオブジェクトとして扱える
  • method5(data) => {print(data)}
    • 匿名関数
    • 簡素な関数の定義の命名することなく定義できる

その他

  • enum (列挙型)
  • Sum<Int> (ジェネリクス)
  • async,await (非同期)
  • Future (非同期の戻り値)
  • assert (アサーション)

カスケード記法

  • .. (カスケード記法)
    • オブジェクトのメソッドを連続で呼び出せる
snipet.dart
// カスケード記法なし
var list1 = new List();
    list1.add(1);
    list1.add(2);

// カスケード記法あり
var list2 = new List()..add(1)..add(2)