Flutterは、Dart言語を使用して単一のコードベースからクロスプラットフォームアプリケーションを作成するためのGoogleのオープンソースフレームワークです。Flutter Documentation, 2024によると、このフレームワークはiOS、Android、Web、Windows、macOS、Linux用のネイティブコードにコンパイルされ、WebViewやJavaScriptブリッジを使用せずに、すべてのプラットフォームで一貫したUI動作を提供します。
重要なポイント
Flutterは、2015年にGoogleが発表したユーザーインターフェース作成のためのSDK(ソフトウェア開発キット)およびフレームワークです。Flutter 1.0の最初の安定版は2018年12月にリリースされました。React Nativeとは異なり、FlutterはJavaScriptとネイティブコードの間のブリッジを使用せず、プロセッサのネイティブ命令に直接コンパイルされます。
Flutterの主な特徴は、独自のレンダリングエンジンです。このフレームワークはUIKit(iOS)やAndroidのViewシステムに依存しません。代わりに、FlutterはSkia(2024年以前)または新しいImpellerエンジンを介して、すべてのピクセルを独立して描画します。これにより、すべてのプラットフォームで一貫した外観が保証され、異なるOSバージョン間での適応問題が解消されます。
Statista 2024によると、Flutterは人気度でクロスプラットフォームフレームワークの中で第1位です。約46%の開発者がモバイル開発にFlutterを使用しています。このフレームワークは、Google Pay、Alibaba、eBay、BMW、Tencentのプロジェクトで使用されています。
最初のFlutterのアルファ版は、2015年にDart Developer SummitでSkyという名前で発表されました。2018年にはiOSとAndroidのみをサポートするFlutter 1.0がリリースされました。Flutter 2.0(2021)はWebとDesktopのサポートを追加しました。Flutter 3.0(2022)はmacOSとLinuxの安定したサポートを導入しました。Flutter 3.16(2023)はImpellerを導入しました。MetalとVulkanに基づく新しいレンダリングエンジンです。
Flutter 3.22(2024)は、iOSでデフォルトでImpellerを採用し、Material Design 3のサポートを改善し、マクロ拡張を備えたDart 3.4、およびプラットフォームリソースへの直接アクセスのための組み込みNative Assetsサポートを含んでいます。Googleは、ImpellerがSkiaと比較してフレームのカクつきを90%削減すると報告しています。
Dartは、2011年にGoogleが作成し、Flutterで使用されるプログラミング言語です。Dartは、厳格な型付けとJITコンパイル(Hot Reload用)およびAOTコンパイル(プロダクションビルド用)の機能を組み合わせています。Dart 3.0(2023)は、パターンマッチング、sealed class、recordsを安定した機能として導入しました。
DartのNull safetyは、バージョン2.12から導入された必須機能です。コンパイラはビルド時にすべてのnull許容型をチェックし、実行時のNullPointerExceptionを排除します。データ型(int、String、bool)はデフォルトで非null許容であり、null許容値は?接尾辞を使用します(例:String? name)。
Flutterのアーキテクチャは3層構造の原則に基づいて構築されています。最下層はエンジン(C/C++)で、レンダリング、I/O、プラットフォームAPIへのアクセスを担当します。中間層はフレームワーク(Dart)で、ウィジェットシステム、ジェスチャ、アニメーション、ナビゲーションを実装します。最上層はアプリケーション(Dart)で、ウィジェットをツリーに組み立てます。
Flutterでは、すべてがウィジェットです。ウィジェットには2つのタイプがあります。StatelessWidget(不変、状態を保持しない)とStatefulWidget(可変、Stateを介して状態を管理する)です。ウィジェットツリーは階層構造であり、各子ウィジェットは親の内部にネストされています。Scaffold、AppBar、Container、Text、Column、Row — これらが基本的な構成要素です。
BuildContextは、ツリー内のウィジェットの位置を伝えるオブジェクトです。MediaQuery.of(context)は画面サイズを取得し、Theme.of(context)は現在のテーマを取得します。BuildContextは、ナビゲーション(Navigator.of(context))、InheritedWidgetへのアクセス、Localizations.ofを介したロケール翻訳に使用されます。
Impellerは、C++で記述され、Metal(iOS/macOS)とVulkan(Android)を使用するFlutterの最新レンダリングエンジンです。毎フレームをゼロから再描画していたSkiaとは異なり、Impellerはシェーダーを事前にコンパイルしてキャッシュに保存します。これにより、複雑なシーンの初回レンダリング時の遅延がなくなり、GPU負荷が軽減されます。
Google Flutterチームのテストによると、Impellerはシェーダーのコンパイル時間を200〜500ミリ秒(Skia)から1〜3ミリ秒に短縮します。iPhone 13 Proでは、Impellerのインパルスレンダリングはフレーム落ちなしで120FPSを達成します。Vulkan対応のAndroidでは、ミッドレンジデバイス(Xiaomi Redmi Note 12)でも安定した60FPSを提供します。
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Flutterアプリ')),
body: const Center(
child: Text('こんにちは、Flutter!'),
),
),
);
}
}
単一のコードベース — Flutterの主な利点です。1つのDartプロジェクトがiOS、Android、Web、Windows、macOS、Linuxにコンパイルされます。Googleによると、これにより別々のiOSとAndroidプロジェクトと比較して開発時間が30〜50%短縮されます。AlibabaはFlutterに移行後、バージョンリリース時間を30%短縮しました。
パフォーマンスはネイティブに近いものです。DartのARMおよびx86_64マシンコードへのAOTコンパイルにより、インタプリタの遅延が排除されます。Impellerエンジンは、2018年のデバイス(iPhone XR、Samsung Galaxy S9)でも60FPSを保証します。Googleによると、Flutterアプリケーションの99.5%のフレームがカクつきなくレンダリングされます。
Hot Reload — コードを即座に更新するテクノロジーです。開発者がソースコードを変更してファイルを保存すると、Flutterは現在のアプリケーション状態を失うことなく300〜800ミリ秒でウィジェットツリーを再構築します。これによりUIデザインのイテレーションが高速化され、完全な再ビルドを待たずに、マージン、色、アニメーションを秒単位で変更できます。
Material Design 3とネイティブのCupertinoデザイン言語(iOSスタイル)は、標準のFlutterパッケージに含まれています。Material 3ウィジェットは、ダイナミックカラー(Material You)、レスポンシブレイアウト、画面遷移アニメーションをサポートしています。CupertinoPageTransitionとCupertinoNavigationBarは、ネイティブのiOSナビゲーターの動作を模倣しています。
カスタマイズは、各プラットフォームでカスタムViewを作成する必要がありません。build()をオーバーライドして新しいウィジェットを返すだけです。アニメーションパッケージ(AnimatedContainer、Hero、TweenAnimationBuilder)とジェスチャパッケージ(GestureDetector、Dismissible)は、プラットフォームコードを書かずにUIアニメーションシナリオの95%をカバーします。
pub.devは、DartとFlutterの公式パッケージレジストリです。2024年7月時点で、レジストリには45,000以上のパッケージが公開されています。パッケージのインストールはflutter pub add <パッケージ名>コマンドで行います。Pubは自動的に依存関係を解決し、バージョンの互換性を確認し、pubspec.lockを生成します。
Flutterにおける状態管理は、主要なアーキテクチャ上の課題の1つです。flutter_bloc以外にも、人気のあるソリューションには、Provider(Google推奨、InheritedWidgetを使用)、Riverpod(コンパイル時の安全性を備えたProviderの再設計版)、GetX(状態、ルーティング、DIを一体化)があります。Providerは最もシンプルで、ChangeNotifierProviderがモデルをラップし、Consumerがデータ変更時にウィジェットを再構築します。
Flutterのテストは3つのレベルでサポートされています。単体テスト(flutter test)はUIなしで関数とクラスをテストします。ウィジェットテスト(testWidgets)は分離された環境で個々のウィジェットをレンダリングします。統合テスト(IntegrationTest)はデバイスまたはシミュレータで完全なアプリケーションを実行します。Flutter 3.22は、パッチ分析と改善されたコードカバレッジレポートを通じてパッチテストのサポートを追加しました。
dioは、インターセプター、タイムアウト、FormDataをサポートするHTTPクライアントです。GitHubのFlutterプロジェクトの40%で使用されています。Dioは、ロギング、リトライ、認証トークン追加のためのリクエストインターセプトをサポートしています。2番目に人気のあるライブラリはretrofitで、型付けされたAPIクライアントを生成します。
flutter_blocは、BLoC(Business Logic Component)パターンに基づく状態管理ライブラリです。BlocProviderはウィジェットツリーの下位に状態を渡し、BlocBuilderは状態変更時にUIを再構築し、BlocListenerは副作用(ナビゲーション、SnackBar)を処理します。CubitはイベントなしのBLoCの簡略版です。
go_routerはGoogleによるFlutterの宣言的ナビゲーションです。ルートはGoRouter設定で記述され、ネストされたルート、リダイレクト、ディープリンクをサポートします。ShellRouteはBottomNavigationBarのタブ間でナビゲーションを分割します。GoRouter 14.0は型安全なパスとタブ状態を保持するStatefulShellRouteをサポートしています。
| パッケージ | インストール数/月 | 目的 |
|---|---|---|
| dio | 12M+ | インターセプター付きHTTPクライアント |
| flutter_bloc | 8M+ | 状態管理(BLoC) |
| go_router | 5M+ | 宣言的ナビゲーション |
| firebase_core | 10M+ | Firebase統合 |
よくある質問
FlutterはDart言語を使用しています。Dart 3.xはnull safety、パターンマッチング、sealed class、recordsをサポートしています。FlutterエンジンはC/C++で記述されていますが、開発者はアプリケーションを専らDartで記述します。さらに、カスタムプラットフォームチャネル(Platform Channels)を使用してSwift/Kotlinコードを呼び出すこともできます。
選択はプロジェクトによります。FlutterはAOTコンパイルと独自のレンダリングエンジンにより高いパフォーマンスを提供します。React Nativeは広大なJavaScriptエコシステムへのアクセスを提供し、既存のWebコードを利用できます。Flutterはフレームレートでリードし、React Nativeは既製ライブラリの数でリードしています。
はい、Flutter for WebはDartをJavaScript/DOMまたはWebAssemblyにコンパイルします。Web版はレスポンシブレイアウト、ルーティング、カスタムCanvas要素をサポートしています。ただし、複雑なSEO要件の場合、Flutter WebはサーバーサイドレンダリングとネイティブHTMLがないため、従来のReact/Vueプロジェクトに劣ります。
FlutterFlowは、Flutterアプリケーションを視覚的に作成するためのローコードプラットフォームです。開発者はドラッグアンドドロップでUIを構築し、ビジュアルエディターでロジックを設定し、完成したDartコードをエクスポートします。FlutterFlowはプロトタイプやシンプルなアプリケーションに使用されますが、手動コードのカスタマイズには及びません。
GoogleはGoogle Pay、Google Classroom、Google NestでFlutterを使用しています。その他の主要プロジェクトには、Alibaba(1億ユーザーのXianyuアプリ)、eBay(モバイルアプリ)、BMW(iDriveインターフェース)、Tencent(Qidian)、Toyota(インフォテインメントシステム)が含まれます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。