Can Riverpod do what Get_it can do?

Rex Cole
3 min readNov 25, 2024

Yes, Riverpod can achieve everything that get_it can, but there are some fundamental differences in how the two approaches work. Whether Riverpod is a good replacement for get_it depends on your preferences, project requirements, and architectural style. Let’s break this down:

Key Features Comparison

How Riverpod Matches get_it

1. Registering Dependencies

In get_it, you register services like this:

final getIt = GetIt.instance;
void setup() {
getIt.registerLazySingleton<ApiService>(() => ApiService());
}

In Riverpod, you create providers for your services:

final apiServiceProvider = Provider<ApiService>((ref) => ApiService());

2. Accessing Dependencies

In get_it:

final apiService = getIt<ApiService>();

In Riverpod (using ConsumerWidget or hooks):

final apiService = ref.watch(apiServiceProvider);

Advantages of Riverpod Over get_it

  1. Scoped Dependencies
    Riverpod allows you to override providers in a specific widget tree. This is great for modular designs and testing:
runApp(
ProviderScope(
overrides: [
apiServiceProvider.overrideWithValue(MockApiService()),
],
child: MyApp(),
),
);

2. State Management
While get_it is only a service locator, Riverpod is a state management library that natively supports reactive programming.

3. Compile-Time Safety
Riverpod ensures that providers are type-safe and avoids common errors like forgetting to register dependencies.

4. Dependency Hierarchies
Riverpod allows dependencies between providers. For example:

final authTokenProvider = Provider<String>((ref) => 'token123');
final apiServiceProvider = Provider<ApiService>(
(ref) => ApiService(ref.watch(authTokenProvider)),
);

5. Testing
Riverpod’s ProviderContainer makes it easy to test providers in isolation:

final container = ProviderContainer(overrides: [
apiServiceProvider.overrideWithValue(MockApiService()),
]);
final apiService = container.read(apiServiceProvider);

Limitations of Riverpod Compared to get_it

  1. Learning Curve
    Riverpod is more complex than get_it due to its reactive and scoped design. If all you need is a simple service locator, get_it might feel more intuitive.
  2. Explicitness
    get_it is straightforward and concise for registering and accessing dependencies. Riverpod requires setting up providers, which can feel verbose for simple use cases.
  3. Global Singleton-Like Access
    With get_it, you can access services anywhere without needing context or providers. Riverpod requires a ProviderScope or a ref in the widget tree.

When to Use Riverpod Instead of get_it

  • You need state management alongside dependency injection.
  • You prefer reactive programming.
  • You value scoping and compile-time safety.
  • You need better testing support with provider overrides.
  • You want dependency chaining to manage complex setups.

When to Use get_it Instead of Riverpod

  • You want a lightweight service locator.
  • Your project has minimal state management needs.
  • You prefer a simpler API for registering and retrieving services.
  • You don’t need scoped dependencies or reactive features.

Conclusion

Riverpod is a superset of get_it in functionality. It can handle dependency injection like get_it while also providing state management, scoping, and a more structured approach. However, if you only need a simple and lightweight service locator, get_it may be easier to use.

For advanced and scalable apps, Riverpod offers significant advantages with its reactive and scoped design.

--

--

No responses yet