D
BLoC PatternEasy20 XP3 min read

What is RepositoryProvider and how does it relate to BlocProvider?

TL;DR: RepositoryProvider makes a repository available to all widgets and Blocs below it in the tree. BlocProvider can then read the repository via context.read<MyRepo>() in its create function.

Full Answer

RepositoryProvider is the dependency injection mechanism for flutter_bloc. It's identical to BlocProvider but semantically for non-Bloc objects (repositories, services).

  • RepositoryProvider: Provides a repository; does NOT close it when removed (repos are long-lived)
  • MultiRepositoryProvider: Flattens nested RepositoryProviders
  • context.read<QuestionsRepository>(): Access repository from any descendant widget or BlocProvider.create
🎯

Place RepositoryProviders above BlocProviders in the tree. This way, BlocProvider.create can use context.read<Repo>() to inject dependencies without accessing getIt.

Code Examples

dartRepository + Bloc provider layering
Output
// QuestionsRepository provided above QuizBloc
// QuizBloc accesses it via context.read<QuestionsRepository>()

Common Mistakes

  • Creating repositories inside BlocProvider.create — repositories should outlive blocs
  • Using RepositoryProvider for Blocs — semantically wrong; use BlocProvider which auto-closes on removal

Interview Tip

💡

The layering is: RepositoryProvider (top) -> BlocProvider (uses repos) -> Widgets (uses blocs). Each layer depends only on the layer above it.

#repository-provider#bloc-provider#dependency-injection#context