├── assets
├── config
│ ├── conf.json
│ ├── services.json
│ └── flavour
│ │ ├── flavour_1
│ │ ├── dev_environment.json
│ │ ├── prod_environment.json
│ │ └── test_environment.json
│ │ └── flavour_2
│ │ ├── dev_environment.json
│ │ ├── prod_environment.json
│ │ └── test_environment.json
├── images
│ └── launcher
│ │ └── flavour
│ │ ├── flavour_1
│ │ └── launcher.png
│ │ └── flavour_2
│ │ └── launcher.png
└── l10n
│ ├── intl_en.arb
│ └── intl_es.arb
├── .fvm
├── flutter_sdk
└── fvm_config.json
├── ios
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── AppFrameworkInfo.plist
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ │ ├── AppIcon-flavour_1.appiconset
│ │ │ ├── AppIcon-flavour_1-20x20@1x.png
│ │ │ ├── AppIcon-flavour_1-20x20@2x.png
│ │ │ ├── AppIcon-flavour_1-20x20@3x.png
│ │ │ ├── AppIcon-flavour_1-29x29@1x.png
│ │ │ ├── AppIcon-flavour_1-29x29@2x.png
│ │ │ ├── AppIcon-flavour_1-29x29@3x.png
│ │ │ ├── AppIcon-flavour_1-40x40@1x.png
│ │ │ ├── AppIcon-flavour_1-40x40@2x.png
│ │ │ ├── AppIcon-flavour_1-40x40@3x.png
│ │ │ ├── AppIcon-flavour_1-60x60@2x.png
│ │ │ ├── AppIcon-flavour_1-60x60@3x.png
│ │ │ ├── AppIcon-flavour_1-76x76@1x.png
│ │ │ ├── AppIcon-flavour_1-76x76@2x.png
│ │ │ ├── AppIcon-flavour_1-1024x1024@1x.png
│ │ │ ├── AppIcon-flavour_1-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ │ └── AppIcon-flavour_2.appiconset
│ │ │ ├── AppIcon-flavour_2-20x20@1x.png
│ │ │ ├── AppIcon-flavour_2-20x20@2x.png
│ │ │ ├── AppIcon-flavour_2-20x20@3x.png
│ │ │ ├── AppIcon-flavour_2-29x29@1x.png
│ │ │ ├── AppIcon-flavour_2-29x29@2x.png
│ │ │ ├── AppIcon-flavour_2-29x29@3x.png
│ │ │ ├── AppIcon-flavour_2-40x40@1x.png
│ │ │ ├── AppIcon-flavour_2-40x40@2x.png
│ │ │ ├── AppIcon-flavour_2-40x40@3x.png
│ │ │ ├── AppIcon-flavour_2-60x60@2x.png
│ │ │ ├── AppIcon-flavour_2-60x60@3x.png
│ │ │ ├── AppIcon-flavour_2-76x76@1x.png
│ │ │ ├── AppIcon-flavour_2-76x76@2x.png
│ │ │ ├── AppIcon-flavour_2-1024x1024@1x.png
│ │ │ ├── AppIcon-flavour_2-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ └── project.pbxproj
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
└── .gitignore
├── lib
└── src
│ └── uy
│ └── com
│ └── vberazategui
│ ├── shared
│ ├── presentation
│ │ ├── enums
│ │ │ └── flavour.dart
│ │ ├── base_bloc
│ │ │ ├── bloc_state.dart
│ │ │ ├── snackbar_state.dart
│ │ │ └── base_bloc.dart
│ │ ├── constants
│ │ │ ├── color_pallete.dart
│ │ │ └── text_styles.dart
│ │ ├── routes
│ │ │ ├── router.dart
│ │ │ └── router.gr.dart
│ │ ├── injection
│ │ │ ├── injection.dart
│ │ │ └── injection.config.dart
│ │ ├── mixins
│ │ │ └── validation_mixin.dart
│ │ ├── theme
│ │ │ ├── app_themes.dart
│ │ │ ├── flavour_1_theme.dart
│ │ │ └── flavour_2_theme.dart
│ │ ├── flavour
│ │ │ ├── flavour_1
│ │ │ │ ├── main.dev.dart
│ │ │ │ ├── main.prod.dart
│ │ │ │ └── main.test.dart
│ │ │ └── flavour_2
│ │ │ │ ├── main.dev.dart
│ │ │ │ ├── main.prod.dart
│ │ │ │ └── main.test.dart
│ │ ├── blocs
│ │ │ └── configuration_bloc.dart
│ │ ├── lang
│ │ │ ├── intl
│ │ │ │ ├── messages_en.dart
│ │ │ │ ├── messages_es.dart
│ │ │ │ └── messages_all.dart
│ │ │ └── l10n.dart
│ │ ├── main_common.dart
│ │ └── assets
│ │ │ └── assets.gen.dart
│ ├── infrastructure
│ │ ├── log
│ │ │ └── log_injectable_module.dart
│ │ ├── error
│ │ │ └── exceptions.dart
│ │ └── network
│ │ │ ├── http_injectable_module.dart
│ │ │ └── http_handle_error.dart
│ ├── application
│ │ └── usecases
│ │ │ └── usecase.dart
│ └── domain
│ │ └── error
│ │ └── failure.dart
│ └── demo
│ ├── domain
│ ├── entities
│ │ └── demo.dart
│ └── repositories
│ │ └── demo_repository.dart
│ ├── infrastructure
│ ├── dtos
│ │ └── demo_dto.dart
│ ├── datasources
│ │ ├── demo_remote_data_source.dart
│ │ └── demo_local_data_source.dart
│ └── repositories
│ │ └── demo_repository_impl.dart
│ ├── application
│ └── usecases
│ │ ├── clear_cache_demo.dart
│ │ ├── demo.dart
│ │ ├── get_cached_demo.dart
│ │ └── cache_demo.dart
│ └── presentation
│ ├── demo_page.dart
│ └── blocs
│ └── demo_page_bloc.dart
├── docs
├── CleanArchitecture.jpg
└── Clean-Architecture-Flutter-Diagram.png
├── flutter_launcher_icons-flavour_1.yaml
├── flutter_launcher_icons-flavour_2.yaml
├── android
├── app
│ ├── src
│ │ ├── flavour_1
│ │ │ └── res
│ │ │ │ ├── values
│ │ │ │ └── strings.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ └── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ ├── flavour_2
│ │ │ └── res
│ │ │ │ ├── values
│ │ │ │ └── strings.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ └── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable-v21
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── values
│ │ │ │ │ └── styles.xml
│ │ │ │ └── values-night
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── uy
│ │ │ │ │ └── com
│ │ │ │ │ └── geocom
│ │ │ │ │ └── flutter_ddd_skeleton
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── settings.gradle
└── build.gradle
├── test_driver
├── features
│ └── demo.feature
├── reporters
│ ├── cucumber_report.json
│ └── cucumber_report.html
├── lunch.json
├── index.js
├── flavour
│ ├── flavour_1
│ │ └── app_dev.dart
│ └── flavour_2
│ │ └── app_dev.dart
├── bdd_test.dart
└── hooks.dart
├── .metadata
├── analysis_options.yaml
├── tools
└── test.sh
├── .github
└── FUNDING.yml
├── .gitignore
├── README.md
├── test
└── widget_test.dart
├── makefile
├── pubspec.yaml
└── pubspec.lock
/assets/config/conf.json:
--------------------------------------------------------------------------------
1 | {
2 |
3 | }
--------------------------------------------------------------------------------
/.fvm/flutter_sdk:
--------------------------------------------------------------------------------
1 | C:/Users/Vane/fvm/versions/stable
--------------------------------------------------------------------------------
/assets/config/services.json:
--------------------------------------------------------------------------------
1 | {
2 | "demo_url": ""
3 | }
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/.fvm/fvm_config.json:
--------------------------------------------------------------------------------
1 | {
2 | "flutterSdkVersion": "stable",
3 | "flavors": {}
4 | }
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart:
--------------------------------------------------------------------------------
1 | enum Flavour { flavour_1, flavour_2 }
2 |
--------------------------------------------------------------------------------
/docs/CleanArchitecture.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/docs/CleanArchitecture.jpg
--------------------------------------------------------------------------------
/assets/config/flavour/flavour_1/dev_environment.json:
--------------------------------------------------------------------------------
1 | {
2 | "read_timeout": 30000,
3 | "backend_base_url": "http://localhost:8080"
4 | }
--------------------------------------------------------------------------------
/assets/config/flavour/flavour_2/dev_environment.json:
--------------------------------------------------------------------------------
1 | {
2 | "read_timeout": 30000,
3 | "backend_base_url": "http://localhost:8080"
4 | }
--------------------------------------------------------------------------------
/assets/config/flavour/flavour_1/prod_environment.json:
--------------------------------------------------------------------------------
1 | {
2 | "read_timeout": 30000,
3 | "backend_base_url": "http://localhost:8080"
4 | }
--------------------------------------------------------------------------------
/assets/config/flavour/flavour_1/test_environment.json:
--------------------------------------------------------------------------------
1 | {
2 | "read_timeout": 30000,
3 | "backend_base_url": "http://localhost:8080"
4 | }
--------------------------------------------------------------------------------
/assets/config/flavour/flavour_2/prod_environment.json:
--------------------------------------------------------------------------------
1 | {
2 | "read_timeout": 30000,
3 | "backend_base_url": "http://localhost:8080"
4 | }
--------------------------------------------------------------------------------
/assets/config/flavour/flavour_2/test_environment.json:
--------------------------------------------------------------------------------
1 | {
2 | "read_timeout": 30000,
3 | "backend_base_url": "http://localhost:8080"
4 | }
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/base_bloc/bloc_state.dart:
--------------------------------------------------------------------------------
1 | /// Represents the state of the view
2 | enum BLoCState { idle, busy }
3 |
--------------------------------------------------------------------------------
/docs/Clean-Architecture-Flutter-Diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/docs/Clean-Architecture-Flutter-Diagram.png
--------------------------------------------------------------------------------
/flutter_launcher_icons-flavour_1.yaml:
--------------------------------------------------------------------------------
1 | flutter_icons:
2 | android: true
3 | ios: true
4 | image_path: 'assets/images/launcher/flavour/flavour_1/launcher.png'
--------------------------------------------------------------------------------
/flutter_launcher_icons-flavour_2.yaml:
--------------------------------------------------------------------------------
1 | flutter_icons:
2 | android: true
3 | ios: true
4 | image_path: 'assets/images/launcher/flavour/flavour_2/launcher.png'
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/base_bloc/snackbar_state.dart:
--------------------------------------------------------------------------------
1 | /// Represents the state of the snackbar
2 | enum SnackBarState { info, error }
3 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/domain/entities/demo.dart:
--------------------------------------------------------------------------------
1 | class Demo {
2 | Demo({
3 | required this.demoDetail,
4 | });
5 |
6 | String demoDetail;
7 | }
8 |
--------------------------------------------------------------------------------
/android/app/src/flavour_1/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Flavour_1
4 |
--------------------------------------------------------------------------------
/android/app/src/flavour_2/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Flavour_2
4 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/assets/images/launcher/flavour/flavour_1/launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/assets/images/launcher/flavour/flavour_1/launcher.png
--------------------------------------------------------------------------------
/assets/images/launcher/flavour/flavour_2/launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/assets/images/launcher/flavour/flavour_2/launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/test_driver/features/demo.feature:
--------------------------------------------------------------------------------
1 | # new feature
2 | # Tags: optional
3 |
4 | Feature: A description
5 |
6 | Scenario: A scenario
7 | Given I wait until the 'DemoRoute' is present
--------------------------------------------------------------------------------
/android/app/src/flavour_1/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_1/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_1/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_1/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_1/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_1/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_2/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_2/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_2/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_2/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_2/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_2/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_1/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_1/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_1/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_1/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_2/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_2/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/flavour_2/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/android/app/src/flavour_2/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 | org.gradle.java.home=C\:\\Program Files\\AdoptOpenJDK\\jdk-11.0.9.101-hotspot
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/uy/com/geocom/flutter_ddd_skeleton/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package uy.com.geocom.flutter_ddd_skeleton
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-76x76@2x.png
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/constants/color_pallete.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | //// Theme Colors
4 | const kLightCarminePink = Color(0xffEA7070);
5 | const kMediumElectricBlue = Color(0xff074a94);
6 |
--------------------------------------------------------------------------------
/test_driver/reporters/cucumber_report.json:
--------------------------------------------------------------------------------
1 | [{"description":"","id":"a description","keyword":"Feature","line":4,"name":"A description","uri":"C:\\Users\\vberazategui\\Documents\\GitRepository\\flutter_ddd_skeleton\\test_driver\\features\\demo.feature"}]
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/AppIcon-flavour_1-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Vanessa-Berazategui/flutter_ddd_skeleton/HEAD/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/AppIcon-flavour_2-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/constants/text_styles.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | const TextStyle kBodyText1 = TextStyle(
4 | fontSize: 20,
5 | fontWeight: FontWeight.w900,
6 | letterSpacing: 0.07,
7 | );
8 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-all.zip
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/infrastructure/log/log_injectable_module.dart:
--------------------------------------------------------------------------------
1 | import 'package:injectable/injectable.dart';
2 | import 'package:logger/logger.dart';
3 |
4 | @module
5 | abstract class LogInjectableModule {
6 | @injectable
7 | Logger get logger => Logger(
8 | printer: PrettyPrinter(),
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 18116933e77adc82f80866c928266a5b4f1ed645
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | **/*.keystore
13 | **/*.jks
14 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:very_good_analysis/analysis_options.yaml
2 |
3 | analyzer:
4 | strong-mode:
5 | implicit-casts: true
6 | implicit-dynamic: true
7 | exclude: [build/**, lib/**.config.dart, lib/**/routes/**.gr.dart, lib/**/lang/**, lib/**/assets/**, test/**]
8 |
9 |
10 | linter:
11 | rules:
12 | public_member_api_docs: false
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/application/usecases/usecase.dart:
--------------------------------------------------------------------------------
1 | import 'package:dartz/dartz.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/domain/error/failure.dart';
3 |
4 | // ignore: one_member_abstracts
5 | abstract class UseCase {
6 | Future> call(Params params);
7 | }
8 |
9 | class NoParams {}
10 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/routes/router.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_route/auto_route.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/presentation/demo_page.dart';
3 |
4 | @MaterialAutoRouter(
5 | replaceInRouteName: 'Page,Route',
6 | routes: [
7 | AutoRoute(path: '/', page: DemoPage),
8 | ],
9 | )
10 | class $AppRouter {}
11 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/injection/injection.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.config.dart';
2 | import 'package:get_it/get_it.dart';
3 | import 'package:injectable/injectable.dart';
4 |
5 | final GetIt getIt = GetIt.instance;
6 |
7 | @injectableInit
8 | void configureInjection() => $initGetIt(getIt);
9 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/test_driver/lunch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "name": "Flutter",
6 | "request": "launch",
7 | "type": "dart"
8 | },
9 | {
10 | "name": "Debug Features Tests",
11 | "request": "launch",
12 | "type": "dart",
13 | "program": "test_driver/app_test.dart",
14 | "flutterMode": "debug"
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/mixins/validation_mixin.dart:
--------------------------------------------------------------------------------
1 | mixin ValidationMixin {
2 | String? validateEmptinessStr(String? field) {
3 | if (field!.trim().isEmpty) {
4 | return '';
5 | } else {
6 | return null;
7 | }
8 | }
9 |
10 | String? validateEmptinessInt(int? field) {
11 | if (field == null) {
12 | return '';
13 | } else {
14 | return null;
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/theme/app_themes.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/theme/flavour_1_theme.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/theme/flavour_2_theme.dart';
3 |
4 | enum AppTheme { flavour1Theme, flavour2Theme }
5 |
6 | final appThemeData = {
7 | AppTheme.flavour1Theme: Flavour1Theme.theme,
8 | AppTheme.flavour2Theme: Flavour2Theme.theme,
9 | };
10 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/infrastructure/error/exceptions.dart:
--------------------------------------------------------------------------------
1 | import 'package:dio/dio.dart';
2 |
3 | class ServerException extends DioError {
4 | ServerException(this.message)
5 | : super(
6 | error: message,
7 | type: DioErrorType.response,
8 | requestOptions: RequestOptions(path: 'path'),
9 | );
10 |
11 | @override
12 | final String message;
13 |
14 | @override
15 | String toString() => message;
16 | }
17 |
18 | class CacheException implements Exception {}
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/tools/test.sh:
--------------------------------------------------------------------------------
1 | ## Testing options
2 | ### Running the app from test
3 | dart test_driver/bdd_test.dart (environment.dev)
4 | ### Running test remotely
5 | #### As you make changes in the app under test, just R (reload). In the test window you
6 | #### can rerun the tests and update the Scenarios quickly and easily.
7 | For the app -> flutter run --flavor flavour_1 -t lib/src/uy/com/vberazategui/shared/presentation/flavour/flavour_1/main.test.dart --verbose (copy 'Connecting to service protocol' URL)
8 | For the tests --> dart test_driver/bdd_test.dart http://127.0.0.1:63034/fPkqMbf3YVY=/
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/domain/repositories/demo_repository.dart:
--------------------------------------------------------------------------------
1 | import 'package:dartz/dartz.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/domain/entities/demo.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/domain/error/failure.dart';
4 |
5 | abstract class DemoRepository {
6 | Future> cacheDemo(Demo demo);
7 | Future> getCachedDemo();
8 | Future> clearCacheDemo();
9 | Future> demoMethod(String demoDetail);
10 | }
11 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/theme/flavour_1_theme.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/constants/color_pallete.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/constants/text_styles.dart';
4 |
5 | class Flavour1Theme {
6 | static ThemeData get theme {
7 | return ThemeData(
8 | fontFamily: 'SourceSansPro',
9 | textTheme: const TextTheme(
10 | bodyText1: kBodyText1,
11 | ),
12 | brightness: Brightness.light,
13 | primaryColor: kMediumElectricBlue,
14 | );
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/theme/flavour_2_theme.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/constants/color_pallete.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/constants/text_styles.dart';
4 |
5 | class Flavour2Theme {
6 | static ThemeData get theme {
7 | return ThemeData(
8 | fontFamily: 'SourceSansPro',
9 | textTheme: const TextTheme(
10 | bodyText1: kBodyText1,
11 | ),
12 | brightness: Brightness.light,
13 | primaryColor: kLightCarminePink,
14 | );
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.4.32'
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:7.0.3'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | mavenCentral()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | project.evaluationDependsOn(':app')
25 | }
26 |
27 | task clean(type: Delete) {
28 | delete rootProject.buildDir
29 | }
30 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | **/dgph
2 | *.mode1v3
3 | *.mode2v3
4 | *.moved-aside
5 | *.pbxuser
6 | *.perspectivev3
7 | **/*sync/
8 | .sconsign.dblite
9 | .tags*
10 | **/.vagrant/
11 | **/DerivedData/
12 | Icon?
13 | **/Pods/
14 | **/.symlinks/
15 | profile
16 | xcuserdata
17 | **/.generated/
18 | Flutter/App.framework
19 | Flutter/Flutter.framework
20 | Flutter/Flutter.podspec
21 | Flutter/Generated.xcconfig
22 | Flutter/ephemeral/
23 | Flutter/app.flx
24 | Flutter/app.zip
25 | Flutter/flutter_assets/
26 | Flutter/flutter_export_environment.sh
27 | ServiceDefinitions.json
28 | Runner/GeneratedPluginRegistrant.*
29 |
30 | # Exceptions to above rules.
31 | !default.mode1v3
32 | !default.mode2v3
33 | !default.pbxuser
34 | !default.perspectivev3
35 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/infrastructure/dtos/demo_dto.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/domain/entities/demo.dart';
2 |
3 | class DemoDto extends Demo {
4 | DemoDto({
5 | required String demoDetail,
6 | }) : super(
7 | demoDetail: demoDetail,
8 | );
9 |
10 | factory DemoDto.fromJson(Map parsedJson) {
11 | return DemoDto(
12 | demoDetail: parsedJson['id'],
13 | );
14 | }
15 |
16 | factory DemoDto.fromDomain(Demo entity) {
17 | return DemoDto(
18 | demoDetail: entity.demoDetail,
19 | );
20 | }
21 |
22 | Map toJson() {
23 | return {
24 | 'demoDetail': demoDetail,
25 | };
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/infrastructure/network/http_injectable_module.dart:
--------------------------------------------------------------------------------
1 | import 'package:dio/dio.dart';
2 | import 'package:global_configuration/global_configuration.dart';
3 | import 'package:injectable/injectable.dart';
4 |
5 | @module
6 | abstract class HttpInjectableModule {
7 | @injectable
8 | Dio get client {
9 | final client = Dio(
10 | BaseOptions(
11 | // It occurs when url is opened timeout.
12 | connectTimeout: GlobalConfiguration().get('read_timeout'),
13 | contentType: 'application/json; charset=utf-8',
14 | responseType: ResponseType.bytes,
15 | baseUrl: GlobalConfiguration().get('backend_base_url'),
16 | ),
17 | );
18 |
19 | return client;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/application/usecases/clear_cache_demo.dart:
--------------------------------------------------------------------------------
1 | import 'package:dartz/dartz.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/domain/repositories/demo_repository.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/application/usecases/usecase.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/domain/error/failure.dart';
5 | import 'package:injectable/injectable.dart';
6 |
7 | @lazySingleton
8 | class ClearCacheDemo implements UseCase {
9 | ClearCacheDemo({required this.repository});
10 |
11 | final DemoRepository repository;
12 |
13 | @override
14 | Future> call(NoParams params) async {
15 | return repository.clearCacheDemo();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/application/usecases/demo.dart:
--------------------------------------------------------------------------------
1 | import 'package:dartz/dartz.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/domain/repositories/demo_repository.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/application/usecases/usecase.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/domain/error/failure.dart';
5 | import 'package:injectable/injectable.dart';
6 |
7 | @lazySingleton
8 | class Demo implements UseCase {
9 | Demo({required this.repository});
10 |
11 | final DemoRepository repository;
12 |
13 | @override
14 | Future> call(Params params) async {
15 | return repository.demoMethod(params.demoDetail);
16 | }
17 | }
18 |
19 | class Params {
20 | Params({required this.demoDetail});
21 |
22 | final String demoDetail;
23 | }
24 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/application/usecases/get_cached_demo.dart:
--------------------------------------------------------------------------------
1 | import 'package:dartz/dartz.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/domain/entities/demo.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/domain/repositories/demo_repository.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/application/usecases/usecase.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/domain/error/failure.dart';
6 | import 'package:injectable/injectable.dart';
7 |
8 | @lazySingleton
9 | class GetCachedDemo implements UseCase {
10 | GetCachedDemo({required this.repository});
11 |
12 | final DemoRepository repository;
13 |
14 | @override
15 | Future> call(NoParams params) async {
16 | return repository.getCachedDemo();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
12 | polar: # Replace with a single Polar username
13 | buy_me_a_coffee: vberazateguisilva
14 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
15 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 9.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/assets/l10n/intl_en.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "en",
3 | "fb_tx_without_connection": "Without connection",
4 | "@fb_tx_without_connection": {
5 | "description": "Texto de notificación que indica error de conexión"
6 | },
7 | "fb_tx_expired_time": "Expired time",
8 | "@fb_tx_expired_time": {
9 | "description": "Texto de notificación que indica tiempo expirado"
10 | },
11 | "fb_tx_internal_server_error": "Internal server error",
12 | "@fb_tx_internal_server_error": {
13 | "description": "Texto de notificación para mostrar cuando el servidor no brinda un mensaje de respuesta"
14 | },
15 | "fb_tx_unexpected_error": "An unexpected error has occurred",
16 | "@fb_tx_unexpected_error": {
17 | "description": "Texto de notificación de que ha ocurrido un error inesperado"
18 | },
19 | "tx_demo": "Flutter DDD skeleton",
20 | "@tx_demo": {
21 | "description": "Texto del proyecto"
22 | }
23 | }
--------------------------------------------------------------------------------
/assets/l10n/intl_es.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "es",
3 | "fb_tx_without_connection": "Sin conexion a Internet",
4 | "@fb_tx_without_connection": {
5 | "description": "Texto de notificación que indica error de conexión"
6 | },
7 | "fb_tx_expired_time": "Tiempo expirado",
8 | "@fb_tx_expired_time": {
9 | "description": "Texto de notificación que indica tiempo expirado"
10 | },
11 | "fb_tx_internal_server_error": "Error interno del servidor",
12 | "@fb_tx_internal_server_error": {
13 | "description": "Texto de notificación para mostrar cuando el servidor no brinda un mensaje de respuesta"
14 | },
15 | "fb_tx_unexpected_error": "Ha ocurrido un error inesperado",
16 | "@fb_tx_unexpected_error": {
17 | "description": "Texto de notificación de que ha ocurrido un error inesperado"
18 | },
19 | "tx_demo": "Flutter DDD esqueleto",
20 | "@tx_demo": {
21 | "description": "Texto del proyecto"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | **/ios/Flutter/.last_build_id
26 | .dart_tool/
27 | .flutter-plugins
28 | .flutter-plugins-dependencies
29 | .packages
30 | .pub-cache/
31 | .pub/
32 | /build/
33 |
34 | # Web related
35 | lib/generated_plugin_registrant.dart
36 |
37 | # Symbolication related
38 | app.*.symbols
39 |
40 | # Obfuscation related
41 | app.*.map.json
42 |
43 | # Android Studio will place build artifacts here
44 | /android/app/debug
45 | /android/app/profile
46 | /android/app/release
47 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/application/usecases/cache_demo.dart:
--------------------------------------------------------------------------------
1 | import 'package:dartz/dartz.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/domain/entities/demo.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/domain/repositories/demo_repository.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/application/usecases/usecase.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/domain/error/failure.dart';
6 | import 'package:injectable/injectable.dart';
7 |
8 | @lazySingleton
9 | class CacheDemo implements UseCase {
10 | CacheDemo({required this.repository});
11 |
12 | final DemoRepository repository;
13 |
14 | @override
15 | Future> call(Params params) async {
16 | return repository.cacheDemo(params.user);
17 | }
18 | }
19 |
20 | class Params {
21 | Params({required this.user});
22 |
23 | final Demo user;
24 | }
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # flutter_ddd_skeleton
2 |
3 | This is a Flutter project DDD skeleton, inspired by the amazing ResoCoder's tutorials:
4 |
5 | [Flutter TDD Clean Architecture](https://www.youtube.com/playlist?list=PLB6lc7nQ1n4iYGE_khpXRdJkJEp9WOech)
6 | [Flutter Firebase & DDD](https://www.youtube.com/playlist?list=PLB6lc7nQ1n4iS5p-IezFFgqP6YvAJy84U)
7 |
8 | 
9 |
10 | 
11 |
12 | Also in this ready to go DDD skeleton is configured:
13 | * Theming.
14 | * l10n and i18n.
15 | * Provider state management solution.
16 | * Either repository responses.
17 | * Dio client for http requests.
18 | * File flavour configuration.
19 | * File environment configuration.
20 | * Getit injection dependencies.
21 | * Auto-route route solution.
22 | * Flutter code generator for your asset.
23 | * Flutter gherkin integration test.
24 | * FVM configuration.
25 | * Makefile for useful commands.
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/flavour/flavour_1/main.dev.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/assets/assets.gen.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/main_common.dart';
6 | import 'package:global_configuration/global_configuration.dart';
7 | import 'package:logger/logger.dart';
8 |
9 | Future main() async {
10 | //! Init flutter Biding
11 | WidgetsFlutterBinding.ensureInitialized();
12 |
13 | //! Load log level
14 | Logger.level = Level.verbose;
15 |
16 | //! Load environment conf
17 | await GlobalConfiguration()
18 | .loadFromPath(Assets.config.flavour.flavour1.devEnvironment);
19 |
20 | //! Load dependencies injections
21 | configureInjection();
22 |
23 | await mainCommon(Flavour.flavour_1);
24 | }
25 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/flavour/flavour_1/main.prod.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/assets/assets.gen.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/main_common.dart';
6 | import 'package:global_configuration/global_configuration.dart';
7 | import 'package:logger/logger.dart';
8 |
9 | Future main() async {
10 | //! Init flutter Biding
11 | WidgetsFlutterBinding.ensureInitialized();
12 |
13 | //! Load log level
14 | Logger.level = Level.error;
15 |
16 | //! Load environment conf
17 | await GlobalConfiguration()
18 | .loadFromPath(Assets.config.flavour.flavour1.prodEnvironment);
19 |
20 | //! Load dependencies injections
21 | configureInjection();
22 |
23 | await mainCommon(Flavour.flavour_1);
24 | }
25 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/flavour/flavour_2/main.dev.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/assets/assets.gen.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/main_common.dart';
6 | import 'package:global_configuration/global_configuration.dart';
7 | import 'package:logger/logger.dart';
8 |
9 | Future main() async {
10 | //! Init flutter Biding
11 | WidgetsFlutterBinding.ensureInitialized();
12 |
13 | //! Load log level
14 | Logger.level = Level.verbose;
15 |
16 | //! Load environment conf
17 | await GlobalConfiguration()
18 | .loadFromPath(Assets.config.flavour.flavour2.devEnvironment);
19 |
20 | //! Load dependencies injections
21 | configureInjection();
22 |
23 | await mainCommon(Flavour.flavour_2);
24 | }
25 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/flavour/flavour_2/main.prod.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/assets/assets.gen.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/main_common.dart';
6 | import 'package:global_configuration/global_configuration.dart';
7 | import 'package:logger/logger.dart';
8 |
9 | Future main() async {
10 | //! Init flutter Biding
11 | WidgetsFlutterBinding.ensureInitialized();
12 |
13 | //! Load log level
14 | Logger.level = Level.error;
15 |
16 | //! Load environment conf
17 | await GlobalConfiguration()
18 | .loadFromPath(Assets.config.flavour.flavour2.prodEnvironment);
19 |
20 | //! Load dependencies injections
21 | configureInjection();
22 |
23 | await mainCommon(Flavour.flavour_2);
24 | }
25 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/base_bloc/base_bloc.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/base_bloc/bloc_state.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/base_bloc/snackbar_state.dart';
4 |
5 | class BaseBLoC extends ChangeNotifier {
6 | BLoCState _state = BLoCState.idle;
7 | late String _snackBarMessage;
8 | SnackBarState _snackBarState = SnackBarState.info;
9 |
10 | // ignore: unnecessary_getters_setters
11 | BLoCState get state => _state;
12 | String get snackBarMessage => _snackBarMessage;
13 | SnackBarState get snackBarState => _snackBarState;
14 |
15 | // ignore: unnecessary_getters_setters
16 | set state(BLoCState value) {
17 | _state = value;
18 | }
19 |
20 | void setNotify(BLoCState viewState) {
21 | _state = viewState;
22 | notifyListeners();
23 | }
24 |
25 | void setMessage(SnackBarState snackBarState, String message) {
26 | _snackBarState = snackBarState;
27 | _snackBarMessage = message;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/test_driver/index.js:
--------------------------------------------------------------------------------
1 | var reporter = require('cucumber-html-reporter');
2 |
3 | var options = {
4 | theme: 'bootstrap',
5 | jsonFile: 'test_driver/reporters/cucumber_report.json',
6 | output: 'test_driver/reporters/cucumber_report.html',
7 | reportSuiteAsScenarios: true,
8 | scenarioTimestamp: true,
9 | launchReport: true,
10 | name: "flutter_ddd_skeleton",
11 | brandTitle: "Integration tests",
12 | storeScreenshots: true,
13 | scenarioTimestamp: true,
14 | metadata: {
15 | "App Version":"0.3.2",
16 | "Test Environment": "TESTING",
17 | "Browser": "Chrome 94.0.4606.54",
18 | "Platform": "Windows 10",
19 | "Parallel": "Scenarios",
20 | "Executed": "Remote",
21 | }
22 | };
23 |
24 | reporter.generate(options);
25 |
26 |
27 | //more info on `metadata` is available in `options` section below.
28 |
29 | //to generate consodilated report from multi-cucumber JSON files, please use `jsonDir` option instead of `jsonFile`. More info is available in `options` section below.
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:flutter_ddd_skeleton/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(const MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/test_driver/flavour/flavour_1/app_dev.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/assets/assets.gen.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/main_common.dart';
5 | import 'package:flutter_driver/driver_extension.dart';
6 | import 'package:global_configuration/global_configuration.dart';
7 | import 'package:logger/logger.dart';
8 |
9 | Future main() async {
10 | // This line enables the extension
11 | enableFlutterDriverExtension();
12 |
13 | //! Load log level
14 | Logger.level = Level.verbose;
15 |
16 | //! Load environment conf
17 | await GlobalConfiguration()
18 | .loadFromPath(Assets.config.flavour.flavour1.devEnvironment);
19 |
20 | //! Load dependencies injections
21 | configureInjection();
22 |
23 | // Call the `main()` function of your app or call `runApp` with any widget you
24 | // are interested in testing.
25 | await mainCommon(Flavour.flavour_1);
26 | }
27 |
--------------------------------------------------------------------------------
/test_driver/flavour/flavour_2/app_dev.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/assets/assets.gen.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/main_common.dart';
5 | import 'package:flutter_driver/driver_extension.dart';
6 | import 'package:global_configuration/global_configuration.dart';
7 | import 'package:logger/logger.dart';
8 |
9 | Future main() async {
10 | // This line enables the extension
11 | enableFlutterDriverExtension();
12 |
13 | //! Load log level
14 | Logger.level = Level.verbose;
15 |
16 | //! Load environment conf
17 | await GlobalConfiguration()
18 | .loadFromPath(Assets.config.flavour.flavour2.devEnvironment);
19 |
20 | //! Load dependencies injections
21 | configureInjection();
22 |
23 | // Call the `main()` function of your app or call `runApp` with any widget you
24 | // are interested in testing.
25 | await mainCommon(Flavour.flavour_2);
26 | }
27 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/routes/router.gr.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | // **************************************************************************
4 | // AutoRouteGenerator
5 | // **************************************************************************
6 |
7 | import 'package:auto_route/auto_route.dart' as _i2;
8 | import 'package:flutter/material.dart' as _i3;
9 |
10 | import '../../../demo/presentation/demo_page.dart' as _i1;
11 |
12 | class AppRouter extends _i2.RootStackRouter {
13 | AppRouter([_i3.GlobalKey<_i3.NavigatorState>? navigatorKey])
14 | : super(navigatorKey);
15 |
16 | @override
17 | final Map pagesMap = {
18 | DemoRoute.name: (routeData) {
19 | return _i2.MaterialPageX(
20 | routeData: routeData, child: _i1.DemoPage());
21 | }
22 | };
23 |
24 | @override
25 | List<_i2.RouteConfig> get routes =>
26 | [_i2.RouteConfig(DemoRoute.name, path: '/')];
27 | }
28 |
29 | /// generated route for [_i1.DemoPage]
30 | class DemoRoute extends _i2.PageRouteInfo {
31 | const DemoRoute() : super(name, path: '/');
32 |
33 | static const String name = 'DemoRoute';
34 | }
35 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/flavour/flavour_1/main.test.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/assets/assets.gen.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/main_common.dart';
6 | import 'package:flutter_driver/driver_extension.dart';
7 | import 'package:global_configuration/global_configuration.dart';
8 | import 'package:logger/logger.dart';
9 |
10 | Future main() async {
11 | //! Enable remote testing
12 | enableFlutterDriverExtension();
13 |
14 | //! Init flutter Biding
15 | WidgetsFlutterBinding.ensureInitialized();
16 |
17 | //! Load log level
18 | Logger.level = Level.info;
19 |
20 | //! Load environment conf
21 | await GlobalConfiguration()
22 | .loadFromPath(Assets.config.flavour.flavour1.testEnvironment);
23 |
24 | //! Load dependencies injections
25 | configureInjection();
26 |
27 | await mainCommon(Flavour.flavour_1);
28 | }
29 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/flavour/flavour_2/main.test.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/assets/assets.gen.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/main_common.dart';
6 | import 'package:flutter_driver/driver_extension.dart';
7 | import 'package:global_configuration/global_configuration.dart';
8 | import 'package:logger/logger.dart';
9 |
10 | Future main() async {
11 | //! Enable remote testing
12 | enableFlutterDriverExtension();
13 |
14 | //! Init flutter Biding
15 | WidgetsFlutterBinding.ensureInitialized();
16 |
17 | //! Load log level
18 | Logger.level = Level.info;
19 |
20 | //! Load environment conf
21 | await GlobalConfiguration()
22 | .loadFromPath(Assets.config.flavour.flavour2.testEnvironment);
23 |
24 | //! Load dependencies injections
25 | configureInjection();
26 |
27 | await mainCommon(Flavour.flavour_2);
28 | }
29 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/infrastructure/network/http_handle_error.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:dio/dio.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/domain/error/failure.dart';
5 | import 'package:injectable/injectable.dart';
6 |
7 | @lazySingleton
8 | class HttpHandleError {
9 | Failure getFailure(DioError e) {
10 | switch (e.type) {
11 |
12 | /// When opening url timeout, it occurs.
13 | case DioErrorType.connectTimeout:
14 | return ConnectTimeOutFailure();
15 |
16 | /// It occurs when receiving timeout.
17 | case DioErrorType.receiveTimeout:
18 | return ReceiveTimeOutFailure();
19 |
20 | /// When the server response,
21 | /// but with a incorrect status, such as 404, 503...
22 | case DioErrorType.response:
23 | Map parsedJson;
24 | e.response != null
25 | ? parsedJson = json.decode(utf8.decode(e.response!.data))
26 | : parsedJson = {};
27 | return ServerFailure(parsedJson['message']);
28 |
29 | /// Default error type, Some other Error. In this case, you can
30 | /// read the DioError.error if it is not null.
31 | // case DioErrorType.DEFAULT:
32 | default:
33 | return NoInternetFailure();
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/test_driver/bdd_test.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_gherkin/flutter_gherkin.dart';
2 | import 'package:gherkin/gherkin.dart';
3 | import 'package:glob/glob.dart';
4 |
5 | import 'hooks.dart';
6 |
7 | Future main(List args) {
8 | final config = FlutterTestConfiguration()
9 | // ignore: unnecessary_raw_strings
10 | ..features = [Glob(r'test_driver/features/**.feature')]
11 | ..reporters = [
12 | StdoutReporter(),
13 | FlutterDriverReporter(),
14 | ProgressReporter(),
15 | TestRunSummaryReporter(),
16 | JsonReporter(path: './test_driver/reporters/cucumber_report.json')
17 | ]
18 | ..hooks = [Hooks(), AttachScreenshotOnFailedStepHook()]
19 | ..stepDefinitions = []
20 | ..customStepParameterDefinitions = []
21 | ..restartAppBetweenScenarios = false
22 | ..targetAppPath = 'test_driver/flavour/flavour_1/app_dev.dart'
23 | ..order = ExecutionOrder.sequential
24 | // uncomment to see an example of running scenarios based on tag expressions
25 | //'@supervisor_background' '@cashier_background' '@supervisor' '@cashier'
26 | ..tagExpression = '@test'
27 | ..logFlutterProcessOutput = true
28 | ..flutterBuildTimeout = const Duration(minutes: 10);
29 |
30 | if (args.isNotEmpty) config.runningAppProtocolEndpointUri = args[0];
31 |
32 | return GherkinRunner().execute(config);
33 | }
34 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/infrastructure/datasources/demo_remote_data_source.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:dio/dio.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/infrastructure/error/exceptions.dart';
5 | import 'package:global_configuration/global_configuration.dart';
6 | import 'package:injectable/injectable.dart';
7 |
8 | // ignore: one_member_abstracts
9 | abstract class DemoRemoteDataSource {
10 | Future demoMethod(String demoDetail);
11 | }
12 |
13 | @LazySingleton(as: DemoRemoteDataSource)
14 | class DemoRemoteDataSourceImpl implements DemoRemoteDataSource {
15 | DemoRemoteDataSourceImpl({required this.client});
16 |
17 | final Dio client;
18 | final _demoUrl = GlobalConfiguration().get('demo_url');
19 |
20 | @override
21 | Future demoMethod(String demoDetail) async {
22 | final url = '$_demoUrl'
23 | .replaceFirst('{demoDetail}', Uri.encodeComponent(demoDetail));
24 |
25 | final response = await client.post(url);
26 |
27 | final parsedJson =
28 | response.data.isEmpty ? null : json.decode(utf8.decode(response.data));
29 |
30 | if (response.statusCode != 200) {
31 | if (parsedJson != null) {
32 | throw ServerException(parsedJson['message']);
33 | } else {
34 | throw ServerException('No hay iformación con los datos ingresados');
35 | }
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/infrastructure/datasources/demo_local_data_source.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/infrastructure/dtos/demo_dto.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/infrastructure/error/exceptions.dart';
5 | import 'package:injectable/injectable.dart';
6 | import 'package:shared_preferences/shared_preferences.dart';
7 |
8 | // Values stored in phone's memory.
9 | const cachedDemo = 'CACHED_DEMO';
10 |
11 | abstract class DemoLocalDataSource {
12 | Future cacheDemo(DemoDto demoDto);
13 | Future getCachedDemo();
14 | Future clearCacheDemo();
15 | }
16 |
17 | @LazySingleton(as: DemoLocalDataSource)
18 | class DemoLocalDataSourceImpl implements DemoLocalDataSource {
19 | @override
20 | Future cacheDemo(DemoDto userDto) async {
21 | final cache = await SharedPreferences.getInstance();
22 |
23 | await cache.setString(
24 | cachedDemo,
25 | json.encode(userDto.toJson()),
26 | );
27 | }
28 |
29 | @override
30 | Future getCachedDemo() async {
31 | final cache = await SharedPreferences.getInstance();
32 |
33 | final jsonString = cache.getString(cachedDemo);
34 |
35 | if (jsonString != null) {
36 | return DemoDto.fromJson(json.decode(jsonString));
37 | } else {
38 | throw CacheException();
39 | }
40 | }
41 |
42 | @override
43 | Future clearCacheDemo() async {
44 | final cache = await SharedPreferences.getInstance();
45 |
46 | await cache.remove(cachedDemo);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/blocs/configuration_bloc.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/enums/flavour.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/theme/app_themes.dart';
4 | import 'package:injectable/injectable.dart';
5 |
6 | // Global BLoC for controlling the state of configuration
7 | @lazySingleton
8 | class ConfigurationBLoC with ChangeNotifier {
9 | ConfigurationBLoC({required Flavour flavour}) {
10 | switch (flavour) {
11 | case Flavour.flavour_1:
12 | _flavourTheme = AppTheme.flavour1Theme;
13 | break;
14 | case Flavour.flavour_2:
15 | _flavourTheme = AppTheme.flavour2Theme;
16 | break;
17 | }
18 |
19 | _flavour = flavour;
20 | _flavourThemeData = appThemeData[_flavourTheme]!;
21 | }
22 |
23 | late ThemeData _flavourThemeData;
24 | late AppTheme _flavourTheme;
25 | late Flavour _flavour;
26 |
27 | ThemeData get flavourThemeData => _flavourThemeData;
28 | AppTheme get flavourTheme => _flavourTheme;
29 | Flavour get flavour => _flavour;
30 |
31 | Future toggleAppTheme() async {
32 | switch (_flavourTheme) {
33 | case AppTheme.flavour1Theme:
34 | _flavourTheme = AppTheme.flavour2Theme;
35 | _flavourThemeData = appThemeData[_flavourTheme]!;
36 | break;
37 | case AppTheme.flavour2Theme:
38 | _flavourTheme = AppTheme.flavour1Theme;
39 | _flavourThemeData = appThemeData[_flavourTheme]!;
40 | break;
41 | }
42 | notifyListeners();
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | flutter_ddd_skeleton
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/presentation/demo_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/presentation/blocs/demo_page_bloc.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/injection/injection.dart';
4 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/lang/l10n.dart';
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/routes/router.gr.dart';
6 | import 'package:provider/provider.dart';
7 |
8 | class DemoPage extends StatefulWidget {
9 | const DemoPage() : super(key: const ValueKey(DemoRoute.name));
10 |
11 | @override
12 | // ignore: library_private_types_in_public_api
13 | _DemoPageState createState() => _DemoPageState();
14 | }
15 |
16 | class _DemoPageState extends State {
17 | final _bloc = getIt();
18 |
19 | @override
20 | Widget build(BuildContext context) {
21 | final body = SafeArea(
22 | child: ChangeNotifierProvider(
23 | create: (context) => _bloc,
24 | child: Consumer(
25 | builder: (context, bloc, child) => Center(
26 | child: Text(
27 | AppLocalizations.of(context).tx_demo,
28 | style: Theme.of(context).textTheme.bodyText1!.copyWith(
29 | color: Theme.of(context).primaryColor,
30 | ),
31 | ),
32 | ),
33 | ),
34 | ),
35 | );
36 |
37 | return Scaffold(
38 | resizeToAvoidBottomInset: false,
39 | body: Builder(
40 | builder: (BuildContext context) {
41 | return body;
42 | },
43 | ),
44 | );
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_1.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {"images":[{"size":"20x20","idiom":"iphone","filename":"AppIcon-flavour_1-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"AppIcon-flavour_1-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-flavour_1-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-flavour_1-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-flavour_1-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"AppIcon-flavour_1-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"AppIcon-flavour_1-40x40@3x.png","scale":"3x"},{"size":"60x60","idiom":"iphone","filename":"AppIcon-flavour_1-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"AppIcon-flavour_1-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"AppIcon-flavour_1-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"AppIcon-flavour_1-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"AppIcon-flavour_1-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"AppIcon-flavour_1-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"AppIcon-flavour_1-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"AppIcon-flavour_1-40x40@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"AppIcon-flavour_1-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"AppIcon-flavour_1-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"AppIcon-flavour_1-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"AppIcon-flavour_1-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon-flavour_2.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {"images":[{"size":"20x20","idiom":"iphone","filename":"AppIcon-flavour_2-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"AppIcon-flavour_2-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-flavour_2-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-flavour_2-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-flavour_2-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"AppIcon-flavour_2-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"AppIcon-flavour_2-40x40@3x.png","scale":"3x"},{"size":"60x60","idiom":"iphone","filename":"AppIcon-flavour_2-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"AppIcon-flavour_2-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"AppIcon-flavour_2-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"AppIcon-flavour_2-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"AppIcon-flavour_2-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"AppIcon-flavour_2-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"AppIcon-flavour_2-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"AppIcon-flavour_2-40x40@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"AppIcon-flavour_2-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"AppIcon-flavour_2-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"AppIcon-flavour_2-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"AppIcon-flavour_2-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/lang/intl/messages_en.dart:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
2 | // This is a library that provides messages for a en locale. All the
3 | // messages from the main program should be duplicated here with the same
4 | // function name.
5 |
6 | // Ignore issues from commonly used lints in this file.
7 | // ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
8 | // ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
9 | // ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
10 | // ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
11 | // ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
12 |
13 | import 'package:intl/intl.dart';
14 | import 'package:intl/message_lookup_by_library.dart';
15 |
16 | final messages = new MessageLookup();
17 |
18 | typedef String MessageIfAbsent(String messageStr, List args);
19 |
20 | class MessageLookup extends MessageLookupByLibrary {
21 | String get localeName => 'en';
22 |
23 | final messages = _notInlinedMessages(_notInlinedMessages);
24 | static Map _notInlinedMessages(_) => {
25 | "fb_tx_expired_time":
26 | MessageLookupByLibrary.simpleMessage("Expired time"),
27 | "fb_tx_internal_server_error":
28 | MessageLookupByLibrary.simpleMessage("Internal server error"),
29 | "fb_tx_unexpected_error": MessageLookupByLibrary.simpleMessage(
30 | "An unexpected error has occurred"),
31 | "fb_tx_without_connection":
32 | MessageLookupByLibrary.simpleMessage("Without connection"),
33 | "tx_demo": MessageLookupByLibrary.simpleMessage("Flutter DDD skeleton")
34 | };
35 | }
36 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/presentation/lang/intl/messages_es.dart:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
2 | // This is a library that provides messages for a es locale. All the
3 | // messages from the main program should be duplicated here with the same
4 | // function name.
5 |
6 | // Ignore issues from commonly used lints in this file.
7 | // ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
8 | // ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
9 | // ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
10 | // ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
11 | // ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
12 |
13 | import 'package:intl/intl.dart';
14 | import 'package:intl/message_lookup_by_library.dart';
15 |
16 | final messages = new MessageLookup();
17 |
18 | typedef String MessageIfAbsent(String messageStr, List args);
19 |
20 | class MessageLookup extends MessageLookupByLibrary {
21 | String get localeName => 'es';
22 |
23 | final messages = _notInlinedMessages(_notInlinedMessages);
24 | static Map _notInlinedMessages(_) => {
25 | "fb_tx_expired_time":
26 | MessageLookupByLibrary.simpleMessage("Tiempo expirado"),
27 | "fb_tx_internal_server_error":
28 | MessageLookupByLibrary.simpleMessage("Error interno del servidor"),
29 | "fb_tx_unexpected_error": MessageLookupByLibrary.simpleMessage(
30 | "Ha ocurrido un error inesperado"),
31 | "fb_tx_without_connection":
32 | MessageLookupByLibrary.simpleMessage("Sin conexion a Internet"),
33 | "tx_demo": MessageLookupByLibrary.simpleMessage("Flutter DDD esqueleto")
34 | };
35 | }
36 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/shared/domain/error/failure.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/lang/l10n.dart';
2 |
3 | class Failure {
4 | Failure({String? message, String? prefix, String? emoji})
5 | : _message = message,
6 | _prefix = prefix,
7 | _emoji = emoji;
8 |
9 | String? _message;
10 | String? _prefix;
11 | String? _emoji;
12 |
13 | // ignore: avoid_setters_without_getters
14 | set message(String? value) {
15 | _message = value;
16 | }
17 |
18 | // ignore: avoid_setters_without_getters
19 | set prefix(String? value) {
20 | _prefix = value;
21 | }
22 |
23 | // ignore: avoid_setters_without_getters
24 | set emoji(String? value) {
25 | _emoji = value;
26 | }
27 |
28 | @override
29 | String toString() => (_prefix ?? '') + (_message ?? '') + (_emoji ?? '');
30 | }
31 |
32 | class NoInternetFailure extends Failure {
33 | NoInternetFailure()
34 | : super(message: AppLocalizations.current.fb_tx_without_connection);
35 | }
36 |
37 | class ReceiveTimeOutFailure extends Failure {
38 | ReceiveTimeOutFailure()
39 | : super(message: AppLocalizations.current.fb_tx_expired_time);
40 | }
41 |
42 | class ConnectTimeOutFailure extends Failure {
43 | ConnectTimeOutFailure()
44 | : super(message: AppLocalizations.current.fb_tx_expired_time);
45 | }
46 |
47 | class ServerFailure extends Failure {
48 | ServerFailure(String message)
49 | : super(
50 | message: message.isEmpty
51 | ? AppLocalizations.current.fb_tx_internal_server_error
52 | : message,
53 | );
54 | }
55 |
56 | class CacheFailure extends Failure {}
57 |
58 | class UnexpectedFailure extends Failure {
59 | UnexpectedFailure()
60 | : super(message: AppLocalizations.current.fb_tx_unexpected_error);
61 | }
62 |
--------------------------------------------------------------------------------
/lib/src/uy/com/vberazategui/demo/presentation/blocs/demo_page_bloc.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/application/usecases/cache_demo.dart';
2 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/application/usecases/clear_cache_demo.dart';
3 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/application/usecases/demo.dart'
4 | as d_uc;
5 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/demo/application/usecases/get_cached_demo.dart';
6 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/base_bloc/base_bloc.dart';
7 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/base_bloc/bloc_state.dart';
8 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/base_bloc/snackbar_state.dart';
9 | import 'package:flutter_ddd_skeleton/src/uy/com/vberazategui/shared/presentation/mixins/validation_mixin.dart';
10 | import 'package:injectable/injectable.dart';
11 |
12 | @injectable
13 | class DemoPageBLoC extends BaseBLoC with ValidationMixin {
14 | DemoPageBLoC({
15 | required this.demoUseCase,
16 | required this.cacheDemoUseCase,
17 | required this.getCachedDemoUseCase,
18 | required this.clearCacheDemoUseCase,
19 | });
20 |
21 | final d_uc.Demo demoUseCase;
22 | final CacheDemo cacheDemoUseCase;
23 | final GetCachedDemo getCachedDemoUseCase;
24 | final ClearCacheDemo clearCacheDemoUseCase;
25 |
26 | Future demo() async {
27 | setNotify(BLoCState.busy);
28 |
29 | final result = await demoUseCase.call(d_uc.Params(demoDetail: 'something'));
30 |
31 | result.fold(
32 | (failure) => setMessage(SnackBarState.error, failure.toString()),
33 | (value) => setMessage(SnackBarState.info, ''),
34 | );
35 |
36 | setNotify(BLoCState.idle);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/makefile:
--------------------------------------------------------------------------------
1 | .PHONY: clean, get, generate, regenerate, format, lint, fix, icon, splash, intl, sign, build-apk, report
2 |
3 | clean: ## Cleans the environment
4 | @echo "╠ Cleaning the project..."
5 | @fvm flutter clean
6 |
7 | get: ## Get project dependencies
8 | @echo "╠ Get dependencies"
9 | @fvm flutter pub get
10 |
11 | generate: ## Generates autogenerated code
12 | @echo "╠ Generating code"
13 | @fvm flutter pub run build_runner build
14 |
15 | regenerate: ## Regenerates autogenerated code
16 | @echo "╠ Re-generating code"
17 | @fvm flutter pub run build_runner build --delete-conflicting-outputs
18 |
19 | format: ## Formats the code
20 | @echo "╠ Formatting the code"
21 | dart format .
22 |
23 | lint: ## Lints the code
24 | @echo "╠ Verifying code..."
25 | @fvm flutter analyze . || (echo "Error in project"; exit 1)
26 |
27 | fix: ## Fix the code
28 | @echo "╠ Fixing the code"
29 | dart fix --apply .
30 |
31 | icon: ## Generates launcher icon
32 | @echo "╠ Making launcher icon"
33 | @fvm flutter pub run flutter_launcher_icons -f flutter_launcher_icons*
34 |
35 | splash: ## Generates native splash
36 | @echo "╠ Making native splash"
37 | @fvm flutter pub run flutter_native_splash:create
38 |
39 | intl:
40 | flutter pub run intl_utils:generate
41 |
42 | sign: ## Sign apk
43 | @echo "╠ Signing apk..."
44 | keytool -genkey -v -keystore key.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias key
45 |
46 | build-apk: ## Build mobile application
47 | @echo "╠ Building mobile application"
48 | @fvm flutter build apk --release --flavor $(flavour) -t lib/shared/presentation/flavour/flavour_1/main.dev.dart --shrink --obfuscate --split-debug-info=./obfuscatation/debug
49 |
50 |
51 | report: ## Generate test report
52 | @echo "╠ Installing cucumber-html-reporter..."
53 | npm install cucumber-html-reporter --save-dev
54 |
55 | @echo "╠ Generating reporter..."
56 | node test_driver/index.js
57 |
58 |
--------------------------------------------------------------------------------
/test_driver/hooks.dart:
--------------------------------------------------------------------------------
1 | // ignore_for_file: avoid_print
2 |
3 | import 'package:gherkin/gherkin.dart';
4 |
5 | class Hooks extends Hook {
6 | /// The priority to assign to this hook.
7 | /// Higher priority gets run first so a priority of 10 is run before
8 | /// a priority of 2
9 | @override
10 | int get priority => 1;
11 |
12 | /// Run before any scenario in a test run have executed
13 | @override
14 | Future onBeforeRun(TestConfiguration config) async =>
15 | print('------------ Before run hook ------------');
16 |
17 | /// Run after all scenarios in a test run have completed
18 | @override
19 | Future onAfterRun(TestConfiguration config) async =>
20 | print('------------ After run hook ------------');
21 |
22 | /// Run after the scenario world is created but run before a scenario
23 | /// and its steps are executed
24 | /// Might not be invoked if there is not a world object
25 | @override
26 | Future onAfterScenarioWorldCreated(
27 | World world,
28 | String scenario,
29 | Iterable tags,
30 | ) async =>
31 | print("------------ After scenario world created' ------------");
32 |
33 | /// Run before a scenario and it steps are executed
34 | @override
35 | Future onBeforeScenario(
36 | TestConfiguration config,
37 | String scenario,
38 | Iterable tags,
39 | ) async =>
40 | print(
41 | "------------ Running hook before scenario '$scenario' ------------");
42 |
43 | /// Run after a scenario has executed
44 | @override
45 | Future onAfterScenario(
46 | TestConfiguration config,
47 | String scenario,
48 | Iterable tags,
49 | ) async =>
50 | print("------------ Running hook after scenario '$scenario'------------");
51 |
52 | /// Run before a step is executed
53 | @override
54 | Future onBeforeStep(World world, String step) => Future.value(null);
55 |
56 | /// Run after a step has executed
57 | @override
58 | Future onAfterStep(
59 | World world, String step, StepResult stepResult) async {
60 | if (stepResult.result == StepExecutionResult.fail) {
61 | world
62 | ..attach('Step execution result.', 'text/plain')
63 | ..attach(stepResult.resultReason!, 'application/json');
64 | }
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
13 |
17 |
21 |
26 |
30 |
31 |
32 |
33 |
34 |
35 |
37 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: flutter_ddd_skeleton
2 | description: A new Flutter application for DDD architecture skeleton.
3 |
4 | # The following line prevents the package from being accidentally published to
5 | # pub.dev using `flutter pub publish`. This is preferred for private packages.
6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev
7 |
8 | version: 1.0.0+1
9 |
10 | environment:
11 | sdk: ">=2.12.0 <3.0.0"
12 |
13 | dependencies:
14 | async: ^2.8.1
15 | auto_route: ^2.3.2
16 | cupertino_icons: ^1.0.4
17 | dartz: ^0.10.0
18 | dio: ^4.0.3
19 | flash: ^2.0.3
20 | flutter:
21 | sdk: flutter
22 | flutter_gherkin: ^2.0.0
23 | flutter_localizations:
24 | sdk: flutter
25 | flutter_svg: ^0.23.0+1
26 | get_it: ^7.2.0
27 | global_configuration: ^2.0.0-nullsafety.1
28 | injectable: ^1.5.0
29 | logger: ^1.1.0
30 | path_provider: ^2.0.7
31 | provider: ^6.0.1
32 | rxdart: ^0.27.2
33 | shared_preferences: ^2.0.9
34 |
35 | dev_dependencies:
36 | auto_route_generator: ^2.3.2
37 | build_runner: ^2.1.5
38 | flutter_driver: # ui test
39 | sdk: flutter
40 | flutter_gen_runner: ^4.1.2
41 | flutter_launcher_icons: ^0.9.2
42 | flutter_test:
43 | sdk: flutter
44 | injectable_generator: ^1.5.2
45 | test: any
46 | very_good_analysis: ^2.4.0
47 |
48 | flutter:
49 | uses-material-design: true
50 |
51 | assets:
52 | # Config
53 | - assets/config/
54 | - assets/config/flavour/flavour_1/
55 | - assets/config/flavour/flavour_2/
56 |
57 | # Images
58 | - assets/images/launcher/
59 |
60 | flutter_intl:
61 | enabled: true
62 | # Optional
63 | # Default: es
64 | # [_
426 |
427 |
428 |
429 |
452 |
562 |