Skip to content

Commit

Permalink
#1 fixed a bug with viewmodels/screens instead of viewmodel/screen
Browse files Browse the repository at this point in the history
  • Loading branch information
vanlooverenkoen committed Sep 19, 2019
1 parent de33f58 commit cf86e07
Show file tree
Hide file tree
Showing 12 changed files with 87 additions and 81 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
# Changelog

## [0.1.0] - 2019-09-18
### Fixed
-Fixed a bug where viewmodels and screens were used for imports instead of viewmodel, screen

## [0.0.2] - 2019-09-18
### Added
### Fixed
-Fixed some pub.dev warnings for maintenance

## [0.0.1] - 2019-09-18
Expand Down
30 changes: 13 additions & 17 deletions bin/icapps_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ Params params;
Future<void> main(List<String> args) async {
final pubspecYaml = File(join(Directory.current.path, 'pubspec.yaml'));
if (!pubspecYaml.existsSync()) {
throw Exception(
'This program should be run from the root of a flutter/dart project');
throw Exception('This program should be run from the root of a flutter/dart project');
}
if (args == null || args.isEmpty) {
throw Exception('No arguments provided. 1 argument is required.');
Expand Down Expand Up @@ -45,37 +44,34 @@ Future<void> parsePubspec(File pubspecYaml) async {
}

void createFolders() {
final screensFolder = Directory(join('lib', 'screens', screenName));
if (!screensFolder.existsSync()) {
print('`lib/screens/${screenName}_screen` does not exists');
final screenFolder = Directory(join('lib', 'screen', screenName));
if (!screenFolder.existsSync()) {
print('`lib/screen/${screenName}_screen` does not exists');
print('Creating folder...');
screensFolder.createSync(recursive: true);
screenFolder.createSync(recursive: true);
}

final viewModelFolder = Directory(join('lib', 'viewmodels', screenName));
final viewModelFolder = Directory(join('lib', 'viewmodel', screenName));
if (!viewModelFolder.existsSync()) {
print('`lib/viewmodels/${screenName}_screen` does not exists');
print('`lib/viewmodel/${screenName}_screen` does not exists');
print('Creating folder...');
viewModelFolder.createSync(recursive: true);
}
}

void createFiles() {
final screenFile =
File(join('lib', 'screens', screenName, '${screenName}_screen.dart'));
final viewModelFile = File(
join('lib', 'viewmodels', screenName, '${screenName}_viewmodel.dart'));
final screenFile = File(join('lib', 'screen', screenName, '${screenName}_screen.dart'));
final viewModelFile = File(join('lib', 'viewmodel', screenName, '${screenName}_viewmodel.dart'));

if (screenFile.existsSync()) {
throw Exception('`lib/screens/${screenName}_screen.dart` already exists');
throw Exception('`lib/screen/${screenName}_screen.dart` already exists');
}
if (viewModelFile.existsSync()) {
throw Exception(
'`lib/viewmodels/${screenName}_viewmodel.dart` already exists');
throw Exception('`lib/viewmodel/${screenName}_viewmodel.dart` already exists');
}
print('Create `lib/screens/${screenName}_screen.dart`');
print('Create `lib/screen/${screenName}_screen.dart`');
screenFile.createSync(recursive: true);
print('Create `lib/viewmodels/${screenName}_viewmodel.dart`');
print('Create `lib/viewmodel/${screenName}_viewmodel.dart`');
viewModelFile.createSync(recursive: true);

FileCreatorHelper.createViewModelFile(screenName);
Expand Down
82 changes: 25 additions & 57 deletions bin/src/file_creator_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,118 +12,86 @@ class FileCreatorHelper {
final sb = StringBuffer()
..writeln("import 'package:flutter/material.dart';")
..writeln()
..writeln(
'class ${CaseUtil.getCamelcase(screenName)}ViewModel with ChangeNotifier{')
..writeln('class ${CaseUtil.getCamelcase(screenName)}ViewModel with ChangeNotifier{')
..writeln(' ${CaseUtil.getCamelcase(screenName)}Navigator _navigator;')
..writeln()
..writeln(
' Future<void> init(${CaseUtil.getCamelcase(screenName)}Navigator navigator) async {')
..writeln(' Future<void> init(${CaseUtil.getCamelcase(screenName)}Navigator navigator) async {')
..writeln(' _navigator = navigator;')
..writeln(' }')
..writeln('}')
..writeln()
..writeln(
'abstract class ${CaseUtil.getCamelcase(screenName)}Navigator {}');
..writeln('abstract class ${CaseUtil.getCamelcase(screenName)}Navigator {}');

// Write to file
File(join('lib', 'viewmodels', screenName, '${screenName}_viewmodel.dart'))
.writeAsStringSync(sb.toString());
File(join('lib', 'viewmodel', screenName, '${screenName}_viewmodel.dart')).writeAsStringSync(sb.toString());
}

static void createScreenFile(String projectName, String screenName) {
final sb = StringBuffer()
..writeln(
"import 'package:$projectName/viewmodels/$screenName/${screenName}_viewmodel.dart';")
..writeln("import 'package:$projectName/viewmodel/$screenName/${screenName}_viewmodel.dart';")
..writeln("import 'package:flutter/material.dart';")
..writeln("import 'package:kiwi/kiwi.dart' as kiwi;")
..writeln("import 'package:provider/provider.dart';")
..writeln()
..writeln(
'class ${CaseUtil.getCamelcase(screenName)}Screen extends StatelessWidget implements ${CaseUtil.getCamelcase(screenName)}Navigator {')
..writeln('class ${CaseUtil.getCamelcase(screenName)}Screen extends StatelessWidget implements ${CaseUtil.getCamelcase(screenName)}Navigator {')
..writeln(" static const String routeName = '$screenName';")
..writeln()
..writeln(' @override')
..writeln(' Widget build(BuildContext context) {')
..writeln(
' return ChangeNotifierProvider<${CaseUtil.getCamelcase(screenName)}ViewModel>(')
..writeln(
' child: Consumer<${CaseUtil.getCamelcase(screenName)}ViewModel>(')
..writeln(' return ChangeNotifierProvider<${CaseUtil.getCamelcase(screenName)}ViewModel>(')
..writeln(' child: Consumer<${CaseUtil.getCamelcase(screenName)}ViewModel>(')
..writeln(' builder: (context, value, child) => Scaffold(')
..writeln(' body: Center(),')
..writeln(' ),')
..writeln(' ),')
..writeln(
' builder: (context) => kiwi.Container().resolve()..init(this),')
..writeln(' builder: (context) => kiwi.Container().resolve()..init(this),')
..writeln(' );')
..writeln(' }')
..writeln('}');

// Write to file
File(join('lib', 'screens', screenName, '${screenName}_screen.dart'))
.writeAsStringSync(sb.toString());
File(join('lib', 'screen', screenName, '${screenName}_screen.dart')).writeAsStringSync(sb.toString());
}

static Future<void> updateInjector(
String projectName, String screenName) async {
static Future<void> updateInjector(String projectName, String screenName) async {
final injectorFile = File(join('lib', 'di', 'injector.dart'));

final sb = StringBuffer()
..writeln(
"import 'package:$projectName/viewmodels/$screenName/${screenName}_viewmodel.dart';");
await injectorFile
.openRead()
.transform(const Utf8Decoder())
.transform(const LineSplitter())
.forEach((l) {
final sb = StringBuffer()..writeln("import 'package:$projectName/viewmodel/$screenName/${screenName}_viewmodel.dart';");
await injectorFile.openRead().transform(const Utf8Decoder()).transform(const LineSplitter()).forEach((l) {
if (l == ' void registerViewModelFactories();') {
sb.writeln(
' @Register.factory(${CaseUtil.getCamelcase(screenName)}ViewModel)');
sb.writeln(' @Register.factory(${CaseUtil.getCamelcase(screenName)}ViewModel)');
}
sb.writeln(l);
}).whenComplete(() {});
injectorFile.writeAsStringSync(sb.toString());
}

static Future<void> updateMainNavigator(
String projectName, String screenName) async {
final mainNavigatorFile =
File(join('lib', 'navigator', 'main_navigator.dart'));
static Future<void> updateMainNavigator(String projectName, String screenName) async {
final mainNavigatorFile = File(join('lib', 'navigator', 'main_navigator.dart'));
if (!mainNavigatorFile.existsSync()) {
print(
'`lib/navigator/main_navigator.dart` does not exists. Can not add navigation logic.');
print('`lib/navigator/main_navigator.dart` does not exists. Can not add navigation logic.');
return;
}

final sb = StringBuffer()
..writeln(
"import 'package:$projectName/screens/$screenName/${screenName}_screen.dart';")
..writeln(
"import 'package:$projectName/widgets/general/flavor_banner.dart';");
..writeln("import 'package:$projectName/screen/$screenName/${screenName}_screen.dart';")
..writeln("import 'package:$projectName/widgets/general/flavor_banner.dart';");
var writeOnGenerateRoute = false;
await mainNavigatorFile
.openRead()
.transform(const Utf8Decoder())
.transform(const LineSplitter())
.forEach((l) {
await mainNavigatorFile.openRead().transform(const Utf8Decoder()).transform(const LineSplitter()).forEach((l) {
if (l == ' Route onGenerateRoute(RouteSettings settings) {') {
writeOnGenerateRoute = true;
}
if (l == ' default:' && writeOnGenerateRoute) {
sb
..writeln(
' case ${CaseUtil.getCamelcase(screenName)}Screen.routeName:')
..writeln(
' return MaterialPageRoute(builder: (context) => FlavorBanner(child: ${CaseUtil.getCamelcase(screenName)}Screen()), settings: settings);');
..writeln(' case ${CaseUtil.getCamelcase(screenName)}Screen.routeName:')
..writeln(' return MaterialPageRoute(builder: (context) => FlavorBanner(child: ${CaseUtil.getCamelcase(screenName)}Screen()), settings: settings);');
}
if (l ==
' void closeDialog() => Navigator.of(context, rootNavigator: true).pop();') {
if (l == ' void closeDialog() => Navigator.of(context, rootNavigator: true).pop();') {
sb
..writeln(
' void goTo${CaseUtil.getCamelcase(screenName)}() => navigationKey.currentState.pushReplacementNamed(${CaseUtil.getCamelcase(screenName)}Screen.routeName);')
..writeln(' void goTo${CaseUtil.getCamelcase(screenName)}() => navigationKey.currentState.pushReplacementNamed(${CaseUtil.getCamelcase(screenName)}Screen.routeName);')
..writeln();
}
if (l !=
"import 'package:$projectName/widgets/general/flavor_banner.dart';") {
if (l != "import 'package:$projectName/widgets/general/flavor_banner.dart';") {
sb.writeln(l);
}
}).whenComplete(() {});
Expand Down
3 changes: 1 addition & 2 deletions example/ios/Flutter/flutter_export_environment.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@
# This is a generated file; do not edit or check into version control.
export "FLUTTER_ROOT=/Users/vanlooverenkoen/flutter"
export "FLUTTER_APPLICATION_PATH=/Users/vanlooverenkoen/Documents/work/flutter-icapps-generator/example"
export "FLUTTER_TARGET=/Users/vanlooverenkoen/Documents/work/flutter-icapps-generator/example/lib/main.dart"
export "FLUTTER_TARGET=lib/main.dart"
export "FLUTTER_BUILD_DIR=build"
export "SYMROOT=${SOURCE_ROOT}/../build/ios"
export "FLUTTER_FRAMEWORK_DIR=/Users/vanlooverenkoen/flutter/bin/cache/artifacts/engine/ios"
export "FLUTTER_BUILD_NAME=1.0.0"
export "FLUTTER_BUILD_NUMBER=1"
export "TRACK_WIDGET_CREATION=true"
4 changes: 3 additions & 1 deletion example/lib/di/injector.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:icapps_generator_example/viewmodels/user_detail/user_detail_viewmodel.dart';
import 'package:icapps_generator_example/viewmodel/testing/testing_viewmodel.dart';
import 'package:icapps_generator_example/util/util.dart';
import 'package:icapps_generator_example/viewmodel/user_detail/user_detail_viewmodel.dart';
import 'package:kiwi/kiwi.dart';

part 'injector.g.dart';
Expand All @@ -9,6 +10,7 @@ abstract class Injector {
void registerCommonDependencies();

@Register.factory(UserDetailViewModel)
@Register.factory(TestingViewModel)
void registerViewModelFactories();
}

Expand Down
1 change: 1 addition & 0 deletions example/lib/di/injector.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion example/lib/navigator/main_navigator.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:icapps_generator_example/screens/user_detail/user_detail_screen.dart';
import 'package:icapps_generator_example/screen/testing/testing_screen.dart';
import 'package:icapps_generator_example/widgets/general/flavor_banner.dart';
import 'package:flutter/material.dart';
import 'package:icapps_generator_example/screen/user_detail/user_detail_screen.dart';

class MainNavigatorWidget extends StatefulWidget {
const MainNavigatorWidget({Key key}) : super(key: key);
Expand Down Expand Up @@ -47,6 +48,8 @@ class MainNavigatorWidgetState extends State<MainNavigatorWidget> {
switch (settings.name) {
case UserDetailScreen.routeName:
return MaterialPageRoute(builder: (context) => FlavorBanner(child: UserDetailScreen()), settings: settings);
case TestingScreen.routeName:
return MaterialPageRoute(builder: (context) => FlavorBanner(child: TestingScreen()), settings: settings);
default:
return null;
}
Expand All @@ -56,6 +59,8 @@ class MainNavigatorWidgetState extends State<MainNavigatorWidget> {

void goToUserDetail() => navigationKey.currentState.pushReplacementNamed(UserDetailScreen.routeName);

void goToTesting() => navigationKey.currentState.pushReplacementNamed(TestingScreen.routeName);

void closeDialog() => Navigator.of(context, rootNavigator: true).pop();

void goBack<T>({result}) => navigationKey.currentState.pop(result);
Expand Down
20 changes: 20 additions & 0 deletions example/lib/screen/testing/testing_screen.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:icapps_generator_example/viewmodel/testing/testing_viewmodel.dart';
import 'package:flutter/material.dart';
import 'package:kiwi/kiwi.dart' as kiwi;
import 'package:provider/provider.dart';

class TestingScreen extends StatelessWidget implements TestingNavigator {
static const String routeName = 'testing';

@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<TestingViewModel>(
child: Consumer<TestingViewModel>(
builder: (context, value, child) => Scaffold(
body: Center(),
),
),
builder: (context) => kiwi.Container().resolve()..init(this),
);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:icapps_generator_example/viewmodels/user_detail/user_detail_viewmodel.dart';
import 'package:flutter/material.dart';
import 'package:icapps_generator_example/viewmodel/user_detail/user_detail_viewmodel.dart';
import 'package:kiwi/kiwi.dart' as kiwi;
import 'package:provider/provider.dart';

Expand Down
11 changes: 11 additions & 0 deletions example/lib/viewmodel/testing/testing_viewmodel.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import 'package:flutter/material.dart';

class TestingViewModel with ChangeNotifier{
TestingNavigator _navigator;

Future<void> init(TestingNavigator navigator) async {
_navigator = navigator;
}
}

abstract class TestingNavigator {}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: icapps_generator
description: Dart tool to automaticly generate new code when creating a new screen.
version: 0.0.2
version: 0.1.0
author: Koen Van Looveren <koen.vanlooveren@icapps.com>
homepage: https://github.com/icapps/flutter-icapps-generator

Expand Down

0 comments on commit cf86e07

Please sign in to comment.