Last active
July 12, 2022 18:18
-
-
Save magicleon94/220ee365a84c1331002054b803e76465 to your computer and use it in GitHub Desktop.
Lazy dependency injection template
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:dio/dio.dart'; | |
import 'package:dio/src/dio.dart'; | |
import 'package:my_test_app/config/application_config.dart'; | |
import 'package:my_test_app/dependency_injection/dependency_injector_base.dart'; | |
import 'package:my_test_app/features/login/login_bloc.dart'; | |
import 'package:my_test_app/features/login/login_service.dart'; | |
import 'package:my_test_app/features/splash/splash_bloc.dart'; | |
import 'package:my_test_app/features/splash/splash_service.dart'; | |
class DependencyInjector extends DependencyInjectorBase { | |
final Dio _dio = Dio( | |
BaseOptions( | |
baseUrl: ApplicationConfig.BASE_URL, | |
), | |
); | |
SplashBloc _splashBloc; | |
SplashService _splashService; | |
LoginBloc _loginBloc; | |
LoginService _loginService; | |
@override | |
Dio get dio => _dio; | |
@override | |
SplashBloc get splashBloc { | |
_splashBloc = buildIfDisposed(_splashBloc, () => SplashBloc(splashService)); | |
return _splashBloc; | |
} | |
@override | |
SplashService get splashService { | |
_splashService = buildIfDisposed(_splashService, () => SplashService(dio)); | |
return _splashService; | |
} | |
@override | |
LoginBloc get loginBloc => | |
buildIfDisposed(_loginBloc, () => LoginBloc(loginService)); | |
@override | |
LoginService get loginService => | |
buildIfDisposed(_loginService, () => LoginService(dio)); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:dio/dio.dart'; | |
import 'package:my_test_app/common/disposable.dart'; | |
import 'package:my_test_app/features/login/login_bloc.dart'; | |
import 'package:my_test_app/features/login/login_service.dart'; | |
import 'package:my_test_app/features/splash/splash_bloc.dart'; | |
import 'package:my_test_app/features/splash/splash_service.dart'; | |
abstract class DependencyInjectorBase { | |
Dio get dio; | |
SplashBloc get splashBloc; | |
SplashService get splashService; | |
LoginBloc get loginBloc; | |
LoginService get loginService; | |
Disposable buildIfDisposed(Disposable dependency, | |
[Disposable Function() builder]) { | |
if (dependency?.disposed ?? true) { | |
return builder?.call(); | |
} else { | |
return dependency; | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
import 'package:my_test_app/dependency_injection/dependency_injector_base.dart'; | |
class DependencyProvider extends InheritedWidget { | |
final DependencyInjectorBase injector; | |
DependencyProvider({Key key, this.injector, Widget child}) | |
: super(key: key, child: child); | |
@override | |
bool updateShouldNotify(InheritedWidget oldWidget) { | |
return false; | |
} | |
static DependencyInjectorBase dependencyInjectorOf(BuildContext context) { | |
return context | |
.dependOnInheritedWidgetOfExactType<DependencyProvider>() | |
?.injector; | |
} | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/foundation.dart'; | |
abstract class Disposable { | |
bool _disposed = false; | |
bool get disposed => _disposed; | |
@protected | |
void disposeInstance(); | |
void dispose() { | |
disposeInstance(); | |
_markDisposed(); | |
} | |
void _markDisposed() { | |
_disposed = true; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:my_test_app/dependency_injection/dependency_injector.dart'; | |
import 'package:my_test_app/features/login/login_bloc.dart'; | |
import 'package:my_test_app/features/login/mock_login_bloc.dart'; | |
class MockInjector extends DependencyInjector { | |
MockLoginBloc _mockLoginBloc; | |
@override | |
LoginBloc get loginBloc => | |
buildIfDisposed(_mockLoginBloc, () => MockLoginBloc(loginService)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment