dependencies is a Flutter package for managing dependencies and initializing them before the app starts. It provides easy access to dependencies and logs initialization times for performance tracking.
depend
is a library for managing dependencies in Flutter applications. It provides a convenient way to initialize and access services or repositories via an InheritedWidget
.
Add the package to your pubspec.yaml
:
dependencies: depend: ^0.0.1
Then run:
$ flutter pub get
DependenciesLibrary
Create a DependenciesLibrary
that extends DependenciesLibrary
and initializes your dependencies:
class RootLibrary extends DependenciesLibrary { late final ApiService apiService; Future<void> init() async { await log(() async => apiService = await ApiService().init()); } }
Use DependenciesInit
to initialize your dependencies before launching the app:
void main() { runApp( Dependencies<RootLibrary>( library: RootLibrary(), placeholder: const ColoredBox( color: Colors.white, child: Center(child: CircularProgressIndicator()), ), child: const MyApp(), ), ); }
InheritedWidget
Once initialized, dependencies can be accessed from anywhere in the widget tree using Dependencies.of(context).authRepository
:
/// The repository for the example final class AuthRepository { final AuthDataSource dataSource; AuthRepository({required this.dataSource}); Future<String> login() => dataSource.login(); } class MyApp extends StatelessWidget { const MyApp({super.key}); Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: Dependencies<ModuleLibrary>( library: ModuleLibrary( parent: Dependencies.of<RootLibrary>(context), ), child: BlocProvider( create: (context) => DefaultBloc( Dependencies.of<ModuleLibrary>(context).authRepository, ), child: const MyHomePage(), ), ), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key}); State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { void _login() { context.read<DefaultBloc>().add(DefaultEvent()); } Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: SingleChildScrollView( child: Column( children: [ BlocBuilder<DefaultBloc, DefaultState>( builder: (context, state) { return Text('Login: ${state.authorized}'); }, ), Builder( builder: (context) { return ElevatedButton( onPressed: _login, child: const Text('Login'), ); }, ) ], ), ), ), ); } }
class RootLibrary extends DependenciesLibrary { late final ApiService apiService; Future<void> init() async { apiService = await ApiService().init(); } } class ModuleLibrary extends DependenciesLibrary<RootLibrary> { late final AuthRepository authRepository; ModuleLibrary({required super.parent}); Future<void> init() async { // initialize dependencies authRepository = AuthRepository( dataSource: AuthDataSource( apiService: parent.apiService, // parent - RootLibrary ), ); } }
During initialization, each dependency logs the time it took to initialize:
class ModuleLibrary extends DependenciesLibrary<RootLibrary> { late final AuthRepository authRepository; ModuleLibrary({required super.parent}); Future<void> init() async { await log(() async => authRepository = AuthRepository( dataSource: AuthDataSource( apiService: parent.apiService, ), )); } }
š” ApiService: initialized successfully for 10 ms š” AuthRepository: initialized successfully for 0 ms
This is useful for tracking performance and initialization times.