Search
Duplicate
moon
sun

GetX

๐Ÿš€ GetX

: Flutter ์ƒํƒœ๊ด€๋ฆฌ, ๋ผ์šฐํŒ…, ์˜์กด์„ฑ ์ฃผ์ž… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
GetX๋Š” Flutter์—์„œ ์ƒํƒœ๊ด€๋ฆฌ, ๋ผ์šฐํŒ…, ์˜์กด์„ฑ ์ฃผ์ž…(DI) ์„ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๐Ÿ”ฅ GetX์˜ ์ฃผ์š” ํŠน์ง•

โœ… ๊ฐ„๋‹จํ•œ ์ƒํƒœ๊ด€๋ฆฌ โ†’ obs(Observable) ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ์ž๋™ ์—…๋ฐ์ดํŠธ
โœ… ๋น ๋ฅธ ์„ฑ๋Šฅ โ†’ ์ตœ์†Œํ•œ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋จ
โœ… ๋ผ์šฐํŒ… ๊ด€๋ฆฌ โ†’ Get.to(), Get.off()๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ™”๋ฉด ์ด๋™
โœ… ์˜์กด์„ฑ ์ฃผ์ž…(DI) โ†’ Get.put(), Get.find()๋กœ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ฃผ์ž…
โœ… ๋ณ„๋„์˜ context ๋ถˆํ•„์š” โ†’ BuildContext ์—†์ด UI ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
โœ… ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ ์ง€์› โ†’ ๋ชจ๋ฐ”์ผ, ์›น, ๋ฐ์Šคํฌํ†ฑ๊นŒ์ง€ ์ง€์›

๐Ÿ›  GetX ์„ค์น˜

flutter pub add get
Shell
๋ณต์‚ฌ
๋˜๋Š”
dependencies: get: latest_version
YAML
๋ณต์‚ฌ

๐Ÿ’ก GetX ์ƒํƒœ๊ด€๋ฆฌ ์‚ฌ์šฉ๋ฒ•

1๏ธโƒฃ ๊ฐ„๋‹จํ•œ ์ƒํƒœ๊ด€๋ฆฌ (obs ์‚ฌ์šฉ)

