Answer
Overview
text
Get.put()text
Get.find()Get.put() — Register
text
Get.put()dart// Register controller (creates it now) Get.put(HomeController()); Get.put(ApiService(), permanent: true); // Never disposed Get.put(LogController(), tag: 'debug'); // Chain: returns the instance final controller = Get.put(CounterController()); controller.increment();
Get.find() — Retrieve
text
Get.find()dart// Retrieve previously registered controller final controller = Get.find<HomeController>(); // With tag final debug = Get.find<LogController>(tag: 'debug'); // Inside a widget class ProductCard extends StatelessWidget { Widget build(BuildContext context) { final cart = Get.find<CartController>(); // Get existing instance return ElevatedButton( onPressed: () => cart.addItem(product), child: Text('Add to Cart'), ); } }
Comparison Table
| Feature | text | text |
|---|---|---|
| Creates new instance | ✅ Yes | ❌ No |
| Needs existing registration | ❌ No | ✅ Yes |
| Return value | The instance | The instance |
| Fails if not registered | N/A | ❌ Throws error |
| Use case | Register DI | Retrieve DI |
Common Pattern
dart// 1. Register once (e.g., in main or Binding) Get.put(AuthController()); Get.put(ApiService(), permanent: true); // 2. Find anywhere in your app class LoginScreen extends StatelessWidget { Widget build(BuildContext context) { final auth = Get.find<AuthController>(); // ✅ Retrieve return ElevatedButton( onPressed: () => auth.signIn(email, password), child: Text('Login'), ); } }
Avoid Double Registration
dart// ❌ This throws if HomeController is already registered Get.put(HomeController()); // First time — OK Get.put(HomeController()); // Second time — throws! // ✅ Check first if (!Get.isRegistered<HomeController>()) { Get.put(HomeController()); } // Or use putOrFind pattern final controller = Get.isRegistered<HomeController>() ? Get.find<HomeController>() : Get.put(HomeController());
Quick Reference — All GetX DI Methods
| Method | Description |
|---|---|
text | Register + create immediately |
text | Register, create on first find |
text | Retrieve existing instance |
text | Remove from DI container |
text | Check if registered |
text | Replace existing instance |
Rule:
= register.textGet.put()= retrieve. Never calltextGet.find()before registering withtextGet.find()ortextGet.put().textGet.lazyPut()