I learn using Riverpod by following tips that I find online. Several sources spoke about dependency injection. This is an example of my implementation at the repository level:
@riverpod
UserRepository userRepository(UserRepositoryRef ref) {
final Database db = ref.watch(databaseProvider);
return UserRepository(
db: db,
);
}
class UserRepository {
UserRepository({
required Database db,
}) : _db = db;
final Database _db_;
// ...
}
But now I try to inject this repository into my controller, which is an AsyncNotifierProvider. This is what it looks like so far:
@riverpod
class UserController extends _$UserController {
final UserRepository _userRepository = UserRepository(db: Database());
@override
FutureOr<void> build() {}
// ...
}
The first problem is that I'm not calling the repository via the userRepositoryProvider. I can't use ref when defining a field the way I do. The second problem is that I have no dependency injection.
I try adding a constructor with a parameter, but it generates an error so I guess that's not the right way to do.
So how should I do dependency injection in NotifierProvider and AsyncNotifierProvider ?
Whenever you want to access
UserRepositoryinUserController, you access it using theRefobject.Refis a property ofAsyncNotifier.