Skip to content

Instantly share code, notes, and snippets.

@magicleon94
Last active July 12, 2022 18:18
Show Gist options
  • Save magicleon94/220ee365a84c1331002054b803e76465 to your computer and use it in GitHub Desktop.
Save magicleon94/220ee365a84c1331002054b803e76465 to your computer and use it in GitHub Desktop.
Lazy dependency injection template
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));
}
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;
}
}
}
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;
}
}
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;
}
}
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