Question #16MediumState Management

Getx Get.find vs Get.put

#getx

Answer

Overview

text
Get.put()
registers a dependency, and
text
Get.find()
retrieves an already-registered dependency. They are the two sides of GetX's dependency injection.


Get.put() — Register

text
Get.put()
registers a new instance into GetX's DI container. Creates it immediately.

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()
retrieves an already-registered instance from GetX's DI container.

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
Get.put()
text
Get.find()
Creates new instance✅ Yes❌ No
Needs existing registration❌ No✅ Yes
Return valueThe instanceThe instance
Fails if not registeredN/A❌ Throws error
Use caseRegister DIRetrieve 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

MethodDescription
text
Get.put()
Register + create immediately
text
Get.lazyPut()
Register, create on first find
text
Get.find()
Retrieve existing instance
text
Get.delete<T>()
Remove from DI container
text
Get.isRegistered<T>()
Check if registered
text
Get.replace<T>()
Replace existing instance

Rule:

text
Get.put()
= register.
text
Get.find()
= retrieve. Never call
text
Get.find()
before registering with
text
Get.put()
or
text
Get.lazyPut()
.