Skip to content

Commit 1a46ded

Browse files
authored
Merge pull request #109 from Onix-Systems/feat/riverpod_gen
Feat/riverpod gen
2 parents 1c82b43 + f4869fe commit 1a46ded

31 files changed

+751
-234
lines changed

bricks/flutter_clean_base/__brick__/{{project_name.snakeCase()}}/lib/core/di/remote.dart

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import 'package:{{project_name}}/core/arch/data/remote/dio/dio_const.dart';
55
import 'package:{{project_name}}/core/arch/data/remote/graph_ql/request_processor/graph_ql_request_processor.dart';
66
import 'package:{{project_name}}/core/arch/data/remote/graph_ql/request_processor/graph_ql_request_processor_impl.dart';{{/graphql}}
77
{{#firebase_auth}}import 'package:firebase_auth/firebase_auth.dart';{{/firebase_auth}}
8-
import 'package:{{project_name}}/core/arch/data/remote/dio/dio_const.dart';
98
import 'package:onix_flutter_core/onix_flutter_core.dart';
109
void registerRemote(GetIt getIt) {
1110
final dioClientModule = _DioClientModule();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//@formatter:off
2+
import 'package:flutter_riverpod/flutter_riverpod.dart';
3+
import 'package:get_it/get_it.dart';
4+
//{imports end}
5+
6+
void registerRiverpod(GetIt getIt) {
7+
//{riverpod end}
8+
}

bricks/flutter_clean_base/__brick__/{{project_name.snakeCase()}}/lib/main.gen.dart

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'dart:io';
44
import 'package:flutter/material.dart';
55
{{#isBloc}}import 'package:flutter_bloc/flutter_bloc.dart';
66
import 'package:onix_flutter_bloc/onix_flutter_bloc.dart';{{/isBloc}}
7+
{{#isRiverpod}}import 'package:flutter_riverpod/flutter_riverpod.dart';{{/isRiverpod}}
78
import 'package:{{project_name}}/app/banned_app.dart';
89
import 'package:{{project_name}}/app/app.dart';
910
import 'package:{{project_name}}/app/app_initialization.dart';
@@ -28,7 +29,12 @@ Future<void> main{{#flavorizr}}App{{/flavorizr}}() async {
2829
{{#isBloc}}Bloc.observer = AppBlocObserver();{{/isBloc}}
2930
final isAllowedToUseApp = await environmentService().initialize();
3031
if (isAllowedToUseApp) {
32+
{{#isRiverpod}}
33+
runApp(const ProviderScope(child: App()));
34+
{{/isRiverpod}}
35+
{{^isRiverpod}}
3136
runApp(const App());
37+
{{/isRiverpod}}
3238
} else {
3339
runApp(const BannedApp());
3440
}

bricks/flutter_clean_base/hooks/post_gen.dart

+10-11
Original file line numberDiff line numberDiff line change
@@ -159,25 +159,24 @@ Future<void> getDependencies(HookContext context) async {
159159
];
160160

161161
if (context.vars['isBloc']) {
162-
dependencies..addAll(['flutter_bloc', 'onix_flutter_bloc']);
163-
await removeStateManagers(['provider']);
164-
await Process.run('rm', ['theme_util.dart'],
165-
workingDirectory: '$name/lib/app/util');
162+
dependencies.addAll(['flutter_bloc', 'onix_flutter_bloc']);
163+
await removeStateManagers(managers: ['provider', 'riverpod']);
166164
}
167165

168166
if (context.vars['isProvider']) {
169167
dependencies.addAll(['provider', 'onix_flutter_provider']);
170-
await removeStateManagers(['bloc']);
171-
await Process.run('rm', ['theme_util.dart'],
172-
workingDirectory: '$name/lib/app/util');
168+
await removeStateManagers(managers: ['bloc', 'riverpod']);
173169
}
174170

175-
if (context.vars['isProvider'] || context.vars['isBloc']) {
176-
dependencies.add('onix_flutter_core_models');
171+
if (context.vars['isRiverpod']) {
172+
dependencies.add('flutter_riverpod');
173+
await removeStateManagers(managers: ['bloc', 'provider']);
177174
}
178175

179176
if (context.vars['isBase']) {
180-
await removeStateManagers(['provider', 'bloc']);
177+
await removeStateManagers(managers: ['provider', 'bloc', 'riverpod']);
178+
} else {
179+
dependencies.add('onix_flutter_core_models');
181180
}
182181

183182
if (!context.vars['web_only']) {
@@ -293,7 +292,7 @@ Future<void> getDependencies(HookContext context) async {
293292
}
294293
}
295294

296-
Future<void> removeStateManagers(List<String> managers) async {
295+
Future<void> removeStateManagers({required List<String> managers}) async {
297296
for (var manager in managers) {
298297
await Process.run('rm', ['$manager.dart'],
299298
workingDirectory: '$name/lib/core/di');

bricks/flutter_clean_base/hooks/pre_gen.dart

+3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ Future<Map<String, dynamic>> _initCustomVars(HookContext context) async {
6060
final isBloc = context.vars['state_management'] == 'bloc' ? true : false;
6161
final isProvider =
6262
context.vars['state_management'] == 'provider' ? true : false;
63+
final isRiverpod =
64+
context.vars['state_management'] == 'riverpod' ? true : false;
6365

6466
var flavors = [];
6567

@@ -90,6 +92,7 @@ Future<Map<String, dynamic>> _initCustomVars(HookContext context) async {
9092
'isBase': isBase,
9193
'isBloc': isBloc,
9294
'isProvider': isProvider,
95+
'isRiverpod': isRiverpod,
9396
'sentry': context.vars['sentry'],
9497
};
9598
}

lib/data/model/swagger/model/swagger_model_response_v2.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class SwaggerModelResponseV2 extends BaseSwaggerModelResponse {
1515
String rawModelName,
1616
Map<String, dynamic> json,
1717
) {
18-
var modelName = rawModelName.clearDataComponentsName();
18+
final modelName = rawModelName.clearDataComponentsName();
1919

2020
var variables =
2121
List<BaseSwaggerModelVariableResponse>.empty(growable: true);

lib/data/model/swagger/model/swagger_model_response_v3.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ class SwaggerModelResponseV3 extends BaseSwaggerModelResponse {
1717
Map<String, dynamic> json,
1818
Map<String, dynamic> allObjects,
1919
) {
20-
List<BaseSwaggerModelResponse> crossReferences = [];
20+
var crossReferences = <BaseSwaggerModelResponse>[];
2121
if (json.containsKey('allOf')) {
22-
final allOff = (json).asObjectList('allOf');
22+
final allOff = json.asObjectList('allOf');
2323
crossReferences = _getCrossReferences(
2424
allOff,
2525
allObjects,
2626
);
2727
}
2828

29-
var modelName = rawModelName.clearDataComponentsName();
29+
final modelName = rawModelName.clearDataComponentsName();
3030

31-
var variables =
31+
final variables =
3232
List<BaseSwaggerModelVariableResponse>.empty(growable: true);
3333
final type = json['type'];
3434
final requiredVariables = (json.containsKey('required'))

lib/domain/entity/config/config.g.dart

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/domain/entity/state_management/project_state_manager.dart

+6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import 'package:onix_flutter_bricks/domain/service/strategy/state_manager_strate
33
import 'package:onix_flutter_bricks/domain/service/strategy/strategies/base_strategy.dart';
44
import 'package:onix_flutter_bricks/domain/service/strategy/strategies/bloc_strategy.dart';
55
import 'package:onix_flutter_bricks/domain/service/strategy/strategies/provider_strategy.dart';
6+
import 'package:onix_flutter_bricks/domain/service/strategy/strategies/riverpod_strategy.dart';
67

78
enum ProjectStateManager {
89
bloc,
910
provider,
11+
riverpod,
1012
base;
1113

1214
StateManagerStrategy get strategy {
@@ -23,6 +25,10 @@ enum ProjectStateManager {
2325
return ProviderStrategy(
2426
defaultScreenRouteGenerator: DefaultScreenRouteGenerator(),
2527
);
28+
case ProjectStateManager.riverpod:
29+
return RiverpodStrategy(
30+
defaultScreenRouteGenerator: DefaultScreenRouteGenerator(),
31+
);
2632
}
2733
}
2834
}

lib/domain/entity/state_management/state_management_variant.dart

+26
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'package:onix_flutter_bricks/domain/service/base/base_generation_service.
22
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/bloc_screen_generator.dart';
33
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/cubit_screen_generator.dart';
44
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/provider_screen_generator.dart';
5+
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/riverpod_stateful_screen_generator.dart';
6+
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/riverpod_stateless_screen_generator.dart';
57
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/stateful_screen_generator.dart';
68
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/stateless_screen_generator.dart';
79

@@ -70,3 +72,27 @@ final class ProviderStateManagementVariant extends StateManagementVariant {
7072

7173
const ProviderStateManagementVariant();
7274
}
75+
76+
final class RiverpodStatelessStateManagementVariant
77+
extends StateManagementVariant {
78+
@override
79+
String get name => 'RiverpodStateless';
80+
81+
@override
82+
ScreenGenerationService get screenGenerator =>
83+
RiverpodStatelessScreenGenerator();
84+
85+
const RiverpodStatelessStateManagementVariant();
86+
}
87+
88+
final class RiverpodStatefulStateManagementVariant
89+
extends StateManagementVariant {
90+
@override
91+
String get name => 'RiverpodStateful';
92+
93+
@override
94+
ScreenGenerationService get screenGenerator =>
95+
RiverpodStatefulScreenGenerator();
96+
97+
const RiverpodStatefulStateManagementVariant();
98+
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import 'package:onix_flutter_bricks/domain/service/base/params/base_generation_params.dart';
2+
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/params/screen_generator_params.dart';
23

34
// ignore: one_member_abstracts
45
abstract class BaseGenerationService<R, T extends BaseGenerationParams> {
56
Future<R> generate(T params);
67
}
78

89
abstract class ScreenGenerationService
9-
extends BaseGenerationService<bool, BaseGenerationParams> {
10+
extends BaseGenerationService<bool, ScreenGeneratorParams> {
1011
@override
11-
Future<bool> generate(BaseGenerationParams params);
12+
Future<bool> generate(ScreenGeneratorParams params);
1213
}

lib/domain/service/file_generator_service/screen_generators/bloc_screen_generator.dart

+12-30
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'dart:io';
22

33
import 'package:onix_flutter_bricks/domain/entity/state_management/state_management_variant.dart';
44
import 'package:onix_flutter_bricks/domain/service/base/base_generation_service.dart';
5-
import 'package:onix_flutter_bricks/domain/service/base/params/base_generation_params.dart';
65
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/gen/bloc_screen_code_content.dart';
76
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/gen/mixins/bloc_content_mixin.dart';
87
import 'package:onix_flutter_bricks/domain/service/file_generator_service/screen_generators/gen/mixins/di_content_mixin.dart';
@@ -14,18 +13,14 @@ class BlocScreenGenerator extends ScreenGenerationService
1413
final _screenCodeContent = BlocScreenCodeContent();
1514

1615
@override
17-
Future<bool> generate(BaseGenerationParams params) async {
18-
if (params is! ScreenGeneratorParams) {
19-
return false;
20-
}
21-
16+
Future<bool> generate(ScreenGeneratorParams params) async {
2217
final screenName = params.normalizedScreenName;
2318

2419
final screenPath =
2520
'${params.projectPath}/${params.projectName}/lib/presentation/screen/${screenName}_screen';
2621
await Directory(screenPath).create(recursive: true);
2722

28-
if (params.screen.stateVariant != const StatelessStateManagementVariant()) {
23+
if (params.screen.stateVariant is! StatelessStateManagementVariant) {
2924
await Directory('$screenPath/bloc').create(recursive: true);
3025
}
3126

@@ -35,9 +30,10 @@ class BlocScreenGenerator extends ScreenGenerationService
3530
///Add screen configuration to Navigation Router file
3631
await _createRoutes(params);
3732

38-
if (params.screen.stateVariant != const StatelessStateManagementVariant()) {
33+
if (params.screen.stateVariant is! StatelessStateManagementVariant &&
34+
params.screen.stateVariant is! StatefulStateManagementVariant) {
3935
///Add DI configuration for state management
40-
await _createDI(params);
36+
await createScreenDIContent(params: params);
4137
}
4238
return true;
4339
}
@@ -47,19 +43,19 @@ class BlocScreenGenerator extends ScreenGenerationService
4743
if (params.router == ProjectRouter.goRouter) {
4844
final routesFile = File(
4945
'${params.projectPath}/${params.projectName}/lib/app/router/app_route.dart');
50-
String routesContent = routesFile.readAsStringSync();
46+
final routesContent = routesFile.readAsStringSync();
5147
//Generate routes enum for GoRouter
5248
final appRoutesContent = _screenCodeContent.createScreenNavigationGoRoute(
5349
input: routesContent,
5450
screenName: screenName,
5551
isLastDeclaration: params.lastScreenItem,
5652
);
57-
routesFile.writeAsString(appRoutesContent);
53+
await routesFile.writeAsString(appRoutesContent);
5854
}
5955

6056
final routerFile = File(
6157
'${params.projectPath}/${params.projectName}/lib/app/router/app_router.dart');
62-
String routerContent = routerFile.readAsStringSync();
58+
final routerContent = routerFile.readAsStringSync();
6359

6460
///Create Navigator screen declarations
6561
final filledRouterContent =
@@ -71,21 +67,7 @@ class BlocScreenGenerator extends ScreenGenerationService
7167
router: params.router,
7268
);
7369

74-
routerFile.writeAsString(filledRouterContent);
75-
}
76-
77-
Future<void> _createDI(ScreenGeneratorParams params) async {
78-
var diFile = File(
79-
'${params.projectPath}/${params.projectName}/lib/core/di/bloc.dart');
80-
final screenName = params.normalizedScreenName;
81-
String content = await diFile.readAsString();
82-
final diOutputContent = createScreenDIContent(
83-
input: content,
84-
screenName: screenName,
85-
projectName: params.projectName,
86-
stateManagement: params.screen.stateVariant,
87-
);
88-
await diFile.writeAsString(diOutputContent);
70+
await routerFile.writeAsString(filledRouterContent);
8971
}
9072

9173
Future<void> _createFiles(
@@ -105,7 +87,7 @@ class BlocScreenGenerator extends ScreenGenerationService
10587
await screenFile.writeAsString(screenContent);
10688

10789
///Write BLoC imports file
108-
var importsFile =
90+
final importsFile =
10991
await File('$screenPath/bloc/${screenName}_screen_imports.dart')
11092
.create();
11193
final importsContent = createBlocImportsContent(
@@ -115,7 +97,7 @@ class BlocScreenGenerator extends ScreenGenerationService
11597
await importsFile.writeAsString(importsContent);
11698

11799
///Write BLoC models file
118-
var modelsFile =
100+
final modelsFile =
119101
await File('$screenPath/bloc/${screenName}_screen_models.dart')
120102
.create();
121103
final modelsContent = createBlocModels(
@@ -125,7 +107,7 @@ class BlocScreenGenerator extends ScreenGenerationService
125107
await modelsFile.writeAsString(modelsContent);
126108

127109
///Write BLoC file
128-
var blocFile = await File(
110+
final blocFile = await File(
129111
'$screenPath/bloc/${screenName}_screen_${params.screen.stateVariant.name.toLowerCase()}.dart')
130112
.create();
131113
final blocFileContent = createBlocContent(

0 commit comments

Comments
 (0)