import 'package:flutter/material.dart'; import 'package:get/get.dart'; class CounterController extends GetxController { var count = 0.obs; // Observable ๋ณ€์ˆ˜ void increment() => count++; } void main() { runApp(GetMaterialApp(home: CounterScreen())); // GetMaterialApp ์‚ฌ์šฉ } class CounterScreen extends StatelessWidget { final CounterController controller = Get.put(CounterController()); // ์˜์กด์„ฑ ์ฃผ์ž… Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('GetX Counter')), body: Center( child: Obx(() => Text('Count: ${controller.count}', style: TextStyle(fontSize: 24))), ), floatingActionButton: FloatingActionButton( onPressed: controller.increment, child: Icon(Icons.add), ), ); } }
Dart
๋ณต์‚ฌ
โœ… obs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , Obx ์œ„์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ UI ์ž๋™ ์—…๋ฐ์ดํŠธ!
โœ… Get.put()์œผ๋กœ Controller๋ฅผ ์ „์—ญ์—์„œ ๊ด€๋ฆฌ

2๏ธโƒฃ GetBuilder ์‚ฌ์šฉ (์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ)

class CounterController extends GetxController { int count = 0; void increment() { count++; update(); // UI ์—…๋ฐ์ดํŠธ } } class CounterScreen extends StatelessWidget { Widget build(BuildContext context) { return GetBuilder<CounterController>( init: CounterController(), builder: (controller) => Scaffold( body: Center(child: Text('Count: ${controller.count}')), floatingActionButton: FloatingActionButton( onPressed: controller.increment, child: Icon(Icons.add), ), ), ); } }
Dart
๋ณต์‚ฌ
โœ… GetBuilder๋Š” ํ•„์š”ํ•œ ์œ„์ ฏ๋งŒ ๋ฆฌ๋ Œ๋”๋ง ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ!
โœ… Obx์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, ๋” ์ ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ

๐ŸŒ GetX ๋ผ์šฐํŒ… (ํŽ˜์ด์ง€ ์ด๋™)

1๏ธโƒฃ GetX ๋ผ์šฐํŒ… ์„ค์ •

void main() { runApp(GetMaterialApp( initialRoute: '/', getPages: [ GetPage(name: '/', page: () => HomeScreen()), GetPage(name: '/second', page: () => SecondScreen()), ], )); }
Dart
๋ณต์‚ฌ

2๏ธโƒฃ ํŽ˜์ด์ง€ ์ด๋™ (Get.to(), Get.off())

class HomeScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( body: Center(child: ElevatedButton( onPressed: () => Get.to(SecondScreen()), // ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ์ด๋™ child: Text('Go to Second Page'), )), ); } } class SecondScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( body: Center(child: ElevatedButton( onPressed: () => Get.off(HomeScreen()), // ๋’ค๋กœ๊ฐ€๊ธฐ ์—†์ด ์ด๋™ child: Text('Back to Home'), )), ); } }
Dart
๋ณต์‚ฌ
โœ… Get.to(NextScreen()) โ†’ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ด๋™
โœ… Get.off(NextScreen()) โ†’ ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ด๋™
โœ… Get.offAll(NextScreen()) โ†’ ๋ชจ๋“  ์ด์ „ ํŽ˜์ด์ง€ ์ œ๊ฑฐ ํ›„ ์ด๋™

๐Ÿ”„ GetX ์˜์กด์„ฑ ์ฃผ์ž… (DI)

1๏ธโƒฃ ์ฆ‰์‹œ ์ฃผ์ž… (Get.put())

final CounterController controller = Get.put(CounterController());
Dart
๋ณต์‚ฌ
โ€ข
์•ฑ์ด ์‹คํ–‰๋˜๋ฉด ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ฆ‰์‹œ ์ƒ์„ฑ๋จ

2๏ธโƒฃ ์ง€์—ฐ ์ฃผ์ž… (Get.lazyPut())

Get.lazyPut<CounterController>(() => CounterController());
Dart
๋ณต์‚ฌ
โ€ข
ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ฐ์ฒด ์ƒ์„ฑ (๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ)

3๏ธโƒฃ ์˜๊ตฌ์ ์ธ ๊ฐ์ฒด (Get.putAsync())

Get.putAsync<CounterController>(() async => CounterController());
Dart
๋ณต์‚ฌ
โ€ข
๋น„๋™๊ธฐ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ

๐Ÿ†š GetX vs Bloc vs Provider vs Riverpod ๋น„๊ต

๊ธฐ๋Šฅ
GetX
Bloc
Provider
Riverpod
์ƒํƒœ ๊ด€๋ฆฌ
โœ… ๊ฐ„ํŽธํ•จ (obs, GetBuilder)
โœ… ๊ตฌ์กฐ์  (Cubit, Bloc)
โœ… ๊ธฐ๋ณธ (ChangeNotifier)
โœ… ๊ฐ•๋ ฅํ•จ (StateNotifier, Notifier)
๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ
โœ… RxDart ์—†์ด ๊ฐ€๋Šฅ (FutureBuilder ์—†์ด๋„ ๊ฐ€๋Šฅ)
โœ… BlocObserver, Cubit ๋“ฑ ์ง€์›
โŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์› X (FutureBuilder ์‚ฌ์šฉํ•ด์•ผ ํ•จ)
โœ… FutureProvider, AsyncNotifier ์ œ๊ณต
์˜์กด์„ฑ ์ฃผ์ž… (DI)
โœ… Get.put(), Get.find()
โœ… RepositoryProvider, MultiBlocProvider
โŒ DI ๊ธฐ๋ณธ ์ง€์› ์—†์Œ (Provider ์ง์ ‘ ์ฃผ์ž…)
โœ… Provider ๊ธฐ๋ฐ˜ DI ์‚ฌ์šฉ (ref.read(), ref.watch())
๋ผ์šฐํŒ… ๊ด€๋ฆฌ
โœ… Get.to(), Get.off()
โŒ ์—†์Œ
โŒ ์—†์Œ
โŒ ์—†์Œ
์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ
โœ… Get.put()์œผ๋กœ ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅ
โœ… ๊ฐ€๋Šฅ (BlocProvider)
โœ… ๊ฐ€๋Šฅ (MultiProvider)
โœ… ProviderScope ์‚ฌ์šฉ
๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›
โœ… ๊ฐ€๋Šฅ (RxDart ์—†์ด๋„ ๋ฐ˜์‘ํ˜• ๊ฐ€๋Šฅ)
โœ… ๊ฐ•๋ ฅํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜
โŒ ์ œํ•œ์ 
โœ… ๊ฐ€๋Šฅ (watch(), listen())
์ฝ”๋“œ ๋ณต์žก๋„
โœ… ์‰ฌ์›€ (๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ ์Œ)
โŒ ๊ฐ€์žฅ ๋ณต์žกํ•จ
โŒ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๋งŽ์Œ
โŒ ๋น„๊ต์  ๋ณต์žกํ•จ
์„ฑ๋Šฅ ์ตœ์ ํ™”
โœ… ์šฐ์ˆ˜ (GetBuilder ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
โœ… ์šฐ์ˆ˜ (BlocListener, BlocObserver)
โŒ ๋น„๊ต์  ๋‚ฎ์Œ
โœ… ์šฐ์ˆ˜ (watch(), read())
๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ
โœ… ๋†’์€ ์„ฑ๋Šฅ (Get.lazyPut() ์ง€์›)
โœ… ์ด๋ฒคํŠธ ๋‹จ์œ„๋กœ ์ƒํƒœ ์œ ์ง€
โŒ ํ•ญ์ƒ ์ธ์Šคํ„ด์Šค ์œ ์ง€
โœ… ํ•„์š”ํ•  ๋•Œ๋งŒ ์ดˆ๊ธฐํ™” (lazy initialization)
ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ
โŒ ์ƒ๋Œ€์ ์œผ๋กœ ๋ถ€์กฑ
โœ… ๊ฐ€์žฅ ์šฐ์ˆ˜
โœ… ๋น„๊ต์  ์‰ฌ์›€
โœ… ๋งค์šฐ ์šฐ์ˆ˜
์•ฑ ํฌ๊ธฐ ์˜ํ–ฅ
โœ… ๊ฐ€์žฅ ๊ฐ€๋ฒผ์›€
โŒ ๊ฐ€์žฅ ๋ฌด๊ฑฐ์›€
โŒ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌด๊ฑฐ์›€
โœ… ๊ฐ€๋ฒผ์›€
Flutter ๊ณต์‹ ์ง€์›
โŒ ๋น„๊ณต์‹
โœ… Flutter ํŒ€ ๊ณต์‹ ์ง€์›
โœ… ๊ณต์‹ ํŒจํ‚ค์ง€
โœ… ๊ณต์‹ ํŒจํ‚ค์ง€
๋Œ€๊ทœ๋ชจ ์•ฑ ์ ํ•ฉ์„ฑ
โŒ ์ž‘์€ ์•ฑ์— ์ ํ•ฉ
โœ… ๋Œ€๊ทœ๋ชจ ์•ฑ์— ๊ฐ€์žฅ ์ ํ•ฉ
โœ… ๊ฐ€๋Šฅ
โœ… ์ค‘ยท๋Œ€๊ทœ๋ชจ ์•ฑ ๊ฐ€๋Šฅ

๐ŸŽฏ GetX๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

โœ… ์ƒํƒœ๊ด€๋ฆฌ + ๋ผ์šฐํŒ… + ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ
โœ… BuildContext ์—†์ด UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ์„ ๋•Œ
โœ… ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šด ํผํฌ๋จผ์Šค ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
โœ… ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์›ํ•  ๋•Œ
๐Ÿ‘‰ ๊ฒฐ๋ก : GetX๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ Flutter ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜! ๐Ÿš€