Skip to content

Commit 48ab2fc

Browse files
authored
feat: changed DI to @Injectable (#50)
* refactor: renamed presenter -> cubit and moved api_config to /data * feat: changed DI to `@Injectable` * chore: cleaned up imports * chore: fixed annotation error * docs: added `TODO` * refactor: tweaked DI * chore: merging leftovers
1 parent 2ce0d23 commit 48ab2fc

16 files changed

+123
-72
lines changed

ios/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,4 @@ SPEC CHECKSUMS:
4343

4444
PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c
4545

46-
COCOAPODS: 1.11.2
46+
COCOAPODS: 1.11.3

lib/data/api/api_config.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import 'package:injectable/injectable.dart';
2+
3+
@Injectable()
14
class ApiConfig {
25
final String baseUrl;
36

lib/data/preferences/auth_preferences.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import 'package:flutter_template/data/model/auth/auth_tokens.dart';
2+
import 'package:injectable/injectable.dart';
23
import 'package:shared_preferences/shared_preferences.dart';
34

45
/// This class handles the authentication state of the whole app.
6+
7+
@LazySingleton()
58
class AuthPreferences {
69
AuthPreferences(this._preferences);
710

lib/data/preferences/user_shared_preferences.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ import 'dart:convert';
22

33
import 'package:flutter_template/domain/entities/user.dart';
44
import 'package:flutter_template/domain/preferences/user_preferences.dart';
5+
import 'package:injectable/injectable.dart';
56
import 'package:shared_preferences/shared_preferences.dart';
67

78
/// Store the current authenticated user's basic information.
9+
10+
@LazySingleton()
811
class UserSharedPreferences extends UserPreferences {
912
UserSharedPreferences(this._preferences);
1013

lib/data/services/http_client/dio_http_client.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import 'package:dio/dio.dart';
22
import 'package:flutter_template/data/services/http_client/http_client.dart';
33
import 'package:flutter_template/data/services/response_error.dart';
4+
import 'package:injectable/injectable.dart';
45

56
/// Abstraction of the Dio http client class.
7+
8+
@Injectable(as: HttpClient)
69
class DioHttpClient extends HttpClient {
710
DioHttpClient(this._dio);
811

lib/data/services/http_profile_service.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:flutter_template/domain/services/profile_service.dart';
2+
import 'package:injectable/injectable.dart';
23

4+
@LazySingleton(as: ProfileService)
35
class HttpProfileService extends ProfileService {
46
HttpProfileService();
57

lib/injection/data_module.dart

Lines changed: 22 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,56 +2,31 @@ import 'package:dio/adapter.dart';
22
import 'package:dio/dio.dart';
33
import 'package:flutter_template/data/api/api_config.dart';
44
import 'package:flutter_template/data/interceptor/auth_interceptor.dart';
5-
import 'package:flutter_template/data/preferences/auth_preferences.dart';
6-
import 'package:flutter_template/data/preferences/user_shared_preferences.dart';
7-
import 'package:flutter_template/data/services/http_client/dio_http_client.dart';
8-
import 'package:flutter_template/data/services/http_client/http_client.dart';
9-
import 'package:flutter_template/data/services/http_profile_service.dart';
10-
import 'package:flutter_template/domain/preferences/user_preferences.dart';
11-
import 'package:flutter_template/domain/services/profile_service.dart';
125
import 'package:flutter_template/injection/injector.dart';
6+
import 'package:injectable/injectable.dart';
7+
import 'package:shared_preferences/shared_preferences.dart';
138

14-
class DataModule {
15-
static Future<void> inject() async {
16-
// Prefs
17-
injector.registerLazySingleton<AuthPreferences>(
18-
() => AuthPreferences(injector()),
19-
);
20-
injector.registerLazySingleton<UserPreferences>(
21-
() => UserSharedPreferences(injector()),
22-
);
23-
24-
// Http
25-
injector.registerFactory<DioHttpClient>(() {
26-
return DioHttpClient(Dio());
27-
});
28-
29-
injector.registerFactory<HttpClient>(() {
30-
return DioHttpClient(Dio());
31-
});
9+
@module
10+
abstract class DataModule {
11+
@singleton
12+
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
3213

33-
injector.registerLazySingleton<Dio>(() {
34-
final dio = Dio();
35-
dio.httpClientAdapter = DefaultHttpClientAdapter();
36-
dio.options.baseUrl = injector.get<ApiConfig>().apiUrl;
37-
dio.interceptors.add(
38-
AuthInterceptor(
39-
httpClient: injector(),
40-
authPreferences: injector(),
41-
userPreferences: injector(),
42-
refreshTokenHttpClient: injector(),
43-
onTokenExpired: () {
44-
// Handle log out
45-
},
46-
),
47-
);
48-
49-
return dio;
50-
});
51-
52-
// Services
53-
injector.registerLazySingleton<ProfileService>(
54-
() => HttpProfileService(),
14+
Dio getDio(ApiConfig apiConfig) {
15+
final dio = Dio();
16+
dio.httpClientAdapter = DefaultHttpClientAdapter();
17+
dio.options.baseUrl = apiConfig.apiUrl;
18+
dio.interceptors.add(
19+
AuthInterceptor(
20+
httpClient: injector(),
21+
authPreferences: injector(),
22+
userPreferences: injector(),
23+
refreshTokenHttpClient: injector(),
24+
onTokenExpired: () {
25+
// TODO: Handle log out
26+
},
27+
),
5528
);
29+
30+
return dio;
5631
}
5732
}

lib/injection/dependencies.dart

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
import 'package:flutter_template/injection/data_module.dart';
21
import 'package:flutter_template/presentation/app_flavor.dart';
3-
import 'package:flutter_template/presentation/feature/profile/profile_module.dart';
4-
import 'package:flutter_template/presentation/routes/app_navigator.dart';
52
import 'package:flutter_template/presentation/routes/router.gr.dart';
63

74
import 'injector.dart';
@@ -10,13 +7,7 @@ class DependencyManager {
107
static Future<void> inject(AppFlavor flavor) async {
118
injector.registerLazySingleton<AppFlavor>(() => flavor);
129
injector.registerLazySingleton<AppRouter>(() => AppRouter());
13-
injector.registerLazySingleton<AppNavigator>(
14-
() => AppNavigator(injector.get<AppRouter>()));
1510

16-
// App modules
17-
await DataModule.inject();
18-
19-
// Feature modules
20-
await ProfileModule.inject();
11+
await configureDependencies();
2112
}
2213
}

lib/injection/injector.config.dart

Lines changed: 50 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/injection/injector.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
import 'package:flutter_template/injection/injector.config.dart';
12
import 'package:get_it/get_it.dart';
3+
import 'package:injectable/injectable.dart';
24

35
GetIt injector = GetIt.instance;
6+
7+
@InjectableInit(
8+
initializerName: r'$initGetIt', // default
9+
preferRelativeImports: true, // default
10+
asExtension: false, // default
11+
)
12+
Future configureDependencies() async => $initGetIt(injector);
13+

0 commit comments

Comments
 (0)