├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── ouedyan │ │ │ │ └── fluttermobiletemplate │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.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 │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── icons │ └── svg_menu.svg └── translations │ └── en.json ├── flutter_launcher_icons.yaml ├── flutter_native_splash.yaml ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── 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-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── main.dart └── src │ ├── core │ ├── base │ │ ├── bloc │ │ │ ├── app_bloc_observer.dart │ │ │ └── auth │ │ │ │ ├── auth_bloc.dart │ │ │ │ ├── auth_event.dart │ │ │ │ └── auth_state.dart │ │ ├── functions │ │ │ └── base_functions.dart │ │ ├── models │ │ │ ├── auth_response_model.dart │ │ │ └── auth_response_model.g.dart │ │ ├── services │ │ │ └── auth │ │ │ │ └── auth_service.dart │ │ └── singleton │ │ │ └── base_singleton.dart │ ├── components │ │ ├── animations │ │ │ ├── animatedLists │ │ │ │ ├── animated_grid_view.dart │ │ │ │ ├── animated_horizontal_list_view.dart │ │ │ │ ├── animated_list_view.dart │ │ │ │ └── animated_scroll_view_item.dart │ │ │ ├── animationUtils │ │ │ │ ├── animate_in_effect.dart │ │ │ │ ├── animated_scale.dart │ │ │ │ ├── animated_text.dart │ │ │ │ ├── animated_text_wrapper.dart │ │ │ │ ├── auto_fade.dart │ │ │ │ ├── fade_in_effect.dart │ │ │ │ ├── gyroscope_effect_stream_builder.dart │ │ │ │ ├── list_item_wrapper_widget.dart │ │ │ │ └── mouse_region_effect.dart │ │ │ └── provider │ │ │ │ └── gyroscope_provider.dart │ │ ├── appbar │ │ │ └── custom_app_bar.dart │ │ ├── button │ │ │ └── button_widget.dart │ │ ├── noNetwork │ │ │ └── no_network_widget.dart │ │ ├── popup │ │ │ └── main_popup.dart │ │ ├── scaffold │ │ │ └── custom_scaffold.dart │ │ ├── text │ │ │ └── custom_text.dart │ │ └── textFormField │ │ │ ├── text_form_field_widget.dart │ │ │ └── validate_operations.dart │ ├── constants │ │ ├── app │ │ │ ├── app_constants.dart │ │ │ └── color_constants.dart │ │ └── enums │ │ │ ├── icon_enums.dart │ │ │ ├── network_enums.dart │ │ │ ├── network_result_enums.dart │ │ │ └── route_enums.dart │ ├── extensions │ │ ├── context_extensions.dart │ │ ├── iterable_extensions.dart │ │ ├── logging_extension.dart │ │ ├── network_extensions.dart │ │ ├── num_extensions.dart │ │ └── string_extensions.dart │ ├── init │ │ ├── dependency_injector.dart │ │ ├── local_storage │ │ │ └── local_storage_manager.dart │ │ ├── main_build │ │ │ └── main_build.dart │ │ ├── network │ │ │ ├── network_change_manager.dart │ │ │ └── vexana_manager.dart │ │ ├── routes │ │ │ └── routes.dart │ │ ├── theme │ │ │ └── app_theme.dart │ │ └── utils │ │ │ └── typedefs.dart │ ├── locale_keys.g.dart │ └── mixins │ │ ├── launch_mixin.dart │ │ ├── safe_context_mixin.dart │ │ └── state_mixin.dart │ └── view │ ├── auth │ ├── login │ │ └── login_view.dart │ └── register │ │ └── register_view.dart │ └── home │ ├── bloc │ ├── home_bloc.dart │ ├── home_event.dart │ └── home_state.dart │ ├── home_view.dart │ ├── model │ ├── home_model.dart │ └── home_model.g.dart │ ├── service │ └── home_service.dart │ └── widgets │ └── home_card.dart ├── pubspec.lock ├── pubspec.yaml ├── scripts └── build.sh └── test └── auth └── auth_service_test.dart /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Web related 36 | lib/generated_plugin_registrant.dart 37 | 38 | # Symbolication related 39 | app.*.symbols 40 | 41 | # Obfuscation related 42 | app.*.map.json 43 | 44 | # Android Studio will place build artifacts here 45 | /android/app/debug 46 | /android/app/profile 47 | /android/app/release 48 | -------------------------------------------------------------------------------- /.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. 5 | 6 | version: 7 | revision: cd41fdd495f6944ecd3506c21e94c6567b073278 8 | channel: stable 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278 17 | base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278 18 | - platform: android 19 | create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278 20 | base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278 21 | - platform: ios 22 | create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278 23 | base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278 24 | 25 | # User provided section 26 | 27 | # List of Local paths (relative to this file) that should be 28 | # ignored by the migrate tool. 29 | # 30 | # Files that are not part of the templates will be ignored by default. 31 | unmanaged_files: 32 | - 'lib/main.dart' 33 | - 'ios/Runner.xcodeproj/project.pbxproj' 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flutter Mobile App Project Template by Zalisoft (flutter_bloc, provider, riverpod, go_router, vexana, url_launcher, json_serializable, easy_localization bot_toast, flutter_secure_storage, connectivity_plus, intl, sizer, google_fonts, flutter_native_splash, flutter_launcher_icons and other generally used features and tools in production.) 2 | 3 | This is a battery included [Flutter](https://flutter.dev/) project template. To the default setup have been added: 4 | 5 | - [flutter_bloc](https://bloclibrary.dev/) - Predictable and Highly testable state management library for Dart. 6 | - [provider](https://pub.dev/packages/provider) - Functional state management library using InheritedWidget, which is the most preferred next to BLoC. 7 | - [go_router](https://pub.dev/packages/go_router) - Robust and customizable Flutter navigation package. 8 | - [vexana](https://pub.dev/packages/vexana) - A powerful http client package overwritten by the dio package. 9 | - [url_launcher](https://pub.dev/packages/url_launcher) - Flutter plugin for launching a URL. Supports web, phone, SMS, and email schemes. 10 | - [connectivity_plus](https://pub.dev/packages/connectivity_plus) - This plugin allows Flutter apps to discover network connectivity and configure themselves accordingly. It can distinguish between cellular vs WiFi connection. 11 | - [json_serializable](https://pub.dev/packages/json_serializable) - Generates to/from json serialization code for our data models. 12 | - [easy_localization](https://pub.dev/packages/easy_localization) - Easy and Fast internationalization. 13 | - [bot_toast](https://pub.dev/packages/bot_toast) - Feature-Rich Toast/alert/notification/popup library for Flutter. 14 | - [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage) - A Flutter plugin to store data in secure storage (encrypted, not in plain text like shared_preferences). Eg. for storing user credentials, tokens... 15 | - [intl](https://pub.dev/packages/intl) - Provides internationalization and localization facilities, including message translation, plurals and genders, date/number formatting and parsing, and bidirectional text. 16 | - [sizer](https://pub.dev/packages/sizer) - A package for adapting screen and font size. 17 | - [flutter_svg](https://pub.dev/packages/flutter_svg) - For rendering SVG assets. 18 | - [google_fonts](https://pub.dev/packages/google_fonts) - A Flutter package to use fonts from fonts.google.com. 19 | - [auto_size_text](https://pub.dev/packages/auto_size_text) - Flutter widget that automatically resizes text to fit perfectly within its bounds. 20 | - [flutter_native_splash](https://pub.dev/packages/flutter_native_splash) - Generates iOS, Android, and Web-native code for customizing the native splash screen background color and splash image. 21 | - [flutter_launcher_icons](https://pub.dev/packages/flutter_launcher_icons) - Fully flexible toolset for updating your Flutter app's launcher icons (Android and Ios). 22 | - [rename](https://pub.dev/packages/rename) - Change your flutter project's AppName and BundleId (IOS, Android, macOS and Web). 23 | - [change_app_package_name](https://pub.dev/packages/change_app_package_name) - Complementary to **rename** package, for changing app package name in Android and renaming correctly directories (which **rename** doesn't do). 24 | 25 | ## Project Config roadmap (Just Informative. Don't repeat these steps.) 26 | 27 | All the necessary config and dependencies have already been set and ready for use but there is an explanation of each step if you want to know more about the pre-config or customize it. 28 | 29 | Initialize the Flutter project, add all the necessary dependencies mentioned above in the **pubspec.yaml** configuration file and run `pub get`. 30 | 31 | **pubspec.yaml** 32 | ```yaml 33 | dependencies: 34 | flutter: 35 | sdk: flutter 36 | cupertino_icons: ^1.0.5 37 | 38 | #Text 39 | google_fonts: ^3.0.1 40 | auto_size_text: ^3.0.0 41 | 42 | #Responsive 43 | sizer: ^2.0.15 44 | 45 | #Image 46 | flutter_svg: ^1.1.6 47 | 48 | #Design 49 | sensors_plus: ^1.4.0 50 | 51 | #JsonAnnotation 52 | json_annotation: ^4.7.0 53 | 54 | #Equality Operator 55 | equatable: ^2.0.5 56 | 57 | #Network 58 | vexana: ^3.0.1 59 | url_launcher: ^6.1.6 60 | connectivity_plus: ^2.3.5 61 | 62 | #Locale Storage 63 | flutter_secure_storage: ^6.0.0 64 | 65 | #Navigation 66 | go_router: ^5.1.1 67 | 68 | #Localization 69 | intl: ^0.17.0 70 | easy_localization: ^3.0.1 71 | bot_toast: ^4.0.3 72 | 73 | #State Management 74 | provider: ^6.0.4 75 | flutter_riverpod: ^2.1.3 76 | flutter_bloc: ^8.1.1 77 | 78 | #Native Splash Screen 79 | flutter_native_splash: ^2.2.13 80 | 81 | dev_dependencies: 82 | flutter_test: 83 | sdk: flutter 84 | flutter_lints: ^2.0.1 85 | 86 | # Code generation 87 | build_runner: ^2.2.0 88 | 89 | # Json serialization code generation 90 | json_serializable: ^6.3.1 91 | 92 | # Native Launcher Icons generator 93 | flutter_launcher_icons: ^0.10.0 94 | 95 | # Change app package name/bundle id and app name 96 | change_app_package_name: ^1.1.0 97 | rename: ^2.0.1 98 | ``` 99 | 100 | Change the app name to your own one. 101 | ```bash 102 | flutter pub run rename --appname "YourAppName" 103 | ``` 104 | 105 | Change the package name/bundle id to your own one. 106 | ```bash 107 | flutter pub run change_app_package_name:main com.company.name && 108 | flutter pub run rename --bundleId com.company.name 109 | ``` 110 | 111 | Add **flutter_native_splash.yaml** config file to the project root directory. 112 | _(See the concerned for more information)_ 113 | ```yaml 114 | flutter_native_splash: 115 | # ... 116 | color: "#ffffff" 117 | background_image: "assets/background.png" 118 | image: assets/splash.png 119 | # ... 120 | ``` 121 | 122 | Generate the splash screens after you have added your own configuration. 123 | ```bash 124 | flutter pub run flutter_native_splash:create 125 | ``` 126 | 127 | Add **flutter_launchers_icons.yaml** config file to the project root directory. 128 | _(See the concerned for more information)_ 129 | ```yaml 130 | flutter_icons: 131 | android: "launcher_icon" 132 | ios: true 133 | image_path: "assets/icons/launcher_icon.png" 134 | # Icons with alpha channel are not allowed in the Apple App Store. 135 | remove_alpha_ios: true 136 | # ... 137 | ``` 138 | 139 | Generate the launcher icons after you have added your own configuration. 140 | ```bash 141 | flutter pub run flutter_launcher_icons:main 142 | ``` 143 | 144 | 145 | The android minSdKVersion is set to **Android API level 21** to comply to modern libraries requirements support. Eg. flutter_secure_storage (requires Android API level 18). 146 | 147 | **android/app/build.gradle** 148 | ```groovy 149 | android { 150 | //... 151 | defaultConfig { 152 | //... 153 | minSdkVersion 21 154 | targetSdkVersion flutter.targetSdkVersion 155 | versionCode flutterVersionCode.toInteger() 156 | versionName flutterVersionName 157 | } 158 | //... 159 | } 160 | ``` 161 | 162 | ## Scripts 163 | 164 | Change package name/bundle id 165 | ```bash 166 | flutter pub run change_app_package_name:main com.new.package.name && flutter pub run rename --bundleId com.new.package.name 167 | ``` 168 | 169 | Change App Name 170 | ```bash 171 | flutter pub run rename --appname "NewAppName" 172 | ``` 173 | 174 | Run build_runner to generate/regenerate code from code generating packages (easy_localization, json_serializable, etc.) 175 | ```bash 176 | flutter pub run build_runner build 177 | ``` 178 | Generate while overriding old outputs 179 | ```bash 180 | flutter packages pub run build_runner build --delete-conflicting-outputs 181 | ``` 182 | Watch and regenerate after each change 183 | ```bash 184 | flutter pub run build_runner watch 185 | ``` 186 | 187 | Generate easy_localization translation string keys for usage in code 188 | ```bash 189 | flutter pub run easy_localization:generate -O lib/core/ -f keys -o locale_keys.g.dart --source-dir assets/translations 190 | ``` 191 | 192 | Generate native launcher icons from config. 193 | ```bash 194 | flutter pub run flutter_launcher_icons:main 195 | ``` 196 | 197 | Generate native splash screens from config 198 | ```bash 199 | flutter pub run flutter_native_splash:create 200 | ``` 201 | 202 | ## Project directory structure 203 | 204 | Main folders structure 205 | 206 | ``` 207 | 📂 assets 208 | 📂 icons 209 | 📂 images 210 | 📂 translations 211 | 📄 en.json 212 | ...📄 {locale}.json 213 | 214 | 📂 lib 215 | 📂 src 216 | 📂 core 217 | 📂 base 218 | 📂 bloc 219 | 📂 auth 220 | 📄 {auth_bloc}.dart 221 | 📄 {auth_event}.dart 222 | 📄 {auth_state}.dart 223 | 📄 app_bloc_observer.dart 224 | 📂 functions 225 | 📄 base_functions.dart 226 | 📂 models 227 | 📄 auth_response_model.dart 228 | 📄 auth_response_model.g.dart 229 | 📂 services 230 | 📂 auth 231 | 📄 auth_service.dart 232 | 📂 singleton 233 | 📄 base_singleton.dart 234 | 📂 components 235 | 📂 animations 236 | 📂 animatedLists 237 | 📄 animated_grid_view.dart 238 | 📄 animated_horizontal_list_view.dart 239 | 📄 animated_list_view.dart 240 | 📄 animated_scroll_view_item.dart 241 | 📂 animationUtils 242 | 📄 animate_in_effect.dart 243 | 📄 animated_scale.dart 244 | 📄 animated_text_wrapper.dart 245 | 📄 animated_text.dart 246 | 📄 auto_fade.dart 247 | 📄 fade_in_effect.dart 248 | 📄 gyroscope_effect_stream_builder.dart 249 | 📄 list_item_wrapper_widget.dart 250 | 📄 mouse_region_effect.dart 251 | 📂 provider 252 | 📂 appbar 253 | 📄 custom_app_bar.dart 254 | 📂 button 255 | 📄 button_widget.dart 256 | 📂 noNetwork 257 | 📄 no_network_widget.dart 258 | 📂 popup 259 | 📄 main_popup.dart 260 | 📂 scaffold 261 | 📄 custom_scaffold.dart 262 | 📂 text 263 | 📄 custom_text.dart 264 | 📂 textFormField 265 | 📄 text_form_field_widget.dart 266 | 📄 validate_operations.dart 267 | 📂 constants 268 | 📂 app 269 | 📄 app_constants.dart 270 | 📄 color_constants.dart 271 | 📂 enums 272 | 📄 icon_enums.dart 273 | 📄 network_enums.dart 274 | 📄 network_results_enums.dart 275 | 📄 route_enums.dart 276 | 📂 extensions 277 | 📄 context_extensions.dart 278 | 📄 iterable_extensions.dart 279 | 📄 logging_extension.dart 280 | 📄 network_extensions.dart 281 | 📄 num_extensions.dart 282 | 📄 string_extensions.dart 283 | 📂 init 284 | 📂 language 285 | 📂 local_storage 286 | 📄 local_storage_manager.dart 287 | 📂 main_build 288 | 📄 main_build.dart 289 | 📂 network 290 | 📄 network_change_manager.dart 291 | 📄 no_network_widget.dart 292 | 📄 vexana_manager.dart 293 | 📂 routes 294 | 📄 routes.dart 295 | 📂 theme 296 | 📄 app_theme.dart 297 | 📂 utils 298 | 📄 typedefs.dart 299 | 📄 dependency_injector.dart 300 | 📂 mixins 301 | 📄 launch_mixin.dart 302 | 📄 safe_context_mixin.dart 303 | 📄 state_mixin.dart 304 | 📄 locale_keys.g.dart 305 | 📂 view 306 | 📂 auth 307 | 📂 login 308 | 📄 login_view.dart 309 | 📂 register 310 | 📄 register_view.dart 311 | 📂 home 312 | 📂 bloc 313 | 📄 {home_bloc}.dart 314 | 📄 {home_event}.dart 315 | 📄 {home_state}.dart 316 | 📂 model 317 | 📄 home_model.dart 318 | 📄 home_model.g.dart 319 | 📂 service 320 | 📄 home_service.dart 321 | 📂 widgets 322 | 📄 home_card.dart 323 | 📄 home_view.dart 324 | 📄 main.dart 325 | 📂 scripts 326 | 📄 build.sh 327 | 328 | 📂 test 329 | 📂 auth 330 | 📄 auth_service_test.dart 331 | 332 | 📄 flutter_launcher_icons.yaml 333 | 334 | 📄 flutter_native_splash.yaml 335 | 336 | 📄 pubspec.yaml 337 | 338 | 📄 README.md 339 | 340 | ``` 341 | 342 | ## Project tech stack useful resources 343 | 344 | ### Flutter 345 | - [Flutter](https://flutter.dev) - Flutter framework official website. 346 | - [Flutter Docs](https://docs.flutter.dev) - Flutter official documentation. 347 | 348 | ### Dart 349 | - [Dart](https://dart.dev) - Dart language official website. 350 | - [Dart Docs](https://dart.dev/guides) - Dart official documentation. 351 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 33 30 | ndkVersion flutter.ndkVersion 31 | 32 | compileOptions { 33 | sourceCompatibility JavaVersion.VERSION_1_8 34 | targetCompatibility JavaVersion.VERSION_1_8 35 | } 36 | 37 | kotlinOptions { 38 | jvmTarget = '1.8' 39 | } 40 | 41 | sourceSets { 42 | main.java.srcDirs += 'src/main/kotlin' 43 | } 44 | 45 | defaultConfig { 46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 47 | applicationId "com.ouedyan.fluttermobiletemplate" 48 | // You can update the following values to match your application needs. 49 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. 50 | minSdkVersion 21 51 | targetSdkVersion flutter.targetSdkVersion 52 | versionCode flutterVersionCode.toInteger() 53 | versionName flutterVersionName 54 | } 55 | 56 | buildTypes { 57 | release { 58 | // TODO: Add your own signing config for the release build. 59 | // Signing with the debug keys for now, so `flutter run --release` works. 60 | signingConfig signingConfigs.debug 61 | } 62 | } 63 | } 64 | 65 | flutter { 66 | source '../..' 67 | } 68 | 69 | dependencies { 70 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 71 | } 72 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/ouedyan/fluttermobiletemplate/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.ouedyan.fluttermobiletemplate 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.6.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.1.2' 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 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /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.4-all.zip 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /assets/icons/svg_menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/translations/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "appName" : "Flutter App Template" 3 | } 4 | -------------------------------------------------------------------------------- /flutter_launcher_icons.yaml: -------------------------------------------------------------------------------- 1 | flutter_icons: 2 | android: "launcher_icon" 3 | ios: true 4 | # TODO: Change this to the correct path 5 | image_path: "assets/icons/launcher_icon.png" 6 | # Icons with alpha channel are not allowed in the Apple App Store. 7 | remove_alpha_ios: true 8 | 9 | # See https://pub.dev/packages/flutter_launcher_icons#mag-attributes for more information. 10 | 11 | 12 | -------------------------------------------------------------------------------- /flutter_native_splash.yaml: -------------------------------------------------------------------------------- 1 | flutter_native_splash: 2 | 3 | # This package generates native code to customize Flutter's default white native splash screen 4 | # with background color and splash image. 5 | # Customize the parameters below, and run the following command in the terminal: 6 | # flutter pub run flutter_native_splash:create 7 | # To restore Flutter's default white splash screen, run the following command in the terminal: 8 | # flutter pub run flutter_native_splash:remove 9 | 10 | # color or background_image is the only required parameter. Use color to set the background 11 | # of your splash screen to a solid color. Use background_image to set the background of your 12 | # splash screen to a png image. This is useful for gradients. The image will be stretch to the 13 | # size of the app. Only one parameter can be used, color and background_image cannot both be set. 14 | color: "#ffffff" 15 | #background_image: "assets/background.png" 16 | 17 | # Optional parameters are listed below. To enable a parameter, uncomment the line by removing 18 | # the leading # character. 19 | 20 | # The image parameter allows you to specify an image used in the splash screen. It must be a 21 | # png file and should be sized for 4x pixel density. 22 | # TODO: Change this to the splash image 23 | image: assets/splash.png 24 | 25 | # The branding property allows you to specify an image used as branding in the splash screen. 26 | # It must be a png file. Currently, it is only supported for Android < v12 and iOS. 27 | #branding: assets/dart.png 28 | 29 | # To position the branding image at the bottom of the screen you can use bottom, bottomRight, 30 | # and bottomLeft. The default values is bottom if not specified or specified something else. 31 | #branding_mode: bottom 32 | 33 | # The color_dark, background_image_dark, image_dark, branding_dark are parameters that set the background 34 | # and image when the device is in dark mode. If they are not specified, the app will use the 35 | # parameters from above. If the image_dark parameter is specified, color_dark or 36 | # background_image_dark must be specified. color_dark and background_image_dark cannot both be 37 | # set. 38 | #color_dark: "#042a49" 39 | #background_image_dark: "assets/dark-background.png" 40 | #image_dark: assets/splash-invert.png 41 | #branding_dark: assets/dart_dark.png 42 | 43 | # Android 12 handles the splash screen differently than previous versions. Please visit 44 | # https://developer.android.com/guide/topics/ui/splash-screen 45 | # Following are Android 12 specific parameter. 46 | android_12: 47 | # The image parameter sets the splash screen icon image. If this parameter is not specified, 48 | # the app's launcher icon will be used instead. 49 | # Please note that the splash screen will be clipped to a circle on the center of the screen. 50 | # App icon with an icon background: This should be 960×960 pixels, and fit within a circle 51 | # 640 pixels in diameter. 52 | # App icon without an icon background: This should be 1152×1152 pixels, and fit within a circle 53 | # 768 pixels in diameter. 54 | #image: assets/android12splash.png 55 | 56 | # Splash screen background color. 57 | #color: "#42a5f5" 58 | 59 | # App icon background color. 60 | #icon_background_color: "#111111" 61 | 62 | # The image_dark parameter and icon_background_color_dark set the image and icon background 63 | # color when the device is in dark mode. If they are not specified, the app will use the 64 | # parameters from above. 65 | #image_dark: assets/android12splash-invert.png 66 | #color_dark: "#042a49" 67 | #icon_background_color_dark: "#eeeeee" 68 | 69 | # The android, ios and web parameters can be used to disable generating a splash screen on a given 70 | # platform. 71 | #android: false 72 | #ios: false 73 | #web: false 74 | 75 | # The position of the splash image can be set with android_gravity, ios_content_mode, and 76 | # web_image_mode parameters. All default to center. 77 | # 78 | # android_gravity can be one of the following Android Gravity (see 79 | # https://developer.android.com/reference/android/view/Gravity): bottom, center, 80 | # center_horizontal, center_vertical, clip_horizontal, clip_vertical, end, fill, fill_horizontal, 81 | # fill_vertical, left, right, start, or top. 82 | #android_gravity: center 83 | # 84 | # ios_content_mode can be one of the following iOS UIView.ContentMode (see 85 | # https://developer.apple.com/documentation/uikit/uiview/contentmode): scaleToFill, 86 | # scaleAspectFit, scaleAspectFill, center, top, bottom, left, right, topLeft, topRight, 87 | # bottomLeft, or bottomRight. 88 | #ios_content_mode: center 89 | # 90 | # web_image_mode can be one of the following modes: center, contain, stretch, and cover. 91 | #web_image_mode: center 92 | 93 | # The screen orientation can be set in Android with the android_screen_orientation parameter. 94 | # Valid parameters can be found here: 95 | # https://developer.android.com/guide/topics/manifest/activity-element#screen 96 | #android_screen_orientation: sensorLandscape 97 | 98 | # To hide the notification bar, use the fullscreen parameter. Has no effect in web since web 99 | # has no notification bar. Defaults to false. 100 | # NOTE: Unlike Android, iOS will not automatically show the notification bar when the app loads. 101 | # To show the notification bar, add the following code to your Flutter app: 102 | # WidgetsFlutterBinding.ensureInitialized(); 103 | # SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom, SystemUiOverlay.top]); 104 | #fullscreen: true 105 | 106 | # If you have changed the name(s) of your info.plist file(s), you can specify the filename(s) 107 | # with the info_plist_files parameter. Remove only the # characters in the three lines below, 108 | # do not remove any spaces: 109 | #info_plist_files: 110 | # - 'ios/Runner/Info-Debug.plist' 111 | # - 'ios/Runner/Info-Release.plist' 112 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1300; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = ""; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = ""; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | DEVELOPMENT_TEAM = 3W47XHSMWC; 292 | ENABLE_BITCODE = NO; 293 | INFOPLIST_FILE = Runner/Info.plist; 294 | LD_RUNPATH_SEARCH_PATHS = ( 295 | "$(inherited)", 296 | "@executable_path/Frameworks", 297 | ); 298 | PRODUCT_BUNDLE_IDENTIFIER = com.ouedyan.fluttermobiletemplate; 299 | PRODUCT_NAME = "$(TARGET_NAME)"; 300 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 301 | SWIFT_VERSION = 5.0; 302 | VERSIONING_SYSTEM = "apple-generic"; 303 | }; 304 | name = Profile; 305 | }; 306 | 97C147031CF9000F007C117D /* Debug */ = { 307 | isa = XCBuildConfiguration; 308 | buildSettings = { 309 | ALWAYS_SEARCH_USER_PATHS = NO; 310 | CLANG_ANALYZER_NONNULL = YES; 311 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 312 | CLANG_CXX_LIBRARY = "libc++"; 313 | CLANG_ENABLE_MODULES = YES; 314 | CLANG_ENABLE_OBJC_ARC = YES; 315 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 316 | CLANG_WARN_BOOL_CONVERSION = YES; 317 | CLANG_WARN_COMMA = YES; 318 | CLANG_WARN_CONSTANT_CONVERSION = YES; 319 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 320 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 321 | CLANG_WARN_EMPTY_BODY = YES; 322 | CLANG_WARN_ENUM_CONVERSION = YES; 323 | CLANG_WARN_INFINITE_RECURSION = YES; 324 | CLANG_WARN_INT_CONVERSION = YES; 325 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 326 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 327 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 328 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 329 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 330 | CLANG_WARN_STRICT_PROTOTYPES = YES; 331 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 332 | CLANG_WARN_UNREACHABLE_CODE = YES; 333 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 334 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 335 | COPY_PHASE_STRIP = NO; 336 | DEBUG_INFORMATION_FORMAT = dwarf; 337 | ENABLE_STRICT_OBJC_MSGSEND = YES; 338 | ENABLE_TESTABILITY = YES; 339 | GCC_C_LANGUAGE_STANDARD = gnu99; 340 | GCC_DYNAMIC_NO_PIC = NO; 341 | GCC_NO_COMMON_BLOCKS = YES; 342 | GCC_OPTIMIZATION_LEVEL = 0; 343 | GCC_PREPROCESSOR_DEFINITIONS = ( 344 | "DEBUG=1", 345 | "$(inherited)", 346 | ); 347 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 348 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 349 | GCC_WARN_UNDECLARED_SELECTOR = YES; 350 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 351 | GCC_WARN_UNUSED_FUNCTION = YES; 352 | GCC_WARN_UNUSED_VARIABLE = YES; 353 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 354 | MTL_ENABLE_DEBUG_INFO = YES; 355 | ONLY_ACTIVE_ARCH = YES; 356 | SDKROOT = iphoneos; 357 | TARGETED_DEVICE_FAMILY = "1,2"; 358 | }; 359 | name = Debug; 360 | }; 361 | 97C147041CF9000F007C117D /* Release */ = { 362 | isa = XCBuildConfiguration; 363 | buildSettings = { 364 | ALWAYS_SEARCH_USER_PATHS = NO; 365 | CLANG_ANALYZER_NONNULL = YES; 366 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 367 | CLANG_CXX_LIBRARY = "libc++"; 368 | CLANG_ENABLE_MODULES = YES; 369 | CLANG_ENABLE_OBJC_ARC = YES; 370 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 371 | CLANG_WARN_BOOL_CONVERSION = YES; 372 | CLANG_WARN_COMMA = YES; 373 | CLANG_WARN_CONSTANT_CONVERSION = YES; 374 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 375 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 376 | CLANG_WARN_EMPTY_BODY = YES; 377 | CLANG_WARN_ENUM_CONVERSION = YES; 378 | CLANG_WARN_INFINITE_RECURSION = YES; 379 | CLANG_WARN_INT_CONVERSION = YES; 380 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 381 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 382 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 383 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 384 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 385 | CLANG_WARN_STRICT_PROTOTYPES = YES; 386 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 387 | CLANG_WARN_UNREACHABLE_CODE = YES; 388 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 389 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 390 | COPY_PHASE_STRIP = NO; 391 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 392 | ENABLE_NS_ASSERTIONS = NO; 393 | ENABLE_STRICT_OBJC_MSGSEND = YES; 394 | GCC_C_LANGUAGE_STANDARD = gnu99; 395 | GCC_NO_COMMON_BLOCKS = YES; 396 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 397 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 398 | GCC_WARN_UNDECLARED_SELECTOR = YES; 399 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 400 | GCC_WARN_UNUSED_FUNCTION = YES; 401 | GCC_WARN_UNUSED_VARIABLE = YES; 402 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 403 | MTL_ENABLE_DEBUG_INFO = NO; 404 | SDKROOT = iphoneos; 405 | SUPPORTED_PLATFORMS = iphoneos; 406 | SWIFT_COMPILATION_MODE = wholemodule; 407 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 408 | TARGETED_DEVICE_FAMILY = "1,2"; 409 | VALIDATE_PRODUCT = YES; 410 | }; 411 | name = Release; 412 | }; 413 | 97C147061CF9000F007C117D /* Debug */ = { 414 | isa = XCBuildConfiguration; 415 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 416 | buildSettings = { 417 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 418 | CLANG_ENABLE_MODULES = YES; 419 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 420 | DEVELOPMENT_TEAM = 3W47XHSMWC; 421 | ENABLE_BITCODE = NO; 422 | INFOPLIST_FILE = Runner/Info.plist; 423 | LD_RUNPATH_SEARCH_PATHS = ( 424 | "$(inherited)", 425 | "@executable_path/Frameworks", 426 | ); 427 | PRODUCT_BUNDLE_IDENTIFIER = com.ouedyan.fluttermobiletemplate; 428 | PRODUCT_NAME = "$(TARGET_NAME)"; 429 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 430 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 431 | SWIFT_VERSION = 5.0; 432 | VERSIONING_SYSTEM = "apple-generic"; 433 | }; 434 | name = Debug; 435 | }; 436 | 97C147071CF9000F007C117D /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 439 | buildSettings = { 440 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 441 | CLANG_ENABLE_MODULES = YES; 442 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 443 | DEVELOPMENT_TEAM = 3W47XHSMWC; 444 | ENABLE_BITCODE = NO; 445 | INFOPLIST_FILE = Runner/Info.plist; 446 | LD_RUNPATH_SEARCH_PATHS = ( 447 | "$(inherited)", 448 | "@executable_path/Frameworks", 449 | ); 450 | PRODUCT_BUNDLE_IDENTIFIER = com.ouedyan.fluttermobiletemplate; 451 | PRODUCT_NAME = "$(TARGET_NAME)"; 452 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 453 | SWIFT_VERSION = 5.0; 454 | VERSIONING_SYSTEM = "apple-generic"; 455 | }; 456 | name = Release; 457 | }; 458 | /* End XCBuildConfiguration section */ 459 | 460 | /* Begin XCConfigurationList section */ 461 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 462 | isa = XCConfigurationList; 463 | buildConfigurations = ( 464 | 97C147031CF9000F007C117D /* Debug */, 465 | 97C147041CF9000F007C117D /* Release */, 466 | 249021D3217E4FDB00AE95B9 /* Profile */, 467 | ); 468 | defaultConfigurationIsVisible = 0; 469 | defaultConfigurationName = Release; 470 | }; 471 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 472 | isa = XCConfigurationList; 473 | buildConfigurations = ( 474 | 97C147061CF9000F007C117D /* Debug */, 475 | 97C147071CF9000F007C117D /* Release */, 476 | 249021D4217E4FDB00AE95B9 /* Profile */, 477 | ); 478 | defaultConfigurationIsVisible = 0; 479 | defaultConfigurationName = Release; 480 | }; 481 | /* End XCConfigurationList section */ 482 | }; 483 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 484 | } 485 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.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/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/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/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /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. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.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 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /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 | CFBundleDisplayName 8 | Flutter Mobile Template 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | flutter_mobile_template 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:bot_toast/bot_toast.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:easy_localization/easy_localization.dart'; 6 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 7 | import 'package:intl/date_symbol_data_local.dart'; 8 | import 'package:sizer/sizer.dart'; 9 | 10 | import 'src/core/base/bloc/app_bloc_observer.dart'; 11 | import 'src/core/base/singleton/base_singleton.dart'; 12 | import 'src/core/init/dependency_injector.dart'; 13 | import 'src/core/init/main_build/main_build.dart'; 14 | 15 | Future main() async { 16 | await _init(); 17 | Bloc.observer = AppBlocObserver.instance; 18 | runZoned( 19 | () => runApp( 20 | MultiRepositoryProvider( 21 | providers: DependencyInjector.instance.repositoryProviders, 22 | child: MultiBlocProvider( 23 | providers: DependencyInjector.instance.globalBlocProviders, 24 | child: const ProviderScope( 25 | child: MyApp(), 26 | ), 27 | ), 28 | ), 29 | ), 30 | ); 31 | } 32 | 33 | Future _init() async { 34 | WidgetsFlutterBinding.ensureInitialized(); 35 | initializeDateFormatting('tr'); 36 | await EasyLocalization.ensureInitialized(); 37 | } 38 | 39 | class MyApp extends StatelessWidget with BaseSingleton { 40 | const MyApp({Key? key}) : super(key: key); 41 | 42 | @override 43 | Widget build(BuildContext context) { 44 | initializeDateFormatting('tr'); 45 | return Sizer( 46 | builder: (context, orientation, deviceType) { 47 | final botToastBuilder = BotToastInit(); 48 | return MaterialApp.router( 49 | debugShowCheckedModeBanner: false, 50 | title: constants.appName, 51 | routerConfig: routes.routes, 52 | builder: (context, child) => botToastBuilder( 53 | context, 54 | MainBuild(child: child), 55 | ), 56 | theme: theme.appTheme, 57 | ); 58 | }, 59 | ); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/src/core/base/bloc/app_bloc_observer.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer' as developer; 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | 4 | class AppBlocObserver extends BlocObserver { 5 | static AppBlocObserver? _instance; 6 | static AppBlocObserver get instance { 7 | _instance ??= AppBlocObserver._init(); 8 | return _instance!; 9 | } 10 | 11 | AppBlocObserver._init(); 12 | 13 | @override 14 | void onEvent(Bloc bloc, Object? event) { 15 | super.onEvent(bloc, event); 16 | developer.log(event.toString()); 17 | } 18 | 19 | @override 20 | void onError(BlocBase bloc, Object error, StackTrace stackTrace) { 21 | developer.log(error.toString()); 22 | super.onError(bloc, error, stackTrace); 23 | } 24 | 25 | @override 26 | void onChange(BlocBase bloc, Change change) { 27 | super.onChange(bloc, change); 28 | developer.log(change.toString()); 29 | } 30 | 31 | @override 32 | void onTransition( 33 | Bloc bloc, 34 | Transition transition, 35 | ) { 36 | super.onTransition(bloc, transition); 37 | developer.log(transition.toString()); 38 | developer.log(transition.event); 39 | developer.log(transition.currentState); 40 | developer.log(transition.nextState); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/src/core/base/bloc/auth/auth_bloc.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart' show immutable; 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | import 'package:equatable/equatable.dart'; 4 | 5 | import '../../services/auth/auth_service.dart'; 6 | 7 | part 'auth_event.dart'; 8 | part 'auth_state.dart'; 9 | 10 | class AuthBloc extends Bloc { 11 | final IAuthService authService; 12 | AuthBloc(this.authService) : super(AuthInitial()) { 13 | on((event, emit) {}); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/src/core/base/bloc/auth/auth_event.dart: -------------------------------------------------------------------------------- 1 | part of 'auth_bloc.dart'; 2 | 3 | abstract class AuthEvent extends Equatable { 4 | const AuthEvent(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/src/core/base/bloc/auth/auth_state.dart: -------------------------------------------------------------------------------- 1 | part of 'auth_bloc.dart'; 2 | 3 | @immutable 4 | abstract class AuthState extends Equatable { 5 | const AuthState(); 6 | 7 | @override 8 | List get props => []; 9 | } 10 | 11 | class AuthInitial extends AuthState {} 12 | -------------------------------------------------------------------------------- /lib/src/core/base/functions/base_functions.dart: -------------------------------------------------------------------------------- 1 | import 'dart:core'; 2 | import 'dart:io'; 3 | 4 | import 'package:flutter/cupertino.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_mobile_template/src/core/init/utils/typedefs.dart'; 7 | import 'package:go_router/go_router.dart'; 8 | import 'package:intl/intl.dart'; 9 | import '../../components/text/custom_text.dart'; 10 | 11 | class BaseFunctions { 12 | static BaseFunctions? _instance; 13 | static BaseFunctions get instance { 14 | _instance ??= BaseFunctions._init(); 15 | return _instance!; 16 | } 17 | 18 | BaseFunctions._init(); 19 | 20 | Widget platformIndicator() { 21 | return Center( 22 | child: Platform.isIOS 23 | ? const CupertinoActivityIndicator() 24 | : const CircularProgressIndicator(), 25 | ); 26 | } 27 | 28 | IconButton platformBackButton({ 29 | required VoidCallback onPressed, 30 | Color? color = Colors.black, 31 | }) { 32 | return Platform.isIOS 33 | ? IconButton( 34 | onPressed: onPressed, 35 | icon: Icon( 36 | Icons.arrow_back_ios, 37 | color: color, 38 | ), 39 | ) 40 | : IconButton( 41 | onPressed: onPressed, 42 | icon: Icon( 43 | Icons.arrow_back, 44 | color: color, 45 | ), 46 | ); 47 | } 48 | 49 | Icon platformForwardIcon() { 50 | return Platform.isIOS 51 | ? const Icon(Icons.arrow_forward_ios) 52 | : const Icon(Icons.arrow_forward); 53 | } 54 | 55 | /// It is especially useful in [BLoC] structure. 56 | Widget errorText(String errorMessage) { 57 | return Center(child: CustomText(errorMessage)); 58 | } 59 | 60 | bool isLink(String str) => str.contains(RegExp( 61 | r'^(https?:\/\/)?([\w\d_-]+)\.([\w\d_\.-]+)\/?\??([^#\n\r]*)?#?([^\n\r]*)')); 62 | 63 | animatedRouting({ 64 | required GoRouterState state, 65 | required Widget route, 66 | }) => 67 | CustomTransitionPage( 68 | key: state.pageKey, 69 | child: route, 70 | transitionsBuilder: (BuildContext context, Animation animation, 71 | Animation secondaryAnimation, Widget child) => 72 | SlideTransition( 73 | position: animation.drive( 74 | Tween( 75 | begin: const Offset(1, 0), 76 | end: Offset.zero, 77 | ).chain(CurveTween(curve: Curves.fastOutSlowIn)), 78 | ), 79 | child: child, 80 | ), 81 | ); 82 | 83 | closePopup(BuildContext context) { 84 | Navigator.of(context, rootNavigator: true).pop(); 85 | } 86 | 87 | String toShortString(String value, {int countCharacter = 8}) { 88 | return value.length > countCharacter 89 | ? "${value.substring(0, countCharacter)}..." 90 | : value; 91 | } 92 | 93 | String toShortDoubleNumber(double value) { 94 | String number = value.toString(); 95 | return "${number.split(".").first}.${number.split(".")[1].substring(0, 2)}"; 96 | } 97 | 98 | String convertStringDateYmm(String date) { 99 | return DateFormat.yMMMEd('tr_TR').format(DateTime.parse(date)); 100 | } 101 | 102 | String convertStringDateTime(String date) { 103 | return DateFormat('dd/MM/yyyy hh:mm ').format(DateTime.parse(date)); 104 | } 105 | 106 | String convertStringDateYmmm(String date) { 107 | return DateFormat.yMMMMEEEEd('tr_TR').format(DateTime.parse(date)); 108 | } 109 | 110 | String convertStringDateYMMd(String date) { 111 | return DateFormat.yMMMd('tr_TR').format(DateTime.parse(date)); 112 | } 113 | 114 | String convertStringDate4(String date) { 115 | return DateFormat.Hm('tr_TR').format(DateTime.parse(date)); 116 | } 117 | 118 | String printMap(JsonMap map) { 119 | String str = ''; 120 | map.forEach((key, value) => str += '$key: ${value.toString}, '); 121 | return str; 122 | } 123 | 124 | String capitalize(String value) { 125 | return '${value[0].toUpperCase()}${value.substring(1).toLowerCase()}'; 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /lib/src/core/base/models/auth_response_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_mobile_template/src/core/init/utils/typedefs.dart'; 2 | import 'package:json_annotation/json_annotation.dart'; 3 | import 'package:vexana/vexana.dart'; 4 | 5 | part 'auth_response_model.g.dart'; 6 | 7 | @JsonSerializable() 8 | class AuthResponseModel extends INetworkModel { 9 | bool? success; 10 | String? message; 11 | String? token; 12 | 13 | AuthResponseModel({ 14 | this.success, 15 | this.message, 16 | this.token, 17 | }); 18 | 19 | @override 20 | fromJson(JsonMap json) { 21 | return _$AuthResponseModelFromJson(json); 22 | } 23 | 24 | @override 25 | JsonMap toJson() { 26 | return _$AuthResponseModelToJson(this); 27 | } 28 | 29 | factory AuthResponseModel.fromJson(JsonMap json) => 30 | _$AuthResponseModelFromJson(json); 31 | } 32 | -------------------------------------------------------------------------------- /lib/src/core/base/models/auth_response_model.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'auth_response_model.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | AuthResponseModel _$AuthResponseModelFromJson(Map json) => 10 | AuthResponseModel( 11 | success: json['success'] as bool?, 12 | message: json['message'] as String?, 13 | token: json['token'] as String?, 14 | ); 15 | 16 | Map _$AuthResponseModelToJson(AuthResponseModel instance) => 17 | { 18 | 'success': instance.success, 19 | 'message': instance.message, 20 | 'token': instance.token, 21 | }; 22 | -------------------------------------------------------------------------------- /lib/src/core/base/services/auth/auth_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:vexana/vexana.dart'; 2 | 3 | import '../../models/auth_response_model.dart'; 4 | 5 | abstract class IAuthService { 6 | final INetworkManager networkManager; 7 | IAuthService(this.networkManager); 8 | 9 | /// [login] and [register] here are written as an example. 10 | /// Please update here according to your project's requirements. 11 | 12 | Future login(String email, String password); 13 | Future register({ 14 | required String name, 15 | required String surname, 16 | required String email, 17 | required String password, 18 | }); 19 | } 20 | 21 | class AuthService extends IAuthService { 22 | AuthService(super.networkManager); 23 | 24 | @override 25 | Future login(String email, String password) { 26 | throw UnimplementedError(); 27 | } 28 | 29 | @override 30 | Future register( 31 | {required String name, 32 | required String surname, 33 | required String email, 34 | required String password}) { 35 | throw UnimplementedError(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/src/core/base/singleton/base_singleton.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | import '../../constants/app/app_constants.dart'; 4 | import '../../constants/app/color_constants.dart'; 5 | import '../../init/dependency_injector.dart'; 6 | import '../../init/network/vexana_manager.dart'; 7 | import '../../init/routes/routes.dart'; 8 | import '../../init/theme/app_theme.dart'; 9 | import '../bloc/app_bloc_observer.dart'; 10 | import '../functions/base_functions.dart'; 11 | 12 | abstract class BaseSingleton { 13 | AppConstants get constants => AppConstants.instance; 14 | ColorConstants get colors => ColorConstants.instance; 15 | Routes get routes => Routes.instance; 16 | DependencyInjector get dependencyInjector => DependencyInjector.instance; 17 | AppTheme get theme => AppTheme.instance; 18 | VexanaManager get vexana => VexanaManager.instance; 19 | BaseFunctions get functions => BaseFunctions.instance; 20 | WidgetsBinding get widgetsBinding => WidgetsBinding.instance; 21 | AppBlocObserver get blocObserver => AppBlocObserver.instance; 22 | } 23 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animatedLists/animated_grid_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'animated_scroll_view_item.dart'; 4 | 5 | class AnimatedGridView extends StatelessWidget { 6 | const AnimatedGridView({ 7 | Key? key, 8 | required this.child, 9 | this.itemCount = 10, 10 | }) : super(key: key); 11 | 12 | final Widget child; 13 | final int? itemCount; 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return GridView.builder( 18 | gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( 19 | crossAxisCount: 4, 20 | mainAxisSpacing: 15, 21 | crossAxisSpacing: 15, 22 | ), 23 | cacheExtent: 0, 24 | itemCount: itemCount, 25 | itemBuilder: (context, index) { 26 | return AnimatedScrollViewItem( 27 | child: child, 28 | ); 29 | }, 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animatedLists/animated_horizontal_list_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:sizer/sizer.dart'; 3 | 4 | import 'animated_scroll_view_item.dart'; 5 | 6 | class AnimatedHorizontalListView extends StatelessWidget { 7 | const AnimatedHorizontalListView({ 8 | Key? key, 9 | required this.child, 10 | this.height = 26, 11 | this.itemCount = 10, 12 | }) : super(key: key); 13 | 14 | final Widget child; 15 | final double? height; 16 | final int? itemCount; 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return SizedBox( 21 | height: height?.h, 22 | child: ListView.builder( 23 | cacheExtent: 0, 24 | scrollDirection: Axis.horizontal, 25 | itemCount: itemCount, 26 | itemBuilder: (context, index) { 27 | return AnimatedScrollViewItem( 28 | child: child, 29 | ); 30 | }, 31 | ), 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animatedLists/animated_list_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'animated_scroll_view_item.dart'; 3 | 4 | class AnimatedListView extends StatefulWidget { 5 | const AnimatedListView({ 6 | Key? key, 7 | this.itemCount = 10, 8 | required this.child, 9 | }) : super(key: key); 10 | 11 | final int? itemCount; 12 | final Widget child; 13 | 14 | @override 15 | State createState() => _AnimatedListViewState(); 16 | } 17 | 18 | class _AnimatedListViewState extends State { 19 | @override 20 | Widget build(BuildContext context) { 21 | return ListView.builder( 22 | cacheExtent: 0, 23 | itemCount: widget.itemCount, 24 | itemBuilder: (context, index) => AnimatedScrollViewItem( 25 | child: widget.child, 26 | ), 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animatedLists/animated_scroll_view_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AnimatedScrollViewItem extends StatefulWidget { 4 | const AnimatedScrollViewItem({ 5 | Key? key, 6 | required this.child, 7 | }) : super(key: key); 8 | 9 | final Widget child; 10 | 11 | @override 12 | State createState() => _AnimatedScrollViewItemState(); 13 | } 14 | 15 | class _AnimatedScrollViewItemState extends State 16 | with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { 17 | late final AnimationController _animationController; 18 | late final Animation _scaleAnimation; 19 | 20 | @override 21 | void initState() { 22 | super.initState(); 23 | _animationController = AnimationController( 24 | vsync: this, 25 | duration: const Duration(milliseconds: 300), 26 | )..forward(); 27 | 28 | _scaleAnimation = Tween(begin: 0.5, end: 1).animate( 29 | CurvedAnimation( 30 | parent: _animationController, 31 | curve: Curves.easeInOut, 32 | ), 33 | ); 34 | } 35 | 36 | @override 37 | void dispose() { 38 | _animationController.dispose(); 39 | super.dispose(); 40 | } 41 | 42 | @override 43 | Widget build(BuildContext context) { 44 | super.build(context); 45 | return ScaleTransition( 46 | scale: _scaleAnimation, 47 | child: widget.child, 48 | ); 49 | } 50 | 51 | @override 52 | bool get wantKeepAlive => false; 53 | } 54 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/animate_in_effect.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AnimateInEffect extends StatefulWidget { 4 | const AnimateInEffect({ 5 | Key? key, 6 | required this.child, 7 | this.intervalStart = .5, 8 | this.keepAlive = true, 9 | }) : super(key: key); 10 | 11 | final Widget child; 12 | final double intervalStart; 13 | final bool keepAlive; 14 | 15 | @override 16 | State createState() => _AnimateInEffectState(); 17 | } 18 | 19 | class _AnimateInEffectState extends State 20 | with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { 21 | late final AnimationController animationController; 22 | late final Animation offsetAnimation; 23 | late final Animation fadeAnimation; 24 | 25 | @override 26 | void initState() { 27 | super.initState(); 28 | animationController = AnimationController( 29 | vsync: this, 30 | duration: const Duration(milliseconds: 600), 31 | ); 32 | 33 | Future.delayed( 34 | const Duration(milliseconds: 300), 35 | () => animationController.forward(), 36 | ); 37 | 38 | Curve intervalCurve = Interval( 39 | widget.intervalStart, 40 | 1, 41 | curve: Curves.easeOut, 42 | ); 43 | 44 | offsetAnimation = Tween( 45 | begin: const Offset(0, 30), 46 | end: Offset.zero, 47 | ).animate( 48 | CurvedAnimation( 49 | parent: animationController, 50 | curve: intervalCurve, 51 | ), 52 | ); 53 | 54 | fadeAnimation = Tween(begin: 0, end: 1).animate( 55 | CurvedAnimation( 56 | parent: animationController, 57 | curve: intervalCurve, 58 | ), 59 | ); 60 | } 61 | 62 | @override 63 | void dispose() { 64 | animationController.dispose(); 65 | super.dispose(); 66 | } 67 | 68 | @override 69 | Widget build(BuildContext context) { 70 | super.build(context); 71 | return AnimatedBuilder( 72 | animation: animationController, 73 | builder: (context, child) => Transform.translate( 74 | offset: offsetAnimation.value, 75 | child: child, 76 | ), 77 | child: FadeTransition( 78 | opacity: fadeAnimation, 79 | child: widget.child, 80 | ), 81 | ); 82 | } 83 | 84 | @override 85 | bool get wantKeepAlive => widget.keepAlive; 86 | } 87 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/animated_scale.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AnimatedScale extends StatelessWidget { 4 | final Widget child; 5 | final double scale; 6 | final Duration duration; 7 | final double beginScale; 8 | final Curve curve; 9 | 10 | const AnimatedScale( 11 | {super.key, 12 | required this.scale, 13 | required this.duration, 14 | required this.beginScale, 15 | required this.curve, 16 | required this.child}); 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return TweenAnimationBuilder( 21 | tween: Tween(begin: beginScale, end: scale), 22 | curve: curve, 23 | duration: duration, 24 | child: child, 25 | builder: (_, value, cachedChild) { 26 | return Transform.scale( 27 | scale: value, 28 | child: cachedChild, 29 | ); 30 | }, 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/animated_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../text/custom_text.dart'; 4 | 5 | class AnimatedText extends StatefulWidget { 6 | const AnimatedText( 7 | this.text, { 8 | super.key, 9 | this.textStyle, 10 | }); 11 | 12 | final String text; 13 | final TextStyle? textStyle; 14 | 15 | @override 16 | State createState() => _AnimatedTextState(); 17 | } 18 | 19 | class _AnimatedTextState extends State 20 | with TickerProviderStateMixin { 21 | late final AnimationController _controller = AnimationController( 22 | duration: const Duration(seconds: 3), 23 | vsync: this, 24 | )..forward(); 25 | late final Animation _animation = CurvedAnimation( 26 | parent: _controller, 27 | curve: Curves.fastOutSlowIn, 28 | ); 29 | 30 | @override 31 | void dispose() { 32 | _controller.dispose(); 33 | super.dispose(); 34 | } 35 | 36 | @override 37 | Widget build(BuildContext context) { 38 | return SizeTransition( 39 | sizeFactor: _animation, 40 | axis: Axis.horizontal, 41 | axisAlignment: -1, 42 | child: CustomText( 43 | widget.text, 44 | textStyle: widget.textStyle, 45 | ), 46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/animated_text_wrapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AnimatedWrapper extends StatefulWidget { 4 | const AnimatedWrapper({ 5 | Key? key, 6 | required this.child, 7 | }) : super(key: key); 8 | 9 | final Widget child; 10 | 11 | @override 12 | State createState() => _AnimatedWrapperState(); 13 | } 14 | 15 | class _AnimatedWrapperState extends State 16 | with SingleTickerProviderStateMixin { 17 | late final AnimationController animationController; 18 | late final Animation offsetAnimation; 19 | 20 | @override 21 | void initState() { 22 | super.initState(); 23 | animationController = AnimationController( 24 | vsync: this, 25 | duration: const Duration(milliseconds: 700), 26 | )..forward(); 27 | 28 | offsetAnimation = Tween( 29 | begin: const Offset(0, -30), 30 | end: Offset.zero, 31 | ).animate( 32 | CurvedAnimation( 33 | parent: animationController, 34 | curve: const Interval(0.3, 1, curve: Curves.easeOutBack), 35 | ), 36 | ); 37 | } 38 | 39 | @override 40 | void dispose() { 41 | animationController.dispose(); 42 | super.dispose(); 43 | } 44 | 45 | @override 46 | Widget build(BuildContext context) { 47 | return AnimatedBuilder( 48 | animation: animationController, 49 | child: widget.child, 50 | builder: (context, child) { 51 | return Transform.translate( 52 | offset: offsetAnimation.value, 53 | child: child, 54 | ); 55 | }, 56 | ); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/auto_fade.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AutoFade extends StatefulWidget { 4 | final Widget child; 5 | final Duration delay; 6 | final Duration duration; 7 | final Offset offset; 8 | final Curve curve; 9 | 10 | const AutoFade( 11 | {super.key, 12 | required this.delay, 13 | required this.duration, 14 | required this.offset, 15 | required this.curve, 16 | required this.child}); 17 | 18 | @override 19 | State createState() => _AutoFadeState(); 20 | } 21 | 22 | class _AutoFadeState extends State 23 | with SingleTickerProviderStateMixin { 24 | late AnimationController animController; 25 | late Animation anim; 26 | 27 | @override 28 | void initState() { 29 | super.initState(); 30 | animController = 31 | AnimationController(vsync: this, duration: widget.duration); 32 | animController.addListener(() => setState(() {})); 33 | anim = animController.drive(CurveTween(curve: widget.curve)); 34 | Future.delayed(widget.delay, animController.forward); 35 | } 36 | 37 | @override 38 | void dispose() { 39 | animController.dispose(); 40 | super.dispose(); 41 | } 42 | 43 | @override 44 | Widget build(BuildContext context) { 45 | Offset startPos = widget.offset; 46 | Animation position = 47 | Tween(begin: startPos, end: Offset.zero).animate(anim); 48 | return Transform.translate( 49 | offset: position.value, 50 | child: Opacity( 51 | opacity: anim.value, 52 | child: widget.child, 53 | ), 54 | ); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/fade_in_effect.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class FadeInEffect extends StatefulWidget { 4 | const FadeInEffect({ 5 | Key? key, 6 | required this.child, 7 | this.intervalStart = .5, 8 | this.keepAlive = true, 9 | }) : super(key: key); 10 | 11 | final Widget child; 12 | final double intervalStart; 13 | final bool keepAlive; 14 | 15 | @override 16 | State createState() => _FadeInEffectState(); 17 | } 18 | 19 | class _FadeInEffectState extends State 20 | with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { 21 | late final AnimationController animationController; 22 | late final Animation opacityAnimation; 23 | 24 | @override 25 | void initState() { 26 | super.initState(); 27 | animationController = AnimationController( 28 | vsync: this, 29 | duration: const Duration(milliseconds: 800), 30 | )..forward(); 31 | 32 | opacityAnimation = Tween(begin: 0, end: 1).animate( 33 | CurvedAnimation( 34 | parent: animationController, 35 | curve: Interval(widget.intervalStart, 1, curve: Curves.easeOut), 36 | ), 37 | ); 38 | } 39 | 40 | @override 41 | void dispose() { 42 | animationController.dispose(); 43 | super.dispose(); 44 | } 45 | 46 | @override 47 | Widget build(BuildContext context) { 48 | super.build(context); 49 | return FadeTransition( 50 | opacity: opacityAnimation, 51 | child: widget.child, 52 | ); 53 | } 54 | 55 | @override 56 | bool get wantKeepAlive => widget.keepAlive; 57 | } 58 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/gyroscope_effect_stream_builder.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:sensors_plus/sensors_plus.dart'; 4 | 5 | import '../../../init/utils/typedefs.dart'; 6 | 7 | class GyroscopeEffect extends StatefulWidget { 8 | const GyroscopeEffect({ 9 | Key? key, 10 | required this.child, 11 | this.maxMovableDistance = 10, 12 | this.offsetMultiplier = 1, 13 | this.childBuilder, 14 | }) : assert(child != null), 15 | super(key: key); 16 | 17 | const GyroscopeEffect.builder({ 18 | Key? key, 19 | this.child, 20 | this.maxMovableDistance = 10, 21 | this.offsetMultiplier = 1, 22 | required this.childBuilder, 23 | }) : assert(childBuilder != null), 24 | super(key: key); 25 | 26 | final Widget? child; 27 | final double maxMovableDistance; 28 | final double offsetMultiplier; 29 | final GyroscopeEffectBuilder? childBuilder; 30 | 31 | @override 32 | State createState() => _GyroscopeEffectState(); 33 | } 34 | 35 | class _GyroscopeEffectState extends State { 36 | double x = 0; 37 | double y = 0; 38 | 39 | @override 40 | Widget build(BuildContext context) { 41 | if (kIsWeb || 42 | defaultTargetPlatform == TargetPlatform.macOS || 43 | defaultTargetPlatform == TargetPlatform.linux) { 44 | return _buildChild(context, 0, 0); 45 | } else { 46 | return StreamBuilder( 47 | builder: (context, AsyncSnapshot snapshot) { 48 | if (snapshot.hasData) { 49 | final GyroscopeEvent gyroscopeEvent = snapshot.data!; 50 | x += gyroscopeEvent.y; 51 | y += gyroscopeEvent.x; 52 | 53 | x = x.clamp(-widget.maxMovableDistance, widget.maxMovableDistance); 54 | y = y.clamp(-widget.maxMovableDistance, widget.maxMovableDistance); 55 | } 56 | 57 | return _buildChild(context, x, y); 58 | }, 59 | ); 60 | } 61 | } 62 | 63 | Widget _buildChild( 64 | BuildContext context, 65 | double x, 66 | double y, 67 | ) { 68 | if (widget.childBuilder != null) { 69 | return widget.childBuilder!.call( 70 | context, 71 | Offset(-y, -x) * widget.offsetMultiplier, 72 | widget.child, 73 | ); 74 | } else { 75 | return AnimatedPositioned( 76 | top: y * widget.offsetMultiplier, 77 | bottom: y * widget.offsetMultiplier, 78 | left: -x * widget.offsetMultiplier, 79 | right: x * widget.offsetMultiplier, 80 | duration: const Duration(milliseconds: 100), 81 | curve: Curves.easeOut, 82 | child: widget.child!, 83 | ); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/list_item_wrapper_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/rendering.dart'; 3 | 4 | class ListItemWrapperWidget extends StatefulWidget { 5 | const ListItemWrapperWidget({ 6 | Key? key, 7 | required this.child, 8 | this.keepAlive = false, 9 | this.scrollDirection = ScrollDirection.forward, 10 | }) : super(key: key); 11 | 12 | final Widget child; 13 | final bool keepAlive; 14 | final ScrollDirection scrollDirection; 15 | 16 | @override 17 | State createState() => _ListItemWrapperWidgetState(); 18 | } 19 | 20 | class _ListItemWrapperWidgetState extends State 21 | with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { 22 | late final AnimationController animationController; 23 | late final Animation scaleAnimation; 24 | late final Animation perspectiveAnimation; 25 | late final Animation alignmentAnimation; 26 | 27 | static const double perspectiveValue = 0.004; 28 | 29 | @override 30 | void initState() { 31 | super.initState(); 32 | final int perspectiveDirectionMultiplier = 33 | widget.scrollDirection == ScrollDirection.forward ? -1 : 1; 34 | 35 | final AlignmentGeometry directionAlignment = 36 | widget.scrollDirection == ScrollDirection.forward 37 | ? Alignment.bottomCenter 38 | : Alignment.topCenter; 39 | 40 | animationController = AnimationController( 41 | vsync: this, 42 | duration: const Duration(milliseconds: 500), 43 | )..forward(); 44 | 45 | scaleAnimation = Tween(begin: 0.7, end: 1).animate( 46 | CurvedAnimation( 47 | parent: animationController, 48 | curve: const Interval(0, 0.5, curve: Curves.easeOut), 49 | ), 50 | ); 51 | 52 | perspectiveAnimation = Tween( 53 | begin: perspectiveValue * perspectiveDirectionMultiplier, 54 | end: 0, 55 | ).animate( 56 | CurvedAnimation( 57 | parent: animationController, 58 | curve: const Interval(0, 1, curve: Curves.easeOut), 59 | ), 60 | ); 61 | 62 | alignmentAnimation = Tween( 63 | begin: directionAlignment, 64 | end: Alignment.center, 65 | ).animate( 66 | CurvedAnimation( 67 | parent: animationController, 68 | curve: const Interval(0, 1, curve: Curves.easeOut), 69 | ), 70 | ); 71 | } 72 | 73 | @override 74 | void dispose() { 75 | animationController.dispose(); 76 | super.dispose(); 77 | } 78 | 79 | @override 80 | Widget build(BuildContext context) { 81 | super.build(context); 82 | return AnimatedBuilder( 83 | animation: animationController, 84 | child: widget.child, 85 | builder: (context, child) => Transform( 86 | transform: Matrix4.identity() 87 | ..setEntry(3, 1, perspectiveAnimation.value), 88 | alignment: alignmentAnimation.value, 89 | child: Transform.scale( 90 | scale: scaleAnimation.value, 91 | child: child, 92 | ), 93 | ), 94 | ); 95 | } 96 | 97 | @override 98 | bool get wantKeepAlive => widget.keepAlive; 99 | } 100 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/animationUtils/mouse_region_effect.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/gestures.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | import '../../../init/utils/typedefs.dart'; 5 | 6 | class MouseRegionEffect extends StatefulWidget { 7 | const MouseRegionEffect({ 8 | Key? key, 9 | required this.width, 10 | required this.height, 11 | required this.child, 12 | this.offsetMultiplier = 1, 13 | this.childBuilder, 14 | this.maxMovableDistance = 10, 15 | }) : assert(child != null && childBuilder == null), 16 | super(key: key); 17 | 18 | const MouseRegionEffect.builder({ 19 | Key? key, 20 | required this.width, 21 | required this.height, 22 | this.child, 23 | this.offsetMultiplier = 1, 24 | required this.childBuilder, 25 | this.maxMovableDistance = 10, 26 | }) : assert(childBuilder != null), 27 | super(key: key); 28 | 29 | final double width; 30 | final double height; 31 | final OffsetEffectBuilder? childBuilder; 32 | final Widget? child; 33 | final double offsetMultiplier; 34 | final double maxMovableDistance; 35 | 36 | @override 37 | State createState() => _MouseRegionEffectState(); 38 | } 39 | 40 | class _MouseRegionEffectState extends State { 41 | Offset offset = const Offset(0, 0); 42 | Alignment mouseRegionAlignment = Alignment.bottomRight; 43 | 44 | Alignment alignmentFromOffset(Offset mousePosition) { 45 | if (mousePosition.dx > widget.width / 2) { 46 | return mousePosition.dy > widget.height / 2 47 | ? Alignment.bottomRight 48 | : Alignment.topRight; 49 | } else { 50 | return mousePosition.dy > widget.height / 2 51 | ? Alignment.bottomLeft 52 | : Alignment.topLeft; 53 | } 54 | } 55 | 56 | Offset offsetFromMousePosition(Offset mousePosition) { 57 | Alignment alignment = alignmentFromOffset(mousePosition); 58 | return Offset( 59 | widget.maxMovableDistance * alignment.x * -1, 60 | widget.maxMovableDistance * alignment.y * -1, 61 | ); 62 | } 63 | 64 | @override 65 | Widget build(BuildContext context) { 66 | return MouseRegion( 67 | hitTestBehavior: HitTestBehavior.translucent, 68 | onEnter: (PointerEnterEvent event) { 69 | setState(() { 70 | offset = offsetFromMousePosition(event.localPosition); 71 | }); 72 | }, 73 | onHover: (PointerHoverEvent event) { 74 | setState(() { 75 | offset = offsetFromMousePosition(event.localPosition); 76 | }); 77 | }, 78 | onExit: (PointerExitEvent event) { 79 | setState(() { 80 | offset = offsetFromMousePosition(event.localPosition); 81 | }); 82 | }, 83 | child: _buildChild(context, widget.child), 84 | ); 85 | } 86 | 87 | Widget _buildChild(BuildContext context, Widget? child) { 88 | if (widget.childBuilder != null) { 89 | return widget.childBuilder!.call(context, offset, child); 90 | } else { 91 | return TweenAnimationBuilder( 92 | tween: Tween( 93 | begin: Offset.zero, 94 | end: offset * widget.offsetMultiplier, 95 | ), 96 | duration: const Duration(milliseconds: 500), 97 | curve: Curves.easeOutBack, 98 | builder: (context, Offset offset, child) => Transform.translate( 99 | offset: offset, 100 | child: child, 101 | ), 102 | child: child, 103 | ); 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /lib/src/core/components/animations/provider/gyroscope_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | import 'package:flutter_riverpod/flutter_riverpod.dart'; 3 | import 'package:sensors_plus/sensors_plus.dart'; 4 | 5 | final StreamProvider gyroscopeProvider = 6 | StreamProvider( 7 | (_) { 8 | if (defaultTargetPlatform == TargetPlatform.macOS || 9 | defaultTargetPlatform == TargetPlatform.linux) { 10 | return const Stream.empty(); 11 | } else { 12 | return SensorsPlatform.instance.gyroscopeEvents; 13 | } 14 | }, 15 | ); 16 | -------------------------------------------------------------------------------- /lib/src/core/components/appbar/custom_app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../text/custom_text.dart'; 4 | 5 | /// Since [AppBar] structure will be the same 6 | /// on many pages of the application, a common structure should be established. 7 | 8 | class CustomAppBar extends AppBar { 9 | CustomAppBar({super.key}); 10 | 11 | @override 12 | State createState() => _CustomAppBarState(); 13 | } 14 | 15 | class _CustomAppBarState extends State { 16 | @override 17 | Widget build(BuildContext context) { 18 | return AppBar( 19 | centerTitle: true, 20 | title: const CustomText('Mobile App Template'), 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/src/core/components/button/button_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ButtonWidget extends StatefulWidget { 4 | const ButtonWidget({super.key, required this.onTap}); 5 | 6 | final VoidCallback onTap; 7 | 8 | @override 9 | State createState() => _ButtonWidgetState(); 10 | } 11 | 12 | class _ButtonWidgetState extends State 13 | with SingleTickerProviderStateMixin { 14 | late double _scale; 15 | late AnimationController _controller; 16 | 17 | @override 18 | void initState() { 19 | super.initState(); 20 | _controller = AnimationController( 21 | vsync: this, 22 | duration: const Duration(milliseconds: 400), 23 | lowerBound: 0.0, 24 | upperBound: 0.1, 25 | )..addListener(() { 26 | setState(() {}); 27 | }); 28 | } 29 | 30 | @override 31 | void dispose() { 32 | _controller.dispose(); 33 | super.dispose(); 34 | } 35 | 36 | void _tapDown(TapDownDetails details) { 37 | _controller.forward(); 38 | } 39 | 40 | void _tapUp(TapUpDetails details) { 41 | _controller.reverse(); 42 | } 43 | 44 | @override 45 | Widget build(BuildContext context) { 46 | _scale = 1 - _controller.value; 47 | return GestureDetector( 48 | onTapDown: _tapDown, 49 | onTapUp: _tapUp, 50 | onTap: widget.onTap, 51 | child: Transform.scale( 52 | scale: _scale, 53 | child: Container(), 54 | //From here you should start button design. 55 | ), 56 | ); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /lib/src/core/components/noNetwork/no_network_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../components/text/custom_text.dart'; 4 | import '../../constants/enums/network_result_enums.dart'; 5 | import '../../init/network/network_change_manager.dart'; 6 | import '../../mixins/state_mixin.dart'; 7 | 8 | class NoNetworkWidget extends StatefulWidget { 9 | const NoNetworkWidget({super.key}); 10 | 11 | @override 12 | State createState() => _NoNetworkWidgetState(); 13 | } 14 | 15 | class _NoNetworkWidgetState extends State with StateMixin { 16 | late final INetworkChangeManager _networkChange; 17 | NetworkResultEnums? _networkResult; 18 | 19 | @override 20 | void initState() { 21 | super.initState(); 22 | _networkChange = NetworkChangeManager(); 23 | 24 | waitForScreen(() { 25 | _networkChange.handleNetworkChange((result) { 26 | _updateView(result); 27 | }); 28 | }); 29 | } 30 | 31 | Future fetchFirstResult() async { 32 | WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { 33 | final result = await _networkChange.checkNetworkFirstTime(); 34 | _updateView(result); 35 | }); 36 | } 37 | 38 | void _updateView(NetworkResultEnums result) { 39 | setState(() { 40 | _networkResult = result; 41 | }); 42 | } 43 | 44 | @override 45 | Widget build(BuildContext context) { 46 | return AnimatedCrossFade( 47 | duration: const Duration(seconds: 1), 48 | crossFadeState: _networkResult == NetworkResultEnums.off 49 | ? CrossFadeState.showFirst 50 | : CrossFadeState.showSecond, 51 | firstChild: const Material( 52 | color: Colors.white, 53 | child: Center( 54 | child: CustomText("No network."), 55 | ), 56 | ), 57 | secondChild: const SizedBox.shrink(), 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/src/core/components/popup/main_popup.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | Future buildGeneralDialog(BuildContext context) { 4 | return showGeneralDialog( 5 | context: context, 6 | pageBuilder: (context, animation, secondaryAnimation) { 7 | return ScaleTransition( 8 | scale: Tween(begin: .5, end: 1).animate(animation), 9 | child: const AlertDialog(), 10 | //From here you should start Alert Dialog design. 11 | ); 12 | }, 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /lib/src/core/components/scaffold/custom_scaffold.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:go_router/go_router.dart'; 3 | 4 | import '../appbar/custom_app_bar.dart'; 5 | 6 | /// Since [Scaffold] structure will be the same 7 | /// on many pages of the application, a common structure should be established. 8 | 9 | class CustomScaffold extends StatefulWidget { 10 | final Widget body; 11 | final GoRouterState? navigatorState; 12 | final bool? isThereAppBar; 13 | 14 | const CustomScaffold({ 15 | super.key, 16 | required this.body, 17 | this.navigatorState, 18 | this.isThereAppBar = true, 19 | }); 20 | 21 | @override 22 | State createState() => _CustomScaffoldState(); 23 | } 24 | 25 | class _CustomScaffoldState extends State { 26 | @override 27 | Widget build(BuildContext context) { 28 | return Scaffold( 29 | appBar: widget.isThereAppBar! ? CustomAppBar() : null, 30 | body: widget.body, 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/src/core/components/text/custom_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_size_text/auto_size_text.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:google_fonts/google_fonts.dart'; 4 | 5 | class CustomText extends StatelessWidget { 6 | final String text; 7 | final TextStyle? textStyle; 8 | final TextAlign? textAlign; 9 | final int? maxLines; 10 | 11 | const CustomText(this.text, 12 | {Key? key, this.textStyle, this.textAlign, this.maxLines}) 13 | : super(key: key); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return AutoSizeText( 18 | text, 19 | style: GoogleFonts.inter(textStyle: textStyle), 20 | textAlign: textAlign, 21 | maxLines: maxLines, 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/src/core/components/textFormField/text_form_field_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TextFormFieldWidget extends StatefulWidget { 4 | const TextFormFieldWidget({super.key}); 5 | 6 | @override 7 | State createState() => _TextFormFieldWidgetState(); 8 | } 9 | 10 | class _TextFormFieldWidgetState extends State { 11 | @override 12 | Widget build(BuildContext context) { 13 | return TextFormField(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/src/core/components/textFormField/validate_operations.dart: -------------------------------------------------------------------------------- 1 | validateOperation(dynamic value, String errorMessage, 2 | {int minCharacterCount = 0}) { 3 | if (value == null || value.isEmpty || value.length < minCharacterCount) { 4 | return errorMessage; 5 | } 6 | return null; 7 | } 8 | 9 | emailValidateOperation(dynamic email) { 10 | bool emailValid = RegExp( 11 | r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+") 12 | .hasMatch(email); 13 | 14 | if (email == null || email.isEmpty || !emailValid) { 15 | return "Please make sure you enter the correct email."; 16 | } 17 | return null; 18 | } 19 | 20 | checkUserName(bool value) { 21 | if (!value) { 22 | return "*This username is already in use"; 23 | } 24 | return null; 25 | } 26 | -------------------------------------------------------------------------------- /lib/src/core/constants/app/app_constants.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AppConstants { 4 | static AppConstants? _instance; 5 | static AppConstants get instance { 6 | _instance ??= AppConstants._init(); 7 | return _instance!; 8 | } 9 | 10 | AppConstants._init(); 11 | 12 | String appName = "Flutter Mobile App Template"; 13 | 14 | Color mineShaft = const Color(0xFF333333); 15 | } 16 | -------------------------------------------------------------------------------- /lib/src/core/constants/app/color_constants.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ColorConstants { 4 | static ColorConstants? _instance; 5 | static ColorConstants get instance { 6 | _instance ??= ColorConstants._init(); 7 | return _instance!; 8 | } 9 | 10 | ColorConstants._init(); 11 | 12 | Color tundora = const Color(0xFF414141); 13 | } 14 | -------------------------------------------------------------------------------- /lib/src/core/constants/enums/icon_enums.dart: -------------------------------------------------------------------------------- 1 | enum IconEnums { 2 | menu('menu'); 3 | 4 | final String iconName; 5 | const IconEnums(this.iconName); 6 | } 7 | -------------------------------------------------------------------------------- /lib/src/core/constants/enums/network_enums.dart: -------------------------------------------------------------------------------- 1 | enum NetworkEnums { example } 2 | -------------------------------------------------------------------------------- /lib/src/core/constants/enums/network_result_enums.dart: -------------------------------------------------------------------------------- 1 | import 'package:connectivity_plus/connectivity_plus.dart'; 2 | 3 | enum NetworkResultEnums { on, off } 4 | 5 | NetworkResultEnums checkConnectivityResult(ConnectivityResult result) { 6 | switch (result) { 7 | case ConnectivityResult.bluetooth: 8 | case ConnectivityResult.wifi: 9 | case ConnectivityResult.ethernet: 10 | case ConnectivityResult.mobile: 11 | return NetworkResultEnums.on; 12 | case ConnectivityResult.none: 13 | return NetworkResultEnums.off; 14 | case ConnectivityResult.vpn: 15 | break; 16 | } 17 | return NetworkResultEnums.off; 18 | } 19 | -------------------------------------------------------------------------------- /lib/src/core/constants/enums/route_enums.dart: -------------------------------------------------------------------------------- 1 | enum RouteEnums { 2 | home('/home'); 3 | 4 | final String routeName; 5 | const RouteEnums(this.routeName); 6 | } 7 | -------------------------------------------------------------------------------- /lib/src/core/extensions/context_extensions.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | 4 | import '../../view/home/bloc/home_bloc.dart'; 5 | import '../base/bloc/auth/auth_bloc.dart'; 6 | 7 | extension BlocExtensions on BuildContext { 8 | AuthBloc get authBloc => read(); 9 | HomeBloc get homeBloc => read(); 10 | } 11 | -------------------------------------------------------------------------------- /lib/src/core/extensions/iterable_extensions.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | extension IterableExtension on Iterable { 4 | T? firstWhereIndexedOrNull(bool Function(int index, T element) test) { 5 | var index = 0; 6 | for (var element in this) { 7 | if (test(index++, element)) return element; 8 | } 9 | return null; 10 | } 11 | } 12 | 13 | extension UnaryNumber on List { 14 | bool get isEven => length.isEven; 15 | bool get isOdd => !isEven; 16 | static bool isListEven(List list) => list.isEven; 17 | } 18 | 19 | extension RandomListItem on List { 20 | T? getRandom() => isEmpty 21 | ? null 22 | : length == 1 23 | ? first 24 | : this[Random().nextInt(length)]; 25 | } 26 | -------------------------------------------------------------------------------- /lib/src/core/extensions/logging_extension.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer' as developer show log; 2 | 3 | extension Log on Object { 4 | void log() => developer.log(toString()); 5 | } 6 | -------------------------------------------------------------------------------- /lib/src/core/extensions/network_extensions.dart: -------------------------------------------------------------------------------- 1 | import '../constants/enums/network_enums.dart'; 2 | 3 | extension NetworkExtensions on NetworkEnums { 4 | String get key { 5 | switch (this) { 6 | case NetworkEnums.example: 7 | return "${NetworkBaseEnums.template.name}/zalisoft"; 8 | } 9 | } 10 | } 11 | 12 | enum NetworkBaseEnums { template } 13 | -------------------------------------------------------------------------------- /lib/src/core/extensions/num_extensions.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | extension EmptyPadding on num { 4 | SizedBox get ph => SizedBox(height: toDouble()); 5 | SizedBox get pw => SizedBox(width: toDouble()); 6 | } 7 | 8 | extension DurationExtensions on num { 9 | Duration get microseconds => Duration(microseconds: round()); 10 | Duration get milliseconds => Duration(microseconds: (this * 1000).round()); 11 | Duration get seconds => Duration(microseconds: (this * 1000 * 1000).round()); 12 | Duration get minutes => 13 | Duration(microseconds: (this * 1000 * 1000 * 60).round()); 14 | Duration get hours => 15 | Duration(microseconds: (this * 1000 * 1000 * 60 * 60).round()); 16 | Duration get days => 17 | Duration(microseconds: (this * 1000 * 1000 * 60 * 60 * 24).round()); 18 | Duration get ms => milliseconds; 19 | } 20 | 21 | extension DoubleExtension on double { 22 | String get toShortDoubleNumber => 23 | "${toString().split(".").first}.${toString().split(".")[1].substring(0, 2)}"; 24 | } 25 | -------------------------------------------------------------------------------- /lib/src/core/extensions/string_extensions.dart: -------------------------------------------------------------------------------- 1 | extension ImagePath on String { 2 | String get toSvg => "assets/icons/svg_$this.svg"; 3 | 4 | String get toPng => "assets/images/ig_$this.png"; 5 | 6 | String get toJpg => "assets/images/ig_$this.jpg"; 7 | 8 | String get toPngIc => "assets/icons/ic_$this.png"; 9 | 10 | String get toJpegIc => "assets/icons/ic_$this.jpg"; 11 | } 12 | 13 | extension StringValidatorExtension on String? { 14 | bool get isNullOrEmpty => this == null || this!.isEmpty; 15 | bool get isNotNullOrNoEmpty => this != null && this!.isNotEmpty; 16 | } 17 | 18 | extension FormValidate on String { 19 | String? get emailValidate => 20 | contains("@") ? null : "Please enter a valid email."; 21 | } 22 | 23 | extension StringExtensions on String { 24 | String getFirstWord() { 25 | List wordList = split(""); 26 | 27 | if (wordList.isNotEmpty) { 28 | return wordList[0]; 29 | } else { 30 | return ' '; 31 | } 32 | } 33 | } 34 | 35 | extension NumberParsing on String { 36 | int get parseInt => int.parse(this); 37 | 38 | int? get tryParseInt => int.tryParse(this); 39 | 40 | double get parseDouble => double.parse(this); 41 | 42 | double? get tryParseDouble => double.tryParse(this); 43 | } 44 | -------------------------------------------------------------------------------- /lib/src/core/init/dependency_injector.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | import 'package:provider/provider.dart'; 4 | import 'package:vexana/vexana.dart'; 5 | 6 | import '../../view/home/bloc/home_bloc.dart'; 7 | import '../../view/home/service/home_service.dart'; 8 | import '../base/bloc/auth/auth_bloc.dart'; 9 | import '../base/services/auth/auth_service.dart'; 10 | import 'network/vexana_manager.dart'; 11 | 12 | class DependencyInjector { 13 | static DependencyInjector? _instance; 14 | 15 | static DependencyInjector get instance { 16 | _instance ??= DependencyInjector._init(); 17 | return _instance!; 18 | } 19 | 20 | late final INetworkManager networkManager; 21 | late final IHomeService homeService; 22 | late final HomeBloc homeBloc; 23 | late final IAuthService authService; 24 | late final AuthBloc authBloc; 25 | 26 | DependencyInjector._init() { 27 | networkManager = VexanaManager.instance.networkManager; 28 | homeService = HomeService(networkManager); 29 | homeBloc = HomeBloc(homeService); 30 | authService = AuthService(networkManager); 31 | authBloc = AuthBloc(authService); 32 | } 33 | 34 | List get repositoryProviders => [ 35 | RepositoryProvider(create: (context) => homeService), 36 | RepositoryProvider(create: (context) => authService), 37 | ]; 38 | 39 | List> get globalBlocProviders => [ 40 | BlocProvider(create: (context) => homeBloc), 41 | BlocProvider(create: (context) => authBloc), 42 | ]; 43 | 44 | List> get otherProviders => []; 45 | } 46 | -------------------------------------------------------------------------------- /lib/src/core/init/local_storage/local_storage_manager.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:flutter_secure_storage/flutter_secure_storage.dart'; 4 | 5 | class LocalStorageManager { 6 | static LocalStorageManager? _instance; 7 | static LocalStorageManager get instance { 8 | if (_instance != null) return _instance!; 9 | _instance = LocalStorageManager._init(); 10 | return _instance!; 11 | } 12 | 13 | LocalStorageManager._init(); 14 | 15 | static const _androidOptions = 16 | AndroidOptions(encryptedSharedPreferences: true); 17 | static const _iosOptions = 18 | IOSOptions(accessibility: KeychainAccessibility.first_unlock); 19 | 20 | static const FlutterSecureStorage _secureStorage = 21 | FlutterSecureStorage(iOptions: _iosOptions, aOptions: _androidOptions); 22 | 23 | Future?> getKeys() async => 24 | (await _secureStorage.readAll()).keys.toSet(); 25 | 26 | Future containsKey(String key) async => 27 | await _secureStorage.containsKey(key: key); 28 | 29 | Future setString(String key, String value) async => 30 | await _secureStorage.write(key: key, value: value); 31 | 32 | Future setBool(String key, bool value) async => 33 | await _secureStorage.write(key: key, value: value.toString()); 34 | 35 | Future setNum(String key, num value) async => 36 | await _secureStorage.write(key: key, value: value.toString()); 37 | 38 | Future _setList(String key, List value) async { 39 | String buffer = json.encode(value); 40 | await _secureStorage.write(key: key, value: buffer); 41 | } 42 | 43 | Future setStringList(String key, List value) => 44 | _setList(key, value); 45 | 46 | Future setNumList(String key, List value) => 47 | _setList(key, value); 48 | 49 | Future setBoolList(String key, List value) => 50 | _setList(key, value); 51 | 52 | Future getString(String key) async => 53 | await _secureStorage.read(key: key); 54 | 55 | Future getBool(String key) async { 56 | String? string = await _secureStorage.read(key: key); 57 | if (string == null) return null; 58 | if (string == 'true') { 59 | return true; 60 | } else if (string == 'false') { 61 | return false; 62 | } else { 63 | return null; 64 | } 65 | } 66 | 67 | Future getNum(String key) async => 68 | num.tryParse(await _secureStorage.read(key: key) ?? ''); 69 | 70 | Future?> _getList(String key) async { 71 | String? string = await _secureStorage.read(key: key); 72 | if (string == null) return null; 73 | List list = (json.decode(string) as List).cast(); 74 | return list; 75 | } 76 | 77 | Future?> getStringList(String key) => _getList(key); 78 | 79 | Future?> getNumList(String key) => _getList(key); 80 | 81 | Future?> getBoolList(String key) => _getList(key); 82 | 83 | Future remove(String key) async => 84 | await _secureStorage.delete(key: key); 85 | 86 | Future clearAll() async => await _secureStorage.deleteAll(); 87 | } 88 | -------------------------------------------------------------------------------- /lib/src/core/init/main_build/main_build.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../components/noNetwork/no_network_widget.dart'; 4 | 5 | class MainBuild extends StatelessWidget { 6 | const MainBuild({super.key, this.child}); 7 | 8 | final Widget? child; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Column( 13 | children: [ 14 | Expanded( 15 | child: child ?? const SizedBox.shrink(), 16 | ), 17 | const NoNetworkWidget() 18 | ], 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/src/core/init/network/network_change_manager.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:connectivity_plus/connectivity_plus.dart'; 4 | import 'package:flutter_mobile_template/src/core/extensions/logging_extension.dart'; 5 | 6 | import '../../constants/enums/network_result_enums.dart'; 7 | import '../utils/typedefs.dart'; 8 | 9 | abstract class INetworkChangeManager { 10 | Future checkNetworkFirstTime(); 11 | void handleNetworkChange(NetworkCallBack onChange); 12 | void dispose(); 13 | } 14 | 15 | class NetworkChangeManager extends INetworkChangeManager { 16 | late final Connectivity _connectivity; 17 | StreamSubscription? _subscription; 18 | 19 | NetworkChangeManager() { 20 | _connectivity = Connectivity(); 21 | } 22 | 23 | @override 24 | Future checkNetworkFirstTime() async { 25 | final connectivityResult = await (_connectivity.checkConnectivity()); 26 | return checkConnectivityResult(connectivityResult); 27 | } 28 | 29 | @override 30 | void handleNetworkChange(NetworkCallBack onChange) { 31 | _subscription = _connectivity.onConnectivityChanged.listen((event) { 32 | event.log(); 33 | onChange.call(checkConnectivityResult(event)); 34 | }); 35 | } 36 | 37 | @override 38 | void dispose() { 39 | _subscription?.cancel(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/src/core/init/network/vexana_manager.dart: -------------------------------------------------------------------------------- 1 | import 'package:vexana/vexana.dart'; 2 | 3 | class VexanaManager { 4 | static VexanaManager? _instance; 5 | static VexanaManager get instance { 6 | if (_instance != null) return _instance!; 7 | _instance = VexanaManager._init(); 8 | return _instance!; 9 | } 10 | 11 | static const String baseUrl = "http://localhost:3000/api"; 12 | 13 | VexanaManager._init(); 14 | 15 | INetworkManager networkManager = NetworkManager( 16 | isEnableLogger: true, 17 | isEnableTest: true, 18 | options: BaseOptions( 19 | baseUrl: baseUrl, 20 | followRedirects: true, 21 | ), 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /lib/src/core/init/routes/routes.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:go_router/go_router.dart'; 3 | 4 | import '../../../view/home/home_view.dart'; 5 | import '../../base/functions/base_functions.dart'; 6 | import '../../constants/enums/route_enums.dart'; 7 | 8 | final GlobalKey mainNavigatorKey = 9 | GlobalKey(debugLabel: 'main'); 10 | 11 | class Routes { 12 | static Routes? _instance; 13 | static Routes get instance { 14 | _instance ??= Routes._init(); 15 | return _instance!; 16 | } 17 | 18 | Routes._init(); 19 | 20 | GoRouter routes = GoRouter( 21 | navigatorKey: mainNavigatorKey, 22 | initialLocation: RouteEnums.home.routeName, 23 | debugLogDiagnostics: true, 24 | routes: [ 25 | GoRoute( 26 | path: RouteEnums.home.routeName, 27 | pageBuilder: (context, state) { 28 | return BaseFunctions.instance.animatedRouting( 29 | state: state, 30 | route: const HomeView(), 31 | ); 32 | }, 33 | ), 34 | ], 35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /lib/src/core/init/theme/app_theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AppTheme { 4 | static AppTheme? _instance; 5 | static AppTheme get instance { 6 | if (_instance != null) return _instance!; 7 | _instance = AppTheme._init(); 8 | return _instance!; 9 | } 10 | 11 | AppTheme._init(); 12 | 13 | ThemeData appTheme = ThemeData.dark(); 14 | } 15 | -------------------------------------------------------------------------------- /lib/src/core/init/utils/typedefs.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../constants/enums/network_result_enums.dart'; 4 | 5 | typedef DoubleFunction = Function(double)?; 6 | 7 | typedef StringFunction = void Function(String?)?; 8 | 9 | typedef NetworkCallBack = void Function(NetworkResultEnums result); 10 | 11 | typedef JsonMap = Map; 12 | 13 | typedef OffsetEffectBuilder = Widget Function( 14 | BuildContext context, 15 | Offset offset, 16 | Widget? child, 17 | ); 18 | 19 | typedef GyroscopeEffectBuilder = Widget Function( 20 | BuildContext context, Offset offset, Widget? child); 21 | -------------------------------------------------------------------------------- /lib/src/core/locale_keys.g.dart: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT. This is code generated via package:easy_localization/generate.dart 2 | 3 | abstract class LocaleKeys { 4 | static const appName = 'appName'; 5 | 6 | } 7 | -------------------------------------------------------------------------------- /lib/src/core/mixins/launch_mixin.dart: -------------------------------------------------------------------------------- 1 | import 'package:url_launcher/url_launcher.dart'; 2 | 3 | mixin LaunchMixin { 4 | /// [mixin] should be created for such packages. 5 | 6 | Future launchInBrowser(Uri url) async { 7 | if (!await launchUrl(url)) { 8 | throw 'Could not launch $url'; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/src/core/mixins/safe_context_mixin.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | mixin SafeContextMixin on State { 4 | void safeOperation(VoidCallback function) { 5 | if (!mounted) return; 6 | function.call(); 7 | } 8 | 9 | @override 10 | void setState(VoidCallback fn) { 11 | if (!mounted) return; 12 | super.setState(fn); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/src/core/mixins/state_mixin.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | mixin StateMixin on State { 4 | void waitForScreen(VoidCallback onComplete) { 5 | WidgetsBinding.instance.addPostFrameCallback((timeStamp) { 6 | onComplete.call(); 7 | }); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/src/view/auth/login/login_view.dart: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lib/src/view/auth/register/register_view.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/lib/src/view/auth/register/register_view.dart -------------------------------------------------------------------------------- /lib/src/view/home/bloc/home_bloc.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_bloc/flutter_bloc.dart'; 2 | import 'package:equatable/equatable.dart'; 3 | 4 | import '../service/home_service.dart'; 5 | 6 | part 'home_event.dart'; 7 | part 'home_state.dart'; 8 | 9 | /// [HomeBloc] is not a correct naming. Named as such as an example, 10 | /// please edit here according to the project's requirements. 11 | 12 | class HomeBloc extends Bloc { 13 | final IHomeService homeService; 14 | HomeBloc(this.homeService) : super(HomeInitial()) { 15 | on((event, emit) {}); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/src/view/home/bloc/home_event.dart: -------------------------------------------------------------------------------- 1 | part of 'home_bloc.dart'; 2 | 3 | abstract class HomeEvent extends Equatable { 4 | const HomeEvent(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/src/view/home/bloc/home_state.dart: -------------------------------------------------------------------------------- 1 | part of 'home_bloc.dart'; 2 | 3 | abstract class HomeState extends Equatable { 4 | const HomeState(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | 10 | class HomeInitial extends HomeState {} 11 | -------------------------------------------------------------------------------- /lib/src/view/home/home_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../core/components/animations/animationUtils/animate_in_effect.dart'; 4 | import '../../core/components/scaffold/custom_scaffold.dart'; 5 | import '../../core/components/text/custom_text.dart'; 6 | 7 | class HomeView extends StatefulWidget { 8 | const HomeView({super.key}); 9 | 10 | @override 11 | State createState() => _HomeViewState(); 12 | } 13 | 14 | class _HomeViewState extends State { 15 | @override 16 | Widget build(BuildContext context) { 17 | return const CustomScaffold( 18 | body: AnimateInEffect( 19 | child: Center( 20 | child: CustomText("by Zalisoft Mobile Team"), 21 | ), 22 | ), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/src/view/home/model/home_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_mobile_template/src/core/init/utils/typedefs.dart'; 2 | import 'package:json_annotation/json_annotation.dart'; 3 | import 'package:vexana/vexana.dart'; 4 | 5 | part 'home_model.g.dart'; 6 | 7 | /// [HomeModel] is not a correct naming. Named as such as an example, 8 | /// please edit here according to the project's requirements. 9 | 10 | @JsonSerializable() 11 | class HomeModel extends INetworkModel { 12 | String? id; 13 | 14 | HomeModel({ 15 | this.id, 16 | }); 17 | 18 | @override 19 | fromJson(JsonMap json) { 20 | return _$HomeModelFromJson(json); 21 | } 22 | 23 | @override 24 | JsonMap toJson() { 25 | return _$HomeModelToJson(this); 26 | } 27 | 28 | factory HomeModel.fromJson(JsonMap json) => _$HomeModelFromJson(json); 29 | } 30 | -------------------------------------------------------------------------------- /lib/src/view/home/model/home_model.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'home_model.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | HomeModel _$HomeModelFromJson(Map json) => HomeModel( 10 | id: json['id'] as String?, 11 | ); 12 | 13 | Map _$HomeModelToJson(HomeModel instance) => { 14 | 'id': instance.id, 15 | }; 16 | -------------------------------------------------------------------------------- /lib/src/view/home/service/home_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:vexana/vexana.dart'; 2 | 3 | abstract class IHomeService { 4 | final INetworkManager networkManager; 5 | IHomeService(this.networkManager); 6 | } 7 | 8 | /// [IHomeService] is not a correct naming. Named as such as an example, 9 | /// please edit here according to the project's requirements. 10 | 11 | class HomeService extends IHomeService { 12 | HomeService(super.networkManager); 13 | } 14 | -------------------------------------------------------------------------------- /lib/src/view/home/widgets/home_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | /// Each page has its own [widgets] folder. 4 | /// Widgets in this folder are specific to this page. 5 | 6 | class HomeCard extends StatelessWidget { 7 | const HomeCard({super.key}); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Container(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | _fe_analyzer_shared: 5 | dependency: transitive 6 | description: 7 | name: _fe_analyzer_shared 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "50.0.0" 11 | analyzer: 12 | dependency: transitive 13 | description: 14 | name: analyzer 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "5.2.0" 18 | archive: 19 | dependency: transitive 20 | description: 21 | name: archive 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "3.3.0" 25 | args: 26 | dependency: transitive 27 | description: 28 | name: args 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.3.1" 32 | async: 33 | dependency: transitive 34 | description: 35 | name: async 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "2.9.0" 39 | auto_size_text: 40 | dependency: "direct main" 41 | description: 42 | name: auto_size_text 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "3.0.0" 46 | bloc: 47 | dependency: transitive 48 | description: 49 | name: bloc 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "8.1.0" 53 | boolean_selector: 54 | dependency: transitive 55 | description: 56 | name: boolean_selector 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.1.0" 60 | bot_toast: 61 | dependency: "direct main" 62 | description: 63 | name: bot_toast 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "4.0.3" 67 | build: 68 | dependency: transitive 69 | description: 70 | name: build 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "2.3.1" 74 | build_config: 75 | dependency: transitive 76 | description: 77 | name: build_config 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.1.0" 81 | build_daemon: 82 | dependency: transitive 83 | description: 84 | name: build_daemon 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "3.1.0" 88 | build_resolvers: 89 | dependency: transitive 90 | description: 91 | name: build_resolvers 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "2.1.0" 95 | build_runner: 96 | dependency: "direct dev" 97 | description: 98 | name: build_runner 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "2.3.3" 102 | build_runner_core: 103 | dependency: transitive 104 | description: 105 | name: build_runner_core 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "7.2.3" 109 | built_collection: 110 | dependency: transitive 111 | description: 112 | name: built_collection 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "5.1.1" 116 | built_value: 117 | dependency: transitive 118 | description: 119 | name: built_value 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "8.3.2" 123 | change_app_package_name: 124 | dependency: "direct dev" 125 | description: 126 | name: change_app_package_name 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "1.1.0" 130 | characters: 131 | dependency: transitive 132 | description: 133 | name: characters 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "1.2.1" 137 | checked_yaml: 138 | dependency: transitive 139 | description: 140 | name: checked_yaml 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "2.0.1" 144 | cli_util: 145 | dependency: transitive 146 | description: 147 | name: cli_util 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "0.3.5" 151 | clock: 152 | dependency: transitive 153 | description: 154 | name: clock 155 | url: "https://pub.dartlang.org" 156 | source: hosted 157 | version: "1.1.1" 158 | code_builder: 159 | dependency: transitive 160 | description: 161 | name: code_builder 162 | url: "https://pub.dartlang.org" 163 | source: hosted 164 | version: "4.4.0" 165 | collection: 166 | dependency: transitive 167 | description: 168 | name: collection 169 | url: "https://pub.dartlang.org" 170 | source: hosted 171 | version: "1.16.0" 172 | connectivity_plus: 173 | dependency: "direct main" 174 | description: 175 | name: connectivity_plus 176 | url: "https://pub.dartlang.org" 177 | source: hosted 178 | version: "2.3.9" 179 | connectivity_plus_linux: 180 | dependency: transitive 181 | description: 182 | name: connectivity_plus_linux 183 | url: "https://pub.dartlang.org" 184 | source: hosted 185 | version: "1.3.1" 186 | connectivity_plus_macos: 187 | dependency: transitive 188 | description: 189 | name: connectivity_plus_macos 190 | url: "https://pub.dartlang.org" 191 | source: hosted 192 | version: "1.2.6" 193 | connectivity_plus_platform_interface: 194 | dependency: transitive 195 | description: 196 | name: connectivity_plus_platform_interface 197 | url: "https://pub.dartlang.org" 198 | source: hosted 199 | version: "1.2.3" 200 | connectivity_plus_web: 201 | dependency: transitive 202 | description: 203 | name: connectivity_plus_web 204 | url: "https://pub.dartlang.org" 205 | source: hosted 206 | version: "1.2.5" 207 | connectivity_plus_windows: 208 | dependency: transitive 209 | description: 210 | name: connectivity_plus_windows 211 | url: "https://pub.dartlang.org" 212 | source: hosted 213 | version: "1.2.2" 214 | convert: 215 | dependency: transitive 216 | description: 217 | name: convert 218 | url: "https://pub.dartlang.org" 219 | source: hosted 220 | version: "3.0.2" 221 | crypto: 222 | dependency: transitive 223 | description: 224 | name: crypto 225 | url: "https://pub.dartlang.org" 226 | source: hosted 227 | version: "3.0.2" 228 | csslib: 229 | dependency: transitive 230 | description: 231 | name: csslib 232 | url: "https://pub.dartlang.org" 233 | source: hosted 234 | version: "0.17.2" 235 | cupertino_icons: 236 | dependency: "direct main" 237 | description: 238 | name: cupertino_icons 239 | url: "https://pub.dartlang.org" 240 | source: hosted 241 | version: "1.0.5" 242 | dart_style: 243 | dependency: transitive 244 | description: 245 | name: dart_style 246 | url: "https://pub.dartlang.org" 247 | source: hosted 248 | version: "2.2.4" 249 | dbus: 250 | dependency: transitive 251 | description: 252 | name: dbus 253 | url: "https://pub.dartlang.org" 254 | source: hosted 255 | version: "0.7.8" 256 | dio: 257 | dependency: transitive 258 | description: 259 | name: dio 260 | url: "https://pub.dartlang.org" 261 | source: hosted 262 | version: "4.0.6" 263 | easy_localization: 264 | dependency: "direct main" 265 | description: 266 | name: easy_localization 267 | url: "https://pub.dartlang.org" 268 | source: hosted 269 | version: "3.0.1" 270 | easy_logger: 271 | dependency: transitive 272 | description: 273 | name: easy_logger 274 | url: "https://pub.dartlang.org" 275 | source: hosted 276 | version: "0.0.2" 277 | equatable: 278 | dependency: "direct main" 279 | description: 280 | name: equatable 281 | url: "https://pub.dartlang.org" 282 | source: hosted 283 | version: "2.0.5" 284 | fake_async: 285 | dependency: transitive 286 | description: 287 | name: fake_async 288 | url: "https://pub.dartlang.org" 289 | source: hosted 290 | version: "1.3.1" 291 | ffi: 292 | dependency: transitive 293 | description: 294 | name: ffi 295 | url: "https://pub.dartlang.org" 296 | source: hosted 297 | version: "2.0.0" 298 | file: 299 | dependency: transitive 300 | description: 301 | name: file 302 | url: "https://pub.dartlang.org" 303 | source: hosted 304 | version: "6.1.2" 305 | fixnum: 306 | dependency: transitive 307 | description: 308 | name: fixnum 309 | url: "https://pub.dartlang.org" 310 | source: hosted 311 | version: "1.0.1" 312 | flutter: 313 | dependency: "direct main" 314 | description: flutter 315 | source: sdk 316 | version: "0.0.0" 317 | flutter_bloc: 318 | dependency: "direct main" 319 | description: 320 | name: flutter_bloc 321 | url: "https://pub.dartlang.org" 322 | source: hosted 323 | version: "8.1.1" 324 | flutter_launcher_icons: 325 | dependency: "direct dev" 326 | description: 327 | name: flutter_launcher_icons 328 | url: "https://pub.dartlang.org" 329 | source: hosted 330 | version: "0.10.0" 331 | flutter_lints: 332 | dependency: "direct dev" 333 | description: 334 | name: flutter_lints 335 | url: "https://pub.dartlang.org" 336 | source: hosted 337 | version: "2.0.1" 338 | flutter_localizations: 339 | dependency: transitive 340 | description: flutter 341 | source: sdk 342 | version: "0.0.0" 343 | flutter_native_splash: 344 | dependency: "direct main" 345 | description: 346 | name: flutter_native_splash 347 | url: "https://pub.dartlang.org" 348 | source: hosted 349 | version: "2.2.15" 350 | flutter_riverpod: 351 | dependency: "direct main" 352 | description: 353 | name: flutter_riverpod 354 | url: "https://pub.dartlang.org" 355 | source: hosted 356 | version: "2.1.3" 357 | flutter_secure_storage: 358 | dependency: "direct main" 359 | description: 360 | name: flutter_secure_storage 361 | url: "https://pub.dartlang.org" 362 | source: hosted 363 | version: "6.0.0" 364 | flutter_secure_storage_linux: 365 | dependency: transitive 366 | description: 367 | name: flutter_secure_storage_linux 368 | url: "https://pub.dartlang.org" 369 | source: hosted 370 | version: "1.1.1" 371 | flutter_secure_storage_macos: 372 | dependency: transitive 373 | description: 374 | name: flutter_secure_storage_macos 375 | url: "https://pub.dartlang.org" 376 | source: hosted 377 | version: "1.1.1" 378 | flutter_secure_storage_platform_interface: 379 | dependency: transitive 380 | description: 381 | name: flutter_secure_storage_platform_interface 382 | url: "https://pub.dartlang.org" 383 | source: hosted 384 | version: "1.0.0" 385 | flutter_secure_storage_web: 386 | dependency: transitive 387 | description: 388 | name: flutter_secure_storage_web 389 | url: "https://pub.dartlang.org" 390 | source: hosted 391 | version: "1.0.2" 392 | flutter_secure_storage_windows: 393 | dependency: transitive 394 | description: 395 | name: flutter_secure_storage_windows 396 | url: "https://pub.dartlang.org" 397 | source: hosted 398 | version: "1.1.2" 399 | flutter_svg: 400 | dependency: "direct main" 401 | description: 402 | name: flutter_svg 403 | url: "https://pub.dartlang.org" 404 | source: hosted 405 | version: "1.1.6" 406 | flutter_test: 407 | dependency: "direct dev" 408 | description: flutter 409 | source: sdk 410 | version: "0.0.0" 411 | flutter_web_plugins: 412 | dependency: transitive 413 | description: flutter 414 | source: sdk 415 | version: "0.0.0" 416 | frontend_server_client: 417 | dependency: transitive 418 | description: 419 | name: frontend_server_client 420 | url: "https://pub.dartlang.org" 421 | source: hosted 422 | version: "3.2.0" 423 | glob: 424 | dependency: transitive 425 | description: 426 | name: glob 427 | url: "https://pub.dartlang.org" 428 | source: hosted 429 | version: "2.1.0" 430 | go_router: 431 | dependency: "direct main" 432 | description: 433 | name: go_router 434 | url: "https://pub.dartlang.org" 435 | source: hosted 436 | version: "5.2.0" 437 | google_fonts: 438 | dependency: "direct main" 439 | description: 440 | name: google_fonts 441 | url: "https://pub.dartlang.org" 442 | source: hosted 443 | version: "3.0.1" 444 | graphs: 445 | dependency: transitive 446 | description: 447 | name: graphs 448 | url: "https://pub.dartlang.org" 449 | source: hosted 450 | version: "2.1.0" 451 | html: 452 | dependency: transitive 453 | description: 454 | name: html 455 | url: "https://pub.dartlang.org" 456 | source: hosted 457 | version: "0.15.1" 458 | http: 459 | dependency: transitive 460 | description: 461 | name: http 462 | url: "https://pub.dartlang.org" 463 | source: hosted 464 | version: "0.13.5" 465 | http_multi_server: 466 | dependency: transitive 467 | description: 468 | name: http_multi_server 469 | url: "https://pub.dartlang.org" 470 | source: hosted 471 | version: "3.2.1" 472 | http_parser: 473 | dependency: transitive 474 | description: 475 | name: http_parser 476 | url: "https://pub.dartlang.org" 477 | source: hosted 478 | version: "4.0.1" 479 | image: 480 | dependency: transitive 481 | description: 482 | name: image 483 | url: "https://pub.dartlang.org" 484 | source: hosted 485 | version: "3.2.2" 486 | intl: 487 | dependency: "direct main" 488 | description: 489 | name: intl 490 | url: "https://pub.dartlang.org" 491 | source: hosted 492 | version: "0.17.0" 493 | io: 494 | dependency: transitive 495 | description: 496 | name: io 497 | url: "https://pub.dartlang.org" 498 | source: hosted 499 | version: "1.0.3" 500 | js: 501 | dependency: transitive 502 | description: 503 | name: js 504 | url: "https://pub.dartlang.org" 505 | source: hosted 506 | version: "0.6.4" 507 | json_annotation: 508 | dependency: "direct main" 509 | description: 510 | name: json_annotation 511 | url: "https://pub.dartlang.org" 512 | source: hosted 513 | version: "4.7.0" 514 | json_serializable: 515 | dependency: "direct dev" 516 | description: 517 | name: json_serializable 518 | url: "https://pub.dartlang.org" 519 | source: hosted 520 | version: "6.5.4" 521 | lints: 522 | dependency: transitive 523 | description: 524 | name: lints 525 | url: "https://pub.dartlang.org" 526 | source: hosted 527 | version: "2.0.0" 528 | logger: 529 | dependency: transitive 530 | description: 531 | name: logger 532 | url: "https://pub.dartlang.org" 533 | source: hosted 534 | version: "1.1.0" 535 | logging: 536 | dependency: transitive 537 | description: 538 | name: logging 539 | url: "https://pub.dartlang.org" 540 | source: hosted 541 | version: "1.0.2" 542 | lottie: 543 | dependency: transitive 544 | description: 545 | name: lottie 546 | url: "https://pub.dartlang.org" 547 | source: hosted 548 | version: "1.4.3" 549 | matcher: 550 | dependency: transitive 551 | description: 552 | name: matcher 553 | url: "https://pub.dartlang.org" 554 | source: hosted 555 | version: "0.12.12" 556 | material_color_utilities: 557 | dependency: transitive 558 | description: 559 | name: material_color_utilities 560 | url: "https://pub.dartlang.org" 561 | source: hosted 562 | version: "0.1.5" 563 | meta: 564 | dependency: transitive 565 | description: 566 | name: meta 567 | url: "https://pub.dartlang.org" 568 | source: hosted 569 | version: "1.8.0" 570 | mime: 571 | dependency: transitive 572 | description: 573 | name: mime 574 | url: "https://pub.dartlang.org" 575 | source: hosted 576 | version: "1.0.2" 577 | nested: 578 | dependency: transitive 579 | description: 580 | name: nested 581 | url: "https://pub.dartlang.org" 582 | source: hosted 583 | version: "1.0.0" 584 | nm: 585 | dependency: transitive 586 | description: 587 | name: nm 588 | url: "https://pub.dartlang.org" 589 | source: hosted 590 | version: "0.5.0" 591 | package_config: 592 | dependency: transitive 593 | description: 594 | name: package_config 595 | url: "https://pub.dartlang.org" 596 | source: hosted 597 | version: "2.1.0" 598 | path: 599 | dependency: transitive 600 | description: 601 | name: path 602 | url: "https://pub.dartlang.org" 603 | source: hosted 604 | version: "1.8.2" 605 | path_drawing: 606 | dependency: transitive 607 | description: 608 | name: path_drawing 609 | url: "https://pub.dartlang.org" 610 | source: hosted 611 | version: "1.0.1" 612 | path_parsing: 613 | dependency: transitive 614 | description: 615 | name: path_parsing 616 | url: "https://pub.dartlang.org" 617 | source: hosted 618 | version: "1.0.1" 619 | path_provider: 620 | dependency: transitive 621 | description: 622 | name: path_provider 623 | url: "https://pub.dartlang.org" 624 | source: hosted 625 | version: "2.0.11" 626 | path_provider_android: 627 | dependency: transitive 628 | description: 629 | name: path_provider_android 630 | url: "https://pub.dartlang.org" 631 | source: hosted 632 | version: "2.0.21" 633 | path_provider_ios: 634 | dependency: transitive 635 | description: 636 | name: path_provider_ios 637 | url: "https://pub.dartlang.org" 638 | source: hosted 639 | version: "2.0.11" 640 | path_provider_linux: 641 | dependency: transitive 642 | description: 643 | name: path_provider_linux 644 | url: "https://pub.dartlang.org" 645 | source: hosted 646 | version: "2.1.7" 647 | path_provider_macos: 648 | dependency: transitive 649 | description: 650 | name: path_provider_macos 651 | url: "https://pub.dartlang.org" 652 | source: hosted 653 | version: "2.0.6" 654 | path_provider_platform_interface: 655 | dependency: transitive 656 | description: 657 | name: path_provider_platform_interface 658 | url: "https://pub.dartlang.org" 659 | source: hosted 660 | version: "2.0.4" 661 | path_provider_windows: 662 | dependency: transitive 663 | description: 664 | name: path_provider_windows 665 | url: "https://pub.dartlang.org" 666 | source: hosted 667 | version: "2.1.0" 668 | petitparser: 669 | dependency: transitive 670 | description: 671 | name: petitparser 672 | url: "https://pub.dartlang.org" 673 | source: hosted 674 | version: "5.0.0" 675 | platform: 676 | dependency: transitive 677 | description: 678 | name: platform 679 | url: "https://pub.dartlang.org" 680 | source: hosted 681 | version: "3.1.0" 682 | plugin_platform_interface: 683 | dependency: transitive 684 | description: 685 | name: plugin_platform_interface 686 | url: "https://pub.dartlang.org" 687 | source: hosted 688 | version: "2.1.2" 689 | pool: 690 | dependency: transitive 691 | description: 692 | name: pool 693 | url: "https://pub.dartlang.org" 694 | source: hosted 695 | version: "1.5.1" 696 | process: 697 | dependency: transitive 698 | description: 699 | name: process 700 | url: "https://pub.dartlang.org" 701 | source: hosted 702 | version: "4.2.4" 703 | provider: 704 | dependency: "direct main" 705 | description: 706 | name: provider 707 | url: "https://pub.dartlang.org" 708 | source: hosted 709 | version: "6.0.5" 710 | pub_semver: 711 | dependency: transitive 712 | description: 713 | name: pub_semver 714 | url: "https://pub.dartlang.org" 715 | source: hosted 716 | version: "2.1.1" 717 | pubspec_parse: 718 | dependency: transitive 719 | description: 720 | name: pubspec_parse 721 | url: "https://pub.dartlang.org" 722 | source: hosted 723 | version: "1.2.0" 724 | rename: 725 | dependency: "direct dev" 726 | description: 727 | name: rename 728 | url: "https://pub.dartlang.org" 729 | source: hosted 730 | version: "2.0.1" 731 | retry: 732 | dependency: transitive 733 | description: 734 | name: retry 735 | url: "https://pub.dartlang.org" 736 | source: hosted 737 | version: "3.1.0" 738 | riverpod: 739 | dependency: transitive 740 | description: 741 | name: riverpod 742 | url: "https://pub.dartlang.org" 743 | source: hosted 744 | version: "2.1.3" 745 | sembast: 746 | dependency: transitive 747 | description: 748 | name: sembast 749 | url: "https://pub.dartlang.org" 750 | source: hosted 751 | version: "3.3.1" 752 | sensors_plus: 753 | dependency: "direct main" 754 | description: 755 | name: sensors_plus 756 | url: "https://pub.dartlang.org" 757 | source: hosted 758 | version: "1.4.1" 759 | sensors_plus_platform_interface: 760 | dependency: transitive 761 | description: 762 | name: sensors_plus_platform_interface 763 | url: "https://pub.dartlang.org" 764 | source: hosted 765 | version: "1.1.3" 766 | sensors_plus_web: 767 | dependency: transitive 768 | description: 769 | name: sensors_plus_web 770 | url: "https://pub.dartlang.org" 771 | source: hosted 772 | version: "1.1.2" 773 | shared_preferences: 774 | dependency: transitive 775 | description: 776 | name: shared_preferences 777 | url: "https://pub.dartlang.org" 778 | source: hosted 779 | version: "2.0.15" 780 | shared_preferences_android: 781 | dependency: transitive 782 | description: 783 | name: shared_preferences_android 784 | url: "https://pub.dartlang.org" 785 | source: hosted 786 | version: "2.0.12" 787 | shared_preferences_ios: 788 | dependency: transitive 789 | description: 790 | name: shared_preferences_ios 791 | url: "https://pub.dartlang.org" 792 | source: hosted 793 | version: "2.1.1" 794 | shared_preferences_linux: 795 | dependency: transitive 796 | description: 797 | name: shared_preferences_linux 798 | url: "https://pub.dartlang.org" 799 | source: hosted 800 | version: "2.1.1" 801 | shared_preferences_macos: 802 | dependency: transitive 803 | description: 804 | name: shared_preferences_macos 805 | url: "https://pub.dartlang.org" 806 | source: hosted 807 | version: "2.0.4" 808 | shared_preferences_platform_interface: 809 | dependency: transitive 810 | description: 811 | name: shared_preferences_platform_interface 812 | url: "https://pub.dartlang.org" 813 | source: hosted 814 | version: "2.0.0" 815 | shared_preferences_web: 816 | dependency: transitive 817 | description: 818 | name: shared_preferences_web 819 | url: "https://pub.dartlang.org" 820 | source: hosted 821 | version: "2.0.4" 822 | shared_preferences_windows: 823 | dependency: transitive 824 | description: 825 | name: shared_preferences_windows 826 | url: "https://pub.dartlang.org" 827 | source: hosted 828 | version: "2.1.1" 829 | shelf: 830 | dependency: transitive 831 | description: 832 | name: shelf 833 | url: "https://pub.dartlang.org" 834 | source: hosted 835 | version: "1.3.1" 836 | shelf_web_socket: 837 | dependency: transitive 838 | description: 839 | name: shelf_web_socket 840 | url: "https://pub.dartlang.org" 841 | source: hosted 842 | version: "1.0.2" 843 | sizer: 844 | dependency: "direct main" 845 | description: 846 | name: sizer 847 | url: "https://pub.dartlang.org" 848 | source: hosted 849 | version: "2.0.15" 850 | sky_engine: 851 | dependency: transitive 852 | description: flutter 853 | source: sdk 854 | version: "0.0.99" 855 | source_gen: 856 | dependency: transitive 857 | description: 858 | name: source_gen 859 | url: "https://pub.dartlang.org" 860 | source: hosted 861 | version: "1.2.6" 862 | source_helper: 863 | dependency: transitive 864 | description: 865 | name: source_helper 866 | url: "https://pub.dartlang.org" 867 | source: hosted 868 | version: "1.3.3" 869 | source_span: 870 | dependency: transitive 871 | description: 872 | name: source_span 873 | url: "https://pub.dartlang.org" 874 | source: hosted 875 | version: "1.9.0" 876 | stack_trace: 877 | dependency: transitive 878 | description: 879 | name: stack_trace 880 | url: "https://pub.dartlang.org" 881 | source: hosted 882 | version: "1.10.0" 883 | state_notifier: 884 | dependency: transitive 885 | description: 886 | name: state_notifier 887 | url: "https://pub.dartlang.org" 888 | source: hosted 889 | version: "0.7.2+1" 890 | stream_channel: 891 | dependency: transitive 892 | description: 893 | name: stream_channel 894 | url: "https://pub.dartlang.org" 895 | source: hosted 896 | version: "2.1.0" 897 | stream_transform: 898 | dependency: transitive 899 | description: 900 | name: stream_transform 901 | url: "https://pub.dartlang.org" 902 | source: hosted 903 | version: "2.0.0" 904 | string_scanner: 905 | dependency: transitive 906 | description: 907 | name: string_scanner 908 | url: "https://pub.dartlang.org" 909 | source: hosted 910 | version: "1.1.1" 911 | synchronized: 912 | dependency: transitive 913 | description: 914 | name: synchronized 915 | url: "https://pub.dartlang.org" 916 | source: hosted 917 | version: "3.0.0+3" 918 | term_glyph: 919 | dependency: transitive 920 | description: 921 | name: term_glyph 922 | url: "https://pub.dartlang.org" 923 | source: hosted 924 | version: "1.2.1" 925 | test_api: 926 | dependency: transitive 927 | description: 928 | name: test_api 929 | url: "https://pub.dartlang.org" 930 | source: hosted 931 | version: "0.4.12" 932 | timing: 933 | dependency: transitive 934 | description: 935 | name: timing 936 | url: "https://pub.dartlang.org" 937 | source: hosted 938 | version: "1.0.0" 939 | typed_data: 940 | dependency: transitive 941 | description: 942 | name: typed_data 943 | url: "https://pub.dartlang.org" 944 | source: hosted 945 | version: "1.3.1" 946 | universal_io: 947 | dependency: transitive 948 | description: 949 | name: universal_io 950 | url: "https://pub.dartlang.org" 951 | source: hosted 952 | version: "2.0.4" 953 | url_launcher: 954 | dependency: "direct main" 955 | description: 956 | name: url_launcher 957 | url: "https://pub.dartlang.org" 958 | source: hosted 959 | version: "6.1.7" 960 | url_launcher_android: 961 | dependency: transitive 962 | description: 963 | name: url_launcher_android 964 | url: "https://pub.dartlang.org" 965 | source: hosted 966 | version: "6.0.22" 967 | url_launcher_ios: 968 | dependency: transitive 969 | description: 970 | name: url_launcher_ios 971 | url: "https://pub.dartlang.org" 972 | source: hosted 973 | version: "6.0.17" 974 | url_launcher_linux: 975 | dependency: transitive 976 | description: 977 | name: url_launcher_linux 978 | url: "https://pub.dartlang.org" 979 | source: hosted 980 | version: "3.0.1" 981 | url_launcher_macos: 982 | dependency: transitive 983 | description: 984 | name: url_launcher_macos 985 | url: "https://pub.dartlang.org" 986 | source: hosted 987 | version: "3.0.1" 988 | url_launcher_platform_interface: 989 | dependency: transitive 990 | description: 991 | name: url_launcher_platform_interface 992 | url: "https://pub.dartlang.org" 993 | source: hosted 994 | version: "2.1.1" 995 | url_launcher_web: 996 | dependency: transitive 997 | description: 998 | name: url_launcher_web 999 | url: "https://pub.dartlang.org" 1000 | source: hosted 1001 | version: "2.0.13" 1002 | url_launcher_windows: 1003 | dependency: transitive 1004 | description: 1005 | name: url_launcher_windows 1006 | url: "https://pub.dartlang.org" 1007 | source: hosted 1008 | version: "3.0.1" 1009 | vector_math: 1010 | dependency: transitive 1011 | description: 1012 | name: vector_math 1013 | url: "https://pub.dartlang.org" 1014 | source: hosted 1015 | version: "2.1.2" 1016 | vexana: 1017 | dependency: "direct main" 1018 | description: 1019 | name: vexana 1020 | url: "https://pub.dartlang.org" 1021 | source: hosted 1022 | version: "3.0.1" 1023 | watcher: 1024 | dependency: transitive 1025 | description: 1026 | name: watcher 1027 | url: "https://pub.dartlang.org" 1028 | source: hosted 1029 | version: "1.0.1" 1030 | web_socket_channel: 1031 | dependency: transitive 1032 | description: 1033 | name: web_socket_channel 1034 | url: "https://pub.dartlang.org" 1035 | source: hosted 1036 | version: "2.2.0" 1037 | win32: 1038 | dependency: transitive 1039 | description: 1040 | name: win32 1041 | url: "https://pub.dartlang.org" 1042 | source: hosted 1043 | version: "2.7.0" 1044 | xdg_directories: 1045 | dependency: transitive 1046 | description: 1047 | name: xdg_directories 1048 | url: "https://pub.dartlang.org" 1049 | source: hosted 1050 | version: "0.2.0+1" 1051 | xml: 1052 | dependency: transitive 1053 | description: 1054 | name: xml 1055 | url: "https://pub.dartlang.org" 1056 | source: hosted 1057 | version: "6.1.0" 1058 | yaml: 1059 | dependency: transitive 1060 | description: 1061 | name: yaml 1062 | url: "https://pub.dartlang.org" 1063 | source: hosted 1064 | version: "3.1.1" 1065 | sdks: 1066 | dart: ">=2.18.0 <3.0.0" 1067 | flutter: ">=3.3.0" 1068 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_mobile_template 2 | description: Flutter Mobile App Template 3 | 4 | publish_to: 'none' 5 | version: 1.0.0+1 6 | 7 | environment: 8 | sdk: ">=2.17.3 <3.0.0" 9 | 10 | dependencies: 11 | flutter: 12 | sdk: flutter 13 | cupertino_icons: ^1.0.5 14 | 15 | #Text 16 | google_fonts: ^3.0.1 17 | auto_size_text: ^3.0.0 18 | 19 | #Responsive 20 | sizer: ^2.0.15 21 | 22 | #Image 23 | flutter_svg: ^1.1.6 24 | 25 | #Design 26 | sensors_plus: ^1.4.0 27 | 28 | #JsonAnnotation 29 | json_annotation: ^4.7.0 30 | 31 | #Equality Operator 32 | equatable: ^2.0.5 33 | 34 | #Network 35 | vexana: ^3.0.1 36 | url_launcher: ^6.1.6 37 | connectivity_plus: ^2.3.5 38 | 39 | #Locale Storage 40 | flutter_secure_storage: ^6.0.0 41 | 42 | #Navigation 43 | go_router: ^5.1.1 44 | 45 | #Localization 46 | intl: ^0.17.0 47 | easy_localization: ^3.0.1 48 | bot_toast: ^4.0.3 49 | 50 | #State Management 51 | provider: ^6.0.4 52 | flutter_riverpod: ^2.1.3 53 | flutter_bloc: ^8.1.1 54 | 55 | #Native Splash Screen 56 | flutter_native_splash: ^2.2.13 57 | 58 | dev_dependencies: 59 | flutter_test: 60 | sdk: flutter 61 | flutter_lints: ^2.0.1 62 | 63 | # Code generation 64 | build_runner: ^2.2.0 65 | 66 | # Json serialization code generation 67 | json_serializable: ^6.3.1 68 | 69 | # Native Launcher Icons generator 70 | flutter_launcher_icons: ^0.10.0 71 | 72 | # Change app package name/bundle id and app name 73 | change_app_package_name: ^1.1.0 74 | rename: ^2.0.1 75 | 76 | flutter: 77 | uses-material-design: true 78 | 79 | assets: 80 | - assets/images/ 81 | - assets/icons/ 82 | - assets/translations/ -------------------------------------------------------------------------------- /scripts/build.sh: -------------------------------------------------------------------------------- 1 | flutter pub run build_runner watch 2 | 3 | flutter packages pub run build_runner build --delete-conflicting-outputs 4 | 5 | flutter pub run build_runner build 6 | 7 | flutter pub run flutter_native_splash:create 8 | 9 | flutter pub run flutter_launcher_icons:main -------------------------------------------------------------------------------- /test/auth/auth_service_test.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zalisoft-Mobile/flutter-mobile-app-template/08da4b97b86a2bbc58cdc1f20652432be3d47fab/test/auth/auth_service_test.dart --------------------------------------------------------------------------------