Dart: その正体、Flutter言語の特徴とプログラミング

著者: IT Sectr 公開日: 2026-02-10 読了時間: 12 分

DartはGoogleが開発したプログラミング言語で、クロスプラットフォームフレームワークFlutterのために特別に作られました。JITコンパイルによる高速なホットリロードと、リリースビルドでのネイティブパフォーマンスのためのAOTコンパイルを組み合わせています。Dartはモバイル開発だけでなく、ウェブアプリケーション(AngularDart)やサーバーサイドソリューションにも使用されています。言語の機能の詳細については、Dart公式ドキュメントをご覧ください。

重要ポイント

  • Dart — Googleが作成したFlutter言語、JIT/AOTコンパイル対応
  • Null safety — Dart 2.12以降のsound null safetyによりnullエラーを排除
  • Isolate — 共有メモリなしの分離スレッドによる並列処理
  • Flutter — Skia/Impellerを介してウィジェットをレンダリングするUIフレームワーク
  • Pub.dev — DartとFlutter向け45,000以上のライブラリを備えたパッケージマネージャー

Dartとは?

DartはCライクな構文を持つプログラミング言語で、GoogleがLars Bak(Eclipseの創設者)の主導で開発しました。最初のリリースは2011年でしたが、Dartが真の人気を得たのは2018年のFlutter 1.0のリリース以降です。この言語はユーザーインターフェースの構築のために設計されており、ストリーム、フューチャー、リアクティブパターンを組み込みでサポートしています。

Dartの哲学は「パフォーマンスと生産性のバランス」です。この言語は2つのコンパイル戦略をサポートしています。ホットリロードによる開発用のJIT(Just-In-Time)と、ネイティブパフォーマンスによるリリースビルド用のAOT(Ahead-Of-Time)です。JITコンパイラは、APKの再コンパイルを必要とせず、ミリ秒単位で実行中のアプリケーションに修正コードを注入します — これがモバイル開発におけるDartの他の言語に対する主要な利点です。

Dartの主要機能はsound null safetyで、Dart 2.12(2021)で導入されました。型システムにより、変数は明示的な宣言(int?)なしではnullになれないことが保証されます。これにより、コンパイル時にNullPointerExceptionが排除されます。Googleによると、null safetyの採用により、本番環境でのFlutterアプリケーションのクラッシュ率が30%削減されました。

Dartエコシステム

Dartエコシステムには3つの主要な領域があります。Flutter(モバイルおよびデスクトップアプリケーション)、AngularDart(ウェブアプリケーション)、Dart Server(サーバーサイドソリューション)です。Flutterが支配的なプラットフォームです。Statista(2025年)によると、Flutterはクロスプラットフォームモバイルプロジェクトの46%で使用されており、React Native(38%)やXamarin(8%)を上回っています。

Dartの構文: 型、関数、クラス

Dartの構文はJavaやJavaScriptに似ていますが、独自のユニークな構造を持っています。Dartではすべてがオブジェクトです — int、double、boolでさえObjectを継承しています。型付けはオプションです。varとして宣言された変数は自動的に型を推論しますが、可読性とパフォーマンスのために型を明示的に指定することを推奨します。

基本型と宣言

Dartはint、double、String、bool、List、Set、Map、Record、Symbol、Runesをサポートしています。Null許容型 — 接尾辞?が付いた任意の型(int?、String?)。??演算子(null-aware)は、左側がnullの場合に右側の値を返します。カスケード記法(..)を使用すると、参照を繰り返さずに同じオブジェクトで複数のメソッドを呼び出せます。

dart
// Dartの基本型と宣言
void main() {
  // 明示的な型付け
  int age = 25;
  double price = 19.99;
  String name = 'Dart';
  bool isValid = true;

  // Null safety — 変数はnullになりうる
  int? nullableAge = null;
  int result = nullableAge ?? 0; // null-aware演算子

  // ジェネリクスを使用したコレクション
  List<String> items = ['Dart', 'Flutter', 'Mobile'];
  Map<String, dynamic> config = {
    'version': '3.0',
    'mode': 'debug',
  };

  // カスケード記法
  final list = <String>[]
    ..add('one')
    ..add('two')
    ..sort();
}

