GetX — Flutter向けの軽量マイクロフレームワークで、状態管理、ナビゲーション、依存性注入を1つのパッケージに統合します。Amir Hossein Abdorashidiによって開発されたGetXは、最小限のboilerplateを提供します:Streamなし、ChangeNotifierなし、ナビゲーションにBuildContext不要。pub.devによると、GetXは13,000以上のいいねを獲得し、最も人気のあるFlutterパッケージの1つになっています。
重要なポイント
GetX — Flutter向けのオールインワンマイクロフレームワークで、状態管理、ナビゲーション(ルーティング)、依存性注入(DI)の3つの主要な開発タスクを解決します。GetXはStream、ChangeNotifier、Builders、サブスクリプションを必要としません — すべてのリアクティビティはGetValueとGetStreamに基づくRxラッパーによって提供され、ChangeNotifierよりも数十倍高速に動作します。
GetXはProvider + Navigator + get_it/kiwiの組み合わせの代替として位置づけられています。3つの異なるパッケージをインストールして10行の設定を書く代わりに、GetXは1行ですべてを即座に提供します:GetMaterialAppの代わりにMaterialApp。ナビゲーションはGet.to(NextScreen())でBuildContext不要で機能し、DIはGet.put(Service())でProviderツリー不要で機能します。
Flutter Community Survey 2025によると、GetXはFlutterプロジェクトの43%で使用されています。選択される主な理由:最小限の参入障壁(習得に5分)、boilerplateなし(ProviderやBLoCと比較してコードが60-70%削減)、高速なMVP開発。批評家は関心の分離の原則の違反とデバッグの複雑さを指摘しています。
Obx — Rx変数が変更されたときに再構築するリアクティブなGetXウィジェット。Obxはサブスクリプション、dispose、Builder関数を必要としません — ウィジェットをObxでラップして内部でRx変数を使用するだけです。ObxはどのRx変数が使用されているかを自動的に追跡し、それらが変更されたときのみ再描画します。
class CounterController extends GetxController {
final count = 0.obs;
void increment() => count++;
}
class CounterScreen extends StatelessWidget {
final controller = Get.put(CounterController());
@override
Widget build(context) => Obx(() => Text('${controller.count}'));
}Rx変数: .obs — 任意の値をRxオブジェクトにラップするゲッター。GetXは型付きRxクラスを提供します:RxInt、RxString、RxDouble、RxBool、RxList、RxMap。すべてのRx変数は通常のプリミティブのように動作します:count++、name.value = 'Hello'、items.add(item)。変更は自動的にObxサブスクライバーに通知します。
GetBuilder — RxなしのObxの代替で、手動のupdate()呼び出しで動作します。GetBuilder.filter — IDキーによるターゲット更新用。Obxは高速(自動依存関係追跡)、GetBuilderはより予測可能(明示的な更新呼び出し)。シンプルなシナリオにはObx、多くの依存関係を持つ複雑なウィジェットにはGetBuilderが推奨されます。
GetxController — ライフサイクルサポート付きのビジネスロジック用ベースクラス。GetxControllerにはメソッドがあります:onInit()(初期化)、onReady()(最初のフレーム後)、onClose()(リソースクリーンアップ)。ChangeNotifierやStateNotifierとは異なり、GetxControllerはサブスクリプションを自動的に管理します:ページが破棄されると、すべてのRx変数とWorkersのサブスクリプションが解除されます。
class AuthController extends GetxController {
final user = Rx<User?>(null);
final isLoading = false.obs;
@override
void onInit() {
ever(isLoading, (_) => print('Loading: $isLoading'));
super.onInit();
}
Future<void> login(String email, String password) async {
isLoading.value = true;
user.value = await api.login(email, password);
isLoading.value = false;
}
}Workers — リアクティブなGetXユーティリティ:ever(変更ごとに呼び出し)、once(最初の変更のみ)、debounce(遅延付き)、interval(毎秒N回以下)。Workersは一般的なタスクを解決します:フィールド検証(debounce)、分析(once)、同期(ever)。WorkersはonClose()が呼び出されると自動的にサブスクリプションを解除し、メモリリークを防ぎます。
GetXナビゲーションは画面間の遷移にBuildContextを必要としません。Navigator.push(context, MaterialPageRoute(...))の代わりに、Get.to(NextScreen())を使用します — BuildContextアクセスなしのControllerを含め、どこからでも呼び出せます。GetXは名前付きルート、アニメーション、ミドルウェア、MaterialPageRouteなしの引数渡しをサポートします。
// 標準ナビゲーション
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // 現在のルートを置き換え
Get.offAll(HomeScreen()); // スタックをクリア
// 名前付きルート
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');
// ミドルウェア
GetPage(
name: '/profile',
page: () => ProfileScreen(),
middlewares: [AuthMiddleware()],
)GetPageとGetPages: GetXはMaterialAppのroutesの代わりにGetPagesを使用します。Middleware — 画面に入る前の認証チェック、リダイレクト、分析。Transition — 組み込みトランジションアニメーション:fadeIn、zoom、leftToRight、topToBottom。Bindings — ルートに入るときにControllerと依存関係を初期化するクラス。Bindingsは遅延初期化の問題を解決します:Controllerは画面が開かれたときのみ作成されます。
Get.put — DIコンテナにインスタンスを登録します。Get.find — コンテナからインスタンスを取得します。Get.lazyPut — 遅延初期化(最初のfind呼び出しで作成)。Get.putAsync — 非同期初期化(initありのサービス用)。Get.delete — コンテナから削除します(ルートが破棄されるとBindingsによって自動的に呼び出されます)。
| メソッド | 作成タイミング | 削除タイミング |
|---|---|---|
| Get.put | 即時 | Get.deleteまたはonClose |
| Get.lazyPut | 最初のfind時 | Get.deleteまたはonClose |
| Get.putAsync | Future完了後 | Get.deleteまたはonClose |
| Get.create | findごと(新規ファクトリ) | なし |
GetX DI — Flutterで最もシンプルなDIコンテナ。Providerツリーなし、Moduleなし、Scopeなし。Get.put(Repository())をControllerまたはmain.dartで行うと、Get.find<Repository>()を介してアプリ内のどこからでもオブジェクトにアクセスできるようになります。GetX DIはタグ付け(tag: 'api')と永続性(permanent: true)もサポートしており、削除を防ぎます。
GetXのパフォーマンスは、Flutter向けに最適化されたカスタムStream実装であるGetStreamを介して動作するRxラッパーに基づいています。GetXのベンチマークによると、Rx変数は頻繁な更新(30+fps)においてChangeNotifierより2-3倍、BLoCより5-7倍高速です。GetXはサブスクリプションにBuildContextを使用しないため、ナビゲーション中のウィジェットツリーの再構築を排除します。
ベストプラクティス: 多くの子要素(リスト、テーブル)を持つウィジェットにはObxの代わりにGetBuilderを使用します。ページごとに1つの巨大なControllerではなく、Controllerを機能モジュールごとに分割します。Controllerの初期化にはbuildメソッドでのGet.putではなくBindingsを使用します。GetView — Get.findなしでcontrollerを介してControllerにアクセスできる省略されたStatelessWidget。
既知の制限: GetXはグローバル変数(Get.find、Get.to)を使用するため、テストが複雑になる可能性があります。GetXを介した依存関係のモックには、テスト間でのGet.replace()またはGet.reset()が必要です。分離のためには、Get.testMode = trueが推奨されます。GetXは、明確なレイヤー境界を持つ厳格なアーキテクチャを必要とするアプリケーションには推奨されません — その場合は、コード生成付きのBLoCまたはRiverpodが適しています。
よくある質問
GetX — 独自のDI、ナビゲーション、Rxリアクティビティを備えたマイクロフレームワーク。Provider — ChangeNotifierとInheritedWidgetを介した状態管理のみ。GetXはBuildContextを必要とせず、組み込みのナビゲーションとDIを備えており、boilerplateを60-70%削減します。Providerは標準のFlutter Navigatorを使用し、DIにはサードパーティのソリューションが必要です。GetXは開発が高速で、ProviderはネイティブFlutter APIに近いです。
Workers — Rx変数の変更をリアクティブに処理するためのユーティリティ。ever — 変更ごとにコールバック、once — 最初の変更のみ、debounce — 遅延付き(検索フィールド用)、interval — N回以下(分析用)。WorkersはGetxControllerのonInit()で宣言され、onClose()で自動的にサブスクリプションが解除されます。これにより、ChangeNotifierを使った手動のaddListener/removeListenerが不要になります。
GetXはテストモードを有効にするためにGet.testMode = trueを提供します。依存関係はGet.replace<Service>(mockService)を介して置き換えられます。テスト間では、DIコンテナをクリアするためにGet.reset()が呼び出されます。ControllerはFlutterなしで直接テストされます:final c = CounterController(); c.increment(); expect(c.count.value, 1)。Obx付きウィジェットの場合は、InjectMockerとともにtester.pumpWidgetを使用します。
GetXはあらゆる規模のプロジェクトに適していますが、規律が必要です。大規模プロジェクト(10+画面)では、以下を使用します:Controller分離のためのBindings、機能ごとのGetPagesファイルとしてのモジュール、build内の手動Get.findの代わりにGetView。主なリスクはグローバルアクセスの乱用です(どこでもGet.find)。厳格なコードレビューとアーキテクチャガイドラインがこの問題を解決します。何百万ものユーザーを持つ多くのプロダクションアプリケーションがGetXで動作しています。
Bindings — ルートをその依存関係に接続するクラス。画面に入るとき、BindingはGet.lazyPutを介してControllerとサービスを作成し、終了時に削除します。Bindingsは遅延初期化を実装します:画面が開かれるまでControllerはメモリに存在しません。これによりRAMとアプリの起動時間を節約します。GetPageで宣言されます:GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding())。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。