Dart チートシート — 簡潔なリファレンス
Dart 3 の文法、型システム、非同期、そして最もよく使う標準ライブラリをまとめたチートシートで、日常の 80%程度をカバーします。
Dart Dart 3
Dart SDK · オブジェクト指向 · ジェネリック · 関数型 · 非同期ファースト · 静的(健全な null 安全)
おすすめの学習パス
まず dart create/run と pubspec の構成を学ぶ → 変数・型・制御フローを習得 → 関数・文字列・コレクションを掘り下げる → クラス、ミキシン、エラー処理を理解する → isolate と async/await で並行処理を扱う → 必要に応じてネットワーク、時間、プロセス、正規表現、ビルド・テストを学ぶ、という順です。FAQ 章は後から落とし穴を避けるのに便利です。
1.Hello World と実行環境
最小プログラム、dart create/run とプロジェクト構成。
最小プログラム
すべての Dart プログラムは void main() のエントリ関数から始まります。dart run で実行され、print で標準出力に出力します。
作成と実行
dart create がプロジェクトの雛形を作り、dart run がエントリファイルを直接実行します。開発時は JIT でホットリロード、リリース時は AOT でコンパイルします。
プロジェクト構成
pubspec.yaml にパッケージ名、依存関係、SDK バージョンを宣言します。コードは lib/ と bin/ に、テストは test/ に置きます。
print 出力
print は stdout に出力し改行を追加します。$ で変数を補間し、${式} は式を埋め込みます。
コマンドライン引数
main は List<String> args を受け取れます。args[0] 以降がコマンドラインの引数で、プログラム名は含まれません。
非同期 main 関数
main は Future<void> でもよく、すべての await が完了するまで待ってから終了します。時間のかかる処理でよく使います。
コメント
// は単行コメント、/// はドキュメントコメント(dart doc 用)、/* */ はブロックコメントです。実行には影響しません。
トップレベルメンバー
Dart ではトップレベルの関数と変数が使えます(クラスの外側)。import でライブラリを読み込み、トップレベル変数はファイル間で共有されます。
2.変数と定数
変数宣言、final/const、null 安全と分割代入。
var と final
var は再代入可能ですが、推論される型は固定されます。final は一度だけ代入でき、以降は変更できません。
const 定数
const はコンパイル時定数で、コンパイル時に値が確定している必要があります。同じ const 値は正規化されて 1 つのインスタンスになります。
明示的な型
変数には明示的に型を宣言できます。静的型はコンパイル時のチェックに有効で、公開 API では明示を推奨します。
null 許容変数
健全な null 安全では既定で null 不可です。型に ? を付けると null 許容になり、null チェックや ?? で既定値を使います。
late 遅延初期化
late は初回アクセスまで初期化を遅らせます。late final は一度だけ代入でき、ランタイム値に依存するフィールドに適しています。
分割代入
Dart 3 ではレコードとパターンマッチによる分割代入ができ、コレクション要素を一度に複数の変数に代入できます。形状が一致する必要があります。
スコープとシャドウイング
変数はそのブロック内で参照でき、内側で外側の同名変数をシャドウイングできます。トップレベル変数はライブラリ全体で参照できます。
dynamic と Object
dynamic は静的チェックをスキップして実行時に型が決まります。Object はすべてのクラスの親で、明示的なキャストが必要です。
3.データ型
組み込み型、コレクション型、レコード、列挙型。
数値型
int が整数、double が浮動小数、num は両方の親型です。int リテラルは double に代入できます。
文字列型
String は不変の UTF-16 シーケンスです。シングルクォートとダブルクォートは等価で、補間と複数行文字列もサポートします。
ブール型
bool は true と false のみです。条件式は bool を返さなければならず、数の暗黙的変換はありません。
リスト型
List は順序付きのコレクションで、ジェネリックをサポートします。リテラル [a, b] で作成し、既定では拡張可能です。
セットとマップ
Set は順序なしで重複を許さない集合、Map はキーと値の対応です。どちらもジェネリックとリテラル構文を持ちます。
レコード型
Dart 3 のレコードは名前のない軽量な集約型です。フィールド名を付けられ、パターン分割代入にも対応します。
列挙型
enum は限られた名前付き定数の集合を定義します。拡張列挙(Dart 2.17+)はフィールドとメソッドを持てます。
型変換
int.parse / double.parse で文字列を数値に変換し、toString で文字列へ戻す。as は実行時の型変換を行う。
4.参照と null 安全
オブジェクト参照、null 安全、ディープコピーとネイティブメモリ。
オブジェクト参照
Dart には生ポインタがなく、変数はオブジェクト参照を保持します。代入は参照をコピーするだけで、複数の変数が同じオブジェクトを指せます。
null 安全
健全な null 安全により、null は String? のような null 許容型にのみ現れます。非 null 性はコンパイル時に保証されます。
null 表明 !
null 許容式の後に ! を付けると非 null を表明します。失敗時は null チェック例外が投げられます。確実な場合だけ使ってください。
null 合体
?? は左辺が null のとき右辺を返します。??= は変数が null のときだけ代入します。
late と const
final はランタイムで 1 回だけ代入、const はコンパイル時定数です。late は大きなオブジェクトや循環依存の遅延初期化に適しています。
参照と等価性
== は既定では参照比較で、identical() で同一インスタンスかを判定します。構造的等価性にはヘルパー関数を使います。
ディープコピーとシャローコピー
シャローコピーは最上位のみを複製し、深い階層のオブジェクトは共有されます。ディープコピーは階層ごとに複製し、不変コレクションは共有しても安全です。
ネイティブメモリ
dart:ffi は Pointer と calloc を提供し、C ライブラリとの相互運用のためにネイティブメモリへアクセスします。ポインタの寿命は開発者が管理します。
5.制御フロー
if、ループ、switch、パターンマッチング。
if / else
if/else if/else は条件によって分岐します。条件は bool である必要があり、null チェックで型昇格が発生します。
三項演算子
条件 ? 真の値 : 偽の値 は単一式による分岐です。?? と組み合わせて null 既定値を扱えます。
for ループ
for の古典的な 3 段形式と、for-in による Iterable の反復が使えます。Dart 3 ではループ変数のパターン分割代入もサポートされます。
while ループ
while は判定後に実行、do-while は最低 1 回実行してから判定します。反復回数が未知のループに向きます。
switch 式
Dart 3 の switch 式は値を返します。case の後にはパターンを書き、=> で結果を返します。break は不要です。
switch 文
switch 文は case で分岐します。空 case のフォールスルー、ガード節、パターンをサポートします。非空の分岐では break が必要です。
パターンマッチング
if-case と switch は値に構造マッチングを行います。オブジェクトパターン、レコードパターン、ガードを組み合わせて使えます。
break と continue
break は現在のループを抜け、continue は次の反復へ進みます。ラベルでネストしたループのジャンプ先を制御できます。
6.関数とラムダ
関数定義、オプションパラメータ、クロージャ、非同期関数。
関数の定義
関数は戻り値の型、名前、パラメータ、本体で構成されます。戻り値がない関数は void を使います。
アロー関数
単一式の本体の関数は => で簡潔に書け、その式の値が返ります。純粋関数やコールバックに適しています。
オプショナル位置引数
角括弧 [] はオプショナル位置引数で、省略時は既定値または null。既定値はコンパイル時定数でなければなりません。
名前付き引数
波括弧 {} は名前付き引数で、呼び出し時は名前で指定します。required を付けると必須になります。
高階関数
関数は第一級市民で、引数として渡したり戻り値として返せます。map/where/fold はコレクションでよく使う高階関数です。
クロージャ
クロージャは定義環境の変数を捕捉します。外側の関数が返った後も、これらの変数へアクセス・変更できます。
非同期関数
async 関数は Future を返し、内部で await により結果を待ちます。await は async 関数内でのみ使用できます。
ジェネレータ
sync* は遅延 Iterable を生成し、async* は Stream を生成します。yield で値を 1 つずつ出し、yield* で他のジェネレータに委譲します。
7.文字列
リテラル、補間、部分文字列、エンコーディングとフォーマット。
文字列リテラル
シングルクォートとダブルクォートはいずれも文字列です。バックスラッシュでエスケープでき、r プレフィックスでraw文字列になります。
文字列補間
$変数 や ${式} で値を文字列に埋め込みます。任意のオブジェクトは toString が呼ばれます。
複数行文字列
3 つのシングルクォート ''' で複数行文字列を作ります。改行とインデントがそのまま保たれます。
よく使うメソッド
contains/startsWith で包含判定、replaceAll で置換、toUpperCase/toLowerCase で大小文字を変換します。
部分文字列と検索
substring で位置を指定して切り出し、indexOf で部分文字列を検索、split で区切り文字ごとに分割します。
文字とエンコーディング
Dart の文字列は UTF-16 で、codeUnits はコードユニット、runes はコードポイントを返します。emoji は runes が必要です。
効率的な連結
ループ内で文字列を連結すると一時オブジェクトが大量に作られます。StringBuffer で蓄積してから一括で文字列化します。
フォーマットとパース
toStringAsFixed で小数桁を固定し、padLeft で桁を揃え、int.parse/double.parse で数字文字列をパースします。
8.コレクション
リスト、マップ、集合作業とソート。
リストの操作
add で追加、insert で挿入、remove で削除、sort で並べ替えます。既定の List は可変で拡張可能です。
リストの高階関数
map で変換、where で抽出、reduce/fold で集約、expand で平滑化します。返される Iterable は多くが lazy です。
スプレッド演算子
... はコレクションの要素をリテラルに展開します。...? はソースが null のとき安全にスキップします。
コレクション内 if/for
コレクションリテラル内で if により要素を含めたり、for でまとめて生成できます。Dart 3 ではパターンマッチも使えます。
マップの操作
Map のキー、値、エントリは反復可能です。putIfAbsent は必要になってから埋め、update は更新、remove は削除します。
セットの操作
Set は要素の一意性を保証します。union/intersection/difference で集合演算ができ、toSet でリストの重複を除去します。
ソートと検索
sort は既定で昇順で、比較器を渡せます。indexOf は線形探索、contains は存在判定です。
読み取り専用コレクション
List.unmodifiable は読み取り専用リストを作成し、変更すると UnsupportedError を投げます。List.of は可変リストをコピーします。
9.メモリとパフォーマンス
ガベージコレクション、const 正規化、バッファの再利用。
ガベージコレクション
Dart VM は自動でガベージコレクションを行い、手動の解放は不要です。参照されなくなったオブジェクトは回収対象になります。
const 正規化
const 値は正規化され、同じ定数は 1 つのインスタンスだけが存在します。const を活用して重複アロケーションを減らします。
遅延初期化
トップレベル変数と static 変数は初回アクセスまで遅延初期化されます。late も同じ遅延セマンティクスを提供します。
リストの容量
可変リストは必要に応じて拡張され、頻繁な add は何度も再アロケーションします。サイズが分かっていれば事前割り当てを推奨します。
バッファの再利用
Uint8List などの typed-data はバイナリバッファに適します。バッファを再利用し、StringBuffer で文字列を連結します。
弱参照関連付け
Expando はオブジェクト自体を変更せずにデータを付与し、キーが弱参照です。WeakReference は回収を妨げません。
オブジェクトのライフサイクル
オブジェクトは isolate ごとの独立ヒープに作られます。可変オブジェクトを isolate 間で共有できず、コピーかメッセージで渡します。
ネイティブメモリ
C と相互運用する際は dart:ffi でネイティブメモリを割り当てます。手動で解放しないとメモリリークになります。
10.オブジェクト指向
クラス、継承、mixin、インターフェース。
クラスとコンストラクタ
class はオブジェクトの青写真を定義します。コンストラクタはクラスと同名で、this. パラメータでフィールドに直接代入できます。
継承
extends でスーパークラスを継承し、@override でメソッドを再定義し、super で親を呼び出します。Dart は単一継承です。
mixin
mixin は再利用可能な振る舞いの断片で、with で組み込みます。継承より柔軟で、単一継承の制限を避けられます。
抽象クラス
abstract class はインスタンス化できず、契約だけを定義します。サブクラスは抽象メソッドを実装する必要があります。
インターフェース
すべてのクラスは暗黙的にインターフェースでもあり、implements で実装します。すべてのメンバーを再実装する必要があります。
アクセサ
get は読み取り専用アクセサ、set は書き込み可アクセサを定義します。呼び出しに括弧は不要で、内部実装を隠せます。
静的メンバー
static メンバーはインスタンスではなくクラスに属します。static メソッドはインスタンスメンバーにアクセスできません。
sealed クラス
sealed クラスはサブクラスを同一ライブラリに限定し、switch を default なしで網羅的にできます。Dart 3 の機能です。
11.エラー処理
try/catch、カスタム例外、非同期エラー。
try / catch
try 内で例外の可能性があるコードを包み、catch で捕捉します。catch (e) で例外オブジェクトを取得できます。
on 句
on 句で特定の例外型だけを捕捉し、catch と組み合わせて使います。型ごとに処理を分けられます。
finally と rethrow
finally は例外の有無に関わらず実行され、リソース解放に適しています。rethrow は元のスタックを保ったまま再送出します。
例外を投げる
throw キーワードで例外オブジェクトを送出します。何でも投げられますが、慣習的には Exception または Error のサブクラスを投げます。
カスタム例外
Exception を implements して業務例外を定義します。toString を上書きしてメッセージを分かりやすくし、フィールドを持たせられます。
非同期エラー
async 関数内の await が投げる例外は try/catch で捕捉できます。未処理の Future エラーは静かに失われます。
ストリームのエラー
Stream を listen する際は onError コールバックでエラーを扱います。StreamController.addError でストリームにエラーを注入できます。
アサーション
assert は開発時に条件を検証し、失敗時に AssertionError を投げます。リリースビルドでは除去されます。
12.ファイルと I/O
ファイルの読み書き、JSON、標準入出力。
ファイルの読み込み
dart:io の File クラスでファイルを読み書きします。readAsString でテキストファイル全体を読み込みます。import 'dart:io' が必要です。
ファイルの書き込み
writeAsString でテキスト書き込み、writeAsBytes でバイナリ書き込み。追記は mode パラメータで指定します。
行ごとの読み込み
readAsLines はファイルを行ごとにリストへ分割します。大ファイルは openRead でストリーム処理し、全体読み込みを避けます。
JSON 処理
dart:convert の jsonEncode / jsonDecode でシリアライズとデシリアライズを行います。JSON の数値は int か double になります。
標準入出力
stdin.readLineSync で 1 行同期読み込み、stdout.writeln で出力します。コマンドライン対話プログラムに向きます。
ディレクトリの操作
Directory.list でディレクトリ内容を列挙し、create で作成、delete で削除します。返値は FileSystemEntity です。
バイナリバイト
readAsBytes でバイナリを読み、Uint8List でバイト列を表現し、writeAsBytes で書き出します。画像や音声に適します。
パスの操作
File / Directory の path プロパティでフルパスを取得できます。absolute は絶対パスへ、uri は file:// 形式に変換します。
13.よくある落とし穴
Dart の日常開発で最も踏みがちな落とし穴と正しい書き方。
null 表明の乱用
! で null チェックを迂回すると実行時にクラッシュしがちです。null チェックや ??、型昇格のほうが安全です。
コレクションの == 比較
List / Map の == は参照比較で、要素が同じでも等価にはなりません。構造比較はヘルパー関数を使います。
const と final
const はコンパイル時定数でなければならず、final はランタイムで決定します。ランタイム値を const で書くとコンパイルエラーです。
遅延 Iterable
map / where は lazy Iterable を返し、反復時に再計算されるため元集合の変更が結果に反映されます。スナップショットは toList を使います。
await の書き忘れ
async 関数を await しないと Future が返り、結果ではありません。並列実行は Future.wait を使います。
カスケードはレシーバを返す
.. カスケードは同じオブジェクトに連続呼び出しを行い、レシーバを返します。戻り値が必要なときはカスケードを使わないでください。
反復中の変更
反復中に要素を追加・削除すると ConcurrentModificationError が投げられます。removeWhere や収集してから処理しましょう。
文字列はエンコード単位
length は UTF-16 のコードユニット数を返すため、漢字や emoji は文字数より多くなります。文字単位で処理するには runes を使います。
14.並行と非同期
isolate、Future、Stream、イベントループ。
isolate 並行
isolate は Dart の並行単位で、それぞれ独立したメモリとイベントループを持ちます。Isolate.run か Isolate.spawn で起動します。
spawn とポート
Isolate.spawn はエントリ関数で isolate を起動します。SendPort が送信、ReceivePort が受信を担当します。
Future の基本
Future は将来得られる結果を表します。Future.value で即座に成功し、await で完了を待ちます。
async / await
async は非同期関数を表し、await は非同期操作を待ちます。await は async 関数内でのみ使えます。
Stream
Stream は非同期イベントのシーケンスです。listen で購読し、await for で逐次処理します。Future の単発値とは異なります。
StreamController
StreamController で手動制御し、add でデータ、addError でエラー、close で終了します。broadcast で複数購読できます。
複数の Future を待つ
Future.wait で全完了を並行待ち、Future.any で最も速い結果を待ちます。
Completer
Completer を使うと Future の完了タイミングを手動で制御でき、コールバック API を async/await にラップできます。
15.ネットワーク
HTTP リクエスト、WebSocket、TCP ソケット。
HTTP クライアント
dart:io の HttpClient で HTTP リクエストを発行します。getUrl でリクエストを取得し、close してからボディを読みます。
package:http
package:http は一般的なリクエストをラップします。http.get / http.post は Response を返し、body はそのまま文字列です。
URI のパース
Uri.parse で URL を解析し、queryParameters でクエリを読み、Uri.http でリクエスト URL を構築します。
JSON API
JSON API を呼び出し、jsonDecode でレスポンスボディを解析します。package:http と Future を組み合わせて待ちます。
WebSocket
WebSocket は全二重通信です。WebSocket.connect で接続し、add で送信、ストリームで受信します。
TCP ソケット
Socket.connect で TCP 接続し、リクエストを書き込み、レスポンスを読みます。低レベルプロトコルや自作サービスに向きます。
HTTP サーバー
HttpServer.bind でローカルサーバーを起動し、リクエストを待ち受けてレスポンスを返します。開発やツールに適しています。
タイムアウトとエラー
ネットワークリクエストはタイムアウトや失敗が起こり得ます。.timeout を設定し、try/catch で例外を捕捉して処理します。
16.日時
DateTime、Duration、フォーマット、タイムスタンプ。
現在時刻
DateTime.now() で現在のローカル時刻を取得します。各フィールドに直接アクセスでき、ミリ秒も取得できます。
時刻の生成
DateTime(年, 月, 日, ...) で指定時刻を作ります。DateTime.utc で UTC 時刻を構築します。
Duration
Duration は時間の長さを表し、時・分・秒・マイクロ秒をサポートします。算術、比較、単位変換が可能です。
フォーマット出力
Dart には組み込みの strftime がなく、padLeft でゼロパディングするか、intl パッケージの DateFormat を使います。
時刻のパース
DateTime.parse で ISO 8601 文字列を解析し、toIso8601String で標準形式の文字列を生成して送受信しやすくします。
時刻演算
add / subtract で Duration を加減し、difference で 2 つの時刻差を Duration で求めます。
タイムスタンプ
ミリ秒/マイクロ秒タイムスタンプは保存や並べ替えに便利です。fromMillisecondsSinceEpoch で時刻に復元します。
タイムゾーン
DateTime は既定でローカル時刻です。isUtc で判定し、toUtc / toLocal で変換します。保存は UTC が推奨されます。
ストップウォッチ
Stopwatch はコードの実行時間を計測します。start / stop / reset で制御し、elapsed で経過時間を取得します。
17.プロセスと環境
サブプロセス、環境変数、標準ストリーム、シグナル。
子プロセスの実行
Process.run は外部コマンドを実行して終了を待ちます。result.stdout / stderr が出力を保持します。
ストリーミングプロセス
Process.start はプロセスを起動して即座に返し、stdout のリアルタイム読み取りと stdin への書き込みができます。長時間の処理に向きます。
環境変数
Platform.environment で環境変数を読み取ります(読み取り専用 Map)。存在しないキーは null です。
終了コード
exitCode で終了コードを設定します。0 が成功、非 0 が失敗で、シェルが結果を判定します。
引数とスクリプト
args はコマンドライン引数、Platform.script はエントリスクリプトのパス、Directory.current は現在の作業ディレクトリです。
標準ストリーム
stdout / stderr が出力、stdin が入力です。flush でバッファを強制出力し、stderr は通常のパイプ出力に含まれません。
ファイルシステム
File / Directory がファイルシステムを扱います。create で作成、delete で削除、rename で移動、exists で存在判定です。
シグナル処理
ProcessSignal でシステムシグナルに応答します(SIGINT / SIGTERM)。優雅な終了や後処理に使います。
18.正規表現
RegExp によるマッチ、置換、分割、グループ。
作成と判定
RegExp は正規表現を表します。hasMatch でマッチ有無を判定します。r プレフィックスでエスケープを避けられます。
最初のマッチ
firstMatch は最初のマッチを返します。group でグループを、start / end で位置を取得し、マッチが無いと null です。
すべてのマッチ
allMatches はすべてのマッチの反復子を返します。パターンと組み合わせて条件に合う内容を抽出できます。
置換
replaceAll は全置換、replaceFirst は最初の 1 つだけ置換します。コールバックで動的に置換文字列を生成できます。
分割
String.split は RegExp を受け取りパターンで分割します。区切り文字は結果に含まれません。
キャプチャグループ
丸括弧はキャプチャグループを定義します。group(n) で取得、(?<name>...) で名前付きにして namedGroup で参照します。
フラグ
RegExp コンストラクタの第 2 引数でフラグを設定します。caseSensitive、multiLine、dotAll、unicode などがあります。
よくあるパターン
よくある検証パターンとしてメール、電話番号、URL、IP を再利用可能な定数として定義すると保守しやすくなります。
19.ビルドとデバッグ
pub、静的解析、フォーマッタ、テスト。
pubspec の設定
pubspec.yaml はパッケージ設定ファイルで、名前、バージョン、SDK 制約、依存関係を宣言します。dart pub get で解決します。
pub コマンド
dart pub get で取得、upgrade で更新、outdated で期限切れ確認、add / remove で依存関係を管理します。
静的解析
dart analyze でコードを静的に解析し、エラーや警告を報告します。CI で実行して品質を担保します。
フォーマット
dart format でコードスタイルを統一します。インデント、引用符、改行を自動整形し、チーム開発に必須です。
ユニットテスト
package:test が test() と expect を提供します。dart test で実行し、テストは test/ ディレクトリに置きます。
コンパイルとデプロイ
dart compile で実行ファイルを生成します。exe はネイティブ、js は JavaScript、aot-snapshot は AOT スナップショットです。
lint ルール
analysis_options.yaml で lint ルールを設定します。lints パッケージは推奨ルールセットを提供します。
デバッグ
print デバッグが最も手軽です。assert で不変条件をチェックし、IDE のブレークポイントでステップ実行もできます。
このチートシートについて
本ページは Dart 3 の自己完結的なチートシートで、言語コアと最もよく使う標準ライブラリを実プロジェクトの約 80% の用途でカバーします。モダンなイディオムを中心に据えています — 健全な null 安全、レコードとパターン、switch 式、sealed クラス、カスケード演算子、そして isolate ベースの並行処理。Dart は Google が設計し、Flutter の基盤言語です。JIT による高速な開発と、AOT による効率的なリリースの両方をサポートしています。正式なリファレンスは Dart 言語ツアーと Effective Dart を参照してください。 19 章はそれぞれ一つのテーマに取り組みます — 最初のプログラムから isolate、よくある落とし穴、ビルド・テストまで。各章は 8 個のサンプル(各 5〜15 行)に分かれており、合計でおよそ 152 トピックです。スニペットは短く自己完結的にしてあります。コメントは中国語のまま残し、学習時の対照に役立ててください。 処理はすべてブラウザ内で完結します — アップロードや追跡は一切ありません。本ページは GuruToolkit の無料開発者ツールキットの一部で、スニペットは保証なしで自由にご利用いただけます。
バージョン 2.1.0