// Record — 匿名の不変型
(String, int) user = ('Alice', 30);
print(user.$1); // 'Alice'

dynamic型は型チェックを無効にします — JSONや動的データを扱う場合にのみ使用してください。RecordはDart 3.0の新しい型で、個別のクラスを作成せずに値をグループ化できます。Null-aware演算子??は、長いif-elseチェックに代わる、null許容値を扱う標準的な方法です。

クラスとミックスイン

Dartのクラス — 単一継承(extends)、ミックスイン(mixin)による多重継承。Dartはインターフェースを独立した概念としてサポートしていません — 任意のクラスを実装(implements)できます。ミックスインはコンストラクタのないクラスで、そのメソッドとフィールドはwithキーワードを使用して任意のクラスに追加できます。

dart
// Dartのクラス、継承、ミックスイン
abstract class Animal {
  void sound(); // 抽象メソッド
}

mixin Swimmer {
  void swim() => print('Swimming...');
}

mixin Flyer {
  void fly() => print('Flying...');
}

class Duck extends Animal with Swimmer, Flyer {
  @override
  void sound() => print('Quack!');
}

void main() {
  final duck = Duck();
  duck.sound(); // Quack!
  duck.swim();  // Swimming...
  duck.fly();   // Flying...
}

// 名前付きコンストラクタ
class Config {
  final String env;

  Config.development() : env = 'dev';
  Config.production()  : env = 'prod';
}

DuckクラスはAnimalを継承し、SwimmerとFlyerの2つのミックスインを使用します。これは菱形継承問題なしで多重継承を示しています。ミックスインは線形に解決されます(super chain)。名前付きコンストラクタ(Config.development)は、事前設定されたパラメータでオブジェクトを作成するための静的ファクトリメソッドの代替手段です。

Dartの非同期処理: Future、Stream、async/await

Dartの非同期処理は、Future(単一の値)、Stream(値のシーケンス)、async/awaitを通じて実装されます。DartはJavaScriptと同様にイベントループを持つシングルスレッドモデルを使用しますが、重要な違いがあります。DartコードはIsolate(共有メモリのない別のスレッド)で実行されるため、長時間の計算がUIをブロックしません。

Futureは、しばらくして完了する非同期操作を表します。Futureは保留中(待機)、値で完了(成功)、またはエラーで完了(エラー)の状態になります。.then().catchError()チェーンはasync/awaitの代替ですが、可読性のためにawaitを使用することを推奨します。

dart
// FutureとStreamによる非同期データ読み込み
import 'dart:convert';
import 'package:http/http.dart' as http;

class ApiService {
  final String baseUrl;

  ApiService(this.baseUrl);

  // 単一リクエスト用のFuture
  Future<Map<String, dynamic>> fetchUser(int id) async {
    final response = await http.get(
      Uri.parse('$baseUrl/users/$id'),
    );

    if (response.statusCode == 200) {
      return jsonDecode(response.body);
    } else {
      throw Exception('Failed to load user: ${response.statusCode}');
    }
  }

  // データシーケンス用のStream
  Stream<int> countStream(int max) async* {
    for (var i = 1; i <= max; i++) {
      await Future.delayed(Duration(seconds: 1));
      yield i;
    }
  }
}

void main() async {
  final api = ApiService('https://api.example.com');

  // awaitの使用
  final user = await api.fetchUser(1);
  print('User: ${user['name']}');

  // await forによるStreamの処理
  await for (final count in api.countStream(5)) {
    print('Count: $count');
  }
}

ApiServiceクラスは2種類の非同期処理を示しています。HTTPリクエスト用のFuture(単一応答)と、シーケンシャルカウンター用のStream(async*とyieldを使用したジェネレーター)です。Streamはセンサー、位置情報、Firebase Realtime Databaseなど、データが継続的に到着するあらゆる場所で効果的です。Isolateは個別のメモリを使用し、データはSendPort/ReceivePortを介して送信されます。

DartとFlutter: アプリケーションアーキテクチャ

DartとFlutterは単一のスタックを形成します。FlutterはUIフレームワーク、DartはUI記述言語です。Flutterでは、ボタンからアプリケーション全体まで、すべてがウィジェット(Widget)です。ウィジェットにはstateful(可変状態を持つ)とstateless(不変)があります。Dartは宣言的UIを記述します。build()はウィジェットツリーを返し、FlutterはSkia(またはiOSではImpeller)を使用してレンダリングします。

Flutterアプリケーションの構造

DartによるFlutterアプリケーションは、main() → runApp(MyApp()) → MaterialAppで構成されます。MaterialAppにはルーティング(routes)、テーマ(theme)、ローカライゼーションが含まれます。各画面はScaffoldで、AppBar、Body(通常はColumn/ListView)、BottomNavigationBarを含みます。ナビゲーションはNavigator.push/popまたは名前付きルートを介して行います。

dart
// DartによるシンプルなFlutterアプリケーション
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dart Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  int _counter = 0;

  void _increment() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Dart + Flutter')),
      body: Center(
        child: Text('Counter: $_counter'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _increment,
        child: Icon(Icons.add),
      ),
    );
  }
}

HomeScreenウィジェットは、内部状態_counterを持つStatefulWidgetです。setState()を呼び出すと、FlutterにUIの再構築が通知されます。Dartコードはbuild()を再実行し、新しいウィジェットツリーを作成します。Flutterは古いツリーと新しいツリーを効率的に比較(diff)し、画面の変更された部分のみを更新します。Hot Reloadは、_counterの状態をリセットせずにbuild()を置き換えます。

Dartのコンパイル: JIT vs AOT

Dartのコンパイルはハイブリッドです。開発用のJITと本番用のAOTです。デバッグモードでは、Dart VMがJITコンパイラを実行し、コードのホットスワップ機能でバイトコードを解釈します。リリースモードでは、dart compile exeまたはflutter buildが特定のアーキテクチャ(arm64、x86_64、armv7)用のネイティブAOTバイナリを作成します。

モードコンパイル実行速度バイナリサイズホットリロード
DebugJIT (VM)~50 MBあり
ReleaseAOT (ネイティブ)最大~15-20 MBなし
Webdart2jsブラウザに依存変動開発サーバー

デバッグモードでのDartのJITコンパイルは、約1秒でホットリロードを提供します。開発者はアプリケーションの状態を失うことなくUIの変更を確認できます。AOTコンパイルは、ネイティブのSwift/Kotlinアプリケーションに近いパフォーマンスを実現します。Googleによると、Dart AOT上のFlutterは、ミッドレンジのデバイスでも60 FPSのアニメーションを達成します。

Dart開発者ツール

Dart開発者ツールには、Dart SDK(dartコンパイラ、dartanalyzer、dartfmt、pub)、Flutter SDK、IDEプラグインが含まれます。Dart SDKはFlutter SDKとともにflutter/bin/cache/dart-sdkフォルダにインストールされます。Pubはパッケージマネージャーで、pubspec.yamlを読み取り、pub.devから依存関係をダウンロードします。

主要ツール

dart analyze — 型、未使用のインポート、潜在的なエラーをチェックする静的アナライザー。dart format — コードを一貫したスタイルに自動的にフォーマットするフォーマッター。dart doc — ///コメントからドキュメントを生成するジェネレーター。Flutter DevTools — ウィジェットツリーインスペクター、ログ、メモリ、ネットワークを備えたプロファイラー。Dart VM Service — WebSocketを介した実行中アプリケーションのデバッグ。

yaml
# pubspec.yaml — Dartプロジェクトの設定
name: my_flutter_app
description: A new Flutter project.
version: 1.0.0

environment:
  sdk: '>=3.0.0 <4.0.0'

dependencies:
  flutter:
    sdk: flutter
  http: ^1.2.0
  provider: ^6.1.0
  shared_preferences: ^2.2.0
  json_annotation: ^4.8.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.4.0
  json_serializable: ^6.7.0
  flutter_lints: ^3.0.0

pubspec.yamlファイルはDartプロジェクトの依存関係を記述します。environment:sdkフィールドはDartのバージョンを指定します。現在の安定版は3.xです。Dependenciesは主要なライブラリ、dev_dependenciesはテストとコード生成用です。json_annotation + json_serializableは、build_runnerを介してJSONシリアライゼーションコードを生成します。flutter_lintsはアナライザー用のルールセットです。

よくある質問

Dartとは?

DartはGoogle(2011年)のプログラミング言語で、Flutterでのクロスプラットフォーム開発用に設計されています。Cライクな構文、強い型付け、JITおよびAOTコンパイルをサポートしています。sound null safety(Dart 2.12以降)とFuture・Streamによる非同期処理が特徴です。モバイル、ウェブ、デスクトップアプリケーションに使用されます。

DartとJavaScriptの違いは?

Dartはネイティブコード(AOT)またはJS(dart2js)にコンパイルされますが、JavaScriptはインタープリタされます。Dartにはsound null safety、組み込みクラス、ミックスインを備えた強力な型付けがあります。Dartの非同期処理はIsolate(共有メモリなしの個別スレッド)に基づいており、JSはWeb Workersを使用したイベントループに基づいています。モバイルシナリオでは、Dart AOTのパフォーマンスはV8 JITよりも30〜50%高いです。

Dartはどのようにモバイルアプリケーションにコンパイルされますか?

DartはDart Nativeを介してAOTでネイティブARMコードにコンパイルされます。デバッグモードでは、Dart VMはホットリロードとともにJITを使用します。Flutter Engine(C++)はSkia/Impellerを介してUIをレンダリングします。Androidの場合はflutter build apk、iOSの場合はflutter build iosです。ウェブビルドはdart2jsまたはdart2wasmを使用します。リリースAPKのサイズは15〜20 MBです(AAB分割なし)。

Dartはどのようなデータ型をサポートしていますか?

Dartはプリミティブ型(int、double、String、bool)、コレクション(List、Set、Map、Record)、特殊型(Symbol、Runes、Null)をサポートしています。プリミティブを含むすべてがオブジェクトです。Null safety: int?はnullを許容し、intは決してnullになりません。??、??=演算子で安全なnull処理を実現します。ジェネリクス: List<String>、Map<String, dynamic>。

Dart開発にはどのようなツールが必要ですか?

Flutter SDKにはDart SDK、Flutter Engine、ウィジェットライブラリが含まれています。IDEはFlutterプラグインを使用したAndroid StudioまたはVS Codeです。DevToolsはウィジェットインスペクター付きのプロファイラーです。Pub.devは45,000以上のライブラリを備えたパッケージマネージャーです。dart analyzeとdart formatツールでコード品質を確保します。Build_runnerはJSONモデルのコード生成に使用します。

まとめ

  • Dart — FlutterのためのGoogleの言語、JIT開発とAOTパフォーマンスを融合
  • Sound null safety Dart 2.12(+3.0)以降 — 型レベルでの必須のnull保護
  • 非同期処理 Future(単一結果)、Stream(シーケンス)、Isolate(並列処理)
  • Flutter — すべてがウィジェットの宣言的UIフレームワーク(StatelessWidget / StatefulWidget)
  • Hot Reload — アプリケーション状態を維持したまま約1秒でJITコードをリロード
  • Pub.dev — pubspec.yamlで管理されるパッケージエコシステム(45,000以上)
  • Flutter DevTools — ウィジェットインスペクター、メモリ、ネットワークを備えたプロファイラー

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください