diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e93415e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "cSpell.words": [ + "fluttermvvmtemplate", + "vexana" + ] +} \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml index 486705d..df989ed 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1 +1,17 @@ -include: package:pedantic/analysis_options.1.9.0.yaml +include: package:very_good_analysis/analysis_options.yaml + + +analyzer: + exclude: + - "**/*.g.dart" + - "**/*.freezed.dart" + - "test/.test_coverage.dart" + - "bin/cache/**" + - "lib/generated_plugin_registrant.dart" + - test + - assets/translations + +linter: + rules: + public_member_api_docs: false + library_private_types_in_public_api: false \ No newline at end of file diff --git a/android/.gitignore b/android/.gitignore index 0a741cb..6f56801 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -9,3 +9,5 @@ GeneratedPluginRegistrant.java # Remember to never publicly share your keystore. # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app key.properties +**/*.keystore +**/*.jks diff --git a/android/Gemfile b/android/Gemfile deleted file mode 100644 index cdd3a6b..0000000 --- a/android/Gemfile +++ /dev/null @@ -1,6 +0,0 @@ -source "https://rubygems.org" - -gem "fastlane" - -plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') -eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/android/Gemfile.lock b/android/Gemfile.lock deleted file mode 100644 index 21e614e..0000000 --- a/android/Gemfile.lock +++ /dev/null @@ -1,182 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.2) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) - atomos (0.1.3) - aws-eventstream (1.1.0) - aws-partitions (1.363.0) - aws-sdk-core (3.105.0) - aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) - aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-kms (1.37.0) - aws-sdk-core (~> 3, >= 3.99.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.79.1) - aws-sdk-core (~> 3, >= 3.104.3) - aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.2) - aws-eventstream (~> 1, >= 1.0.2) - babosa (1.0.3) - claide (1.0.3) - colored (1.2) - colored2 (3.1.2) - commander-fastlane (4.4.6) - highline (~> 1.7.2) - declarative (0.0.20) - declarative-option (0.1.0) - digest-crc (0.6.1) - rake (~> 13.0) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.6) - emoji_regex (3.0.0) - excon (0.76.0) - faraday (1.0.1) - multipart-post (>= 1.2, < 3) - faraday-cookie_jar (0.0.6) - faraday (>= 0.7.4) - http-cookie (~> 1.0.0) - faraday_middleware (1.0.0) - faraday (~> 1.0) - fastimage (2.2.0) - fastlane (2.157.2) - CFPropertyList (>= 2.3, < 4.0.0) - addressable (>= 2.3, < 3.0.0) - aws-sdk-s3 (~> 1.0) - babosa (>= 1.0.3, < 2.0.0) - bundler (>= 1.12.0, < 3.0.0) - colored - commander-fastlane (>= 4.4.6, < 5.0.0) - dotenv (>= 2.1.1, < 3.0.0) - emoji_regex (>= 0.1, < 4.0) - excon (>= 0.71.0, < 1.0.0) - faraday (~> 1.0) - faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 1.0) - fastimage (>= 2.1.0, < 3.0.0) - gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.37.0, < 0.39.0) - google-cloud-storage (>= 1.15.0, < 2.0.0) - highline (>= 1.7.2, < 2.0.0) - json (< 3.0.0) - jwt (>= 2.1.0, < 3) - mini_magick (>= 4.9.4, < 5.0.0) - multipart-post (~> 2.0.0) - plist (>= 3.1.0, < 4.0.0) - rubyzip (>= 2.0.0, < 3.0.0) - security (= 0.1.3) - simctl (~> 1.6.3) - slack-notifier (>= 2.0.0, < 3.0.0) - terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) - tty-screen (>= 0.6.3, < 1.0.0) - tty-spinner (>= 0.8.0, < 1.0.0) - word_wrap (~> 1.0.0) - xcodeproj (>= 1.13.0, < 2.0.0) - xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-properties (1.1.2) - java-properties - gh_inspector (1.1.3) - google-api-client (0.38.0) - addressable (~> 2.5, >= 2.5.1) - googleauth (~> 0.9) - httpclient (>= 2.8.1, < 3.0) - mini_mime (~> 1.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.0) - signet (~> 0.12) - google-cloud-core (1.5.0) - google-cloud-env (~> 1.0) - google-cloud-errors (~> 1.0) - google-cloud-env (1.3.3) - faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.0.1) - google-cloud-storage (1.28.0) - addressable (~> 2.5) - digest-crc (~> 0.4) - google-api-client (~> 0.33) - google-cloud-core (~> 1.2) - googleauth (~> 0.9) - mini_mime (~> 1.0) - googleauth (0.13.1) - faraday (>= 0.17.3, < 2.0) - jwt (>= 1.4, < 3.0) - memoist (~> 0.16) - multi_json (~> 1.11) - os (>= 0.9, < 2.0) - signet (~> 0.14) - highline (1.7.10) - http-cookie (1.0.3) - domain_name (~> 0.5) - httpclient (2.8.3) - java-properties (0.2.1) - jmespath (1.4.0) - json (2.3.1) - jwt (2.2.2) - memoist (0.16.2) - mini_magick (4.10.1) - mini_mime (1.0.2) - multi_json (1.15.0) - multipart-post (2.0.0) - nanaimo (0.3.0) - naturally (2.2.0) - os (1.1.1) - plist (3.5.0) - public_suffix (4.0.5) - rake (13.0.1) - representable (3.0.4) - declarative (< 0.1.0) - declarative-option (< 0.2.0) - uber (< 0.2.0) - retriable (3.1.2) - rouge (2.0.7) - rubyzip (2.3.0) - security (0.1.3) - signet (0.14.0) - addressable (~> 2.3) - faraday (>= 0.17.3, < 2.0) - jwt (>= 1.5, < 3.0) - multi_json (~> 1.10) - simctl (1.6.8) - CFPropertyList - naturally - slack-notifier (2.3.2) - terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - tty-cursor (0.7.1) - tty-screen (0.8.1) - tty-spinner (0.9.3) - tty-cursor (~> 0.7) - uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.7) - unicode-display_width (1.7.0) - word_wrap (1.0.0) - xcodeproj (1.18.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.3.0) - xcpretty (0.3.0) - rouge (~> 2.0.7) - xcpretty-travis-formatter (1.0.0) - xcpretty (~> 0.2, >= 0.0.7) - -PLATFORMS - ruby - -DEPENDENCIES - fastlane - fastlane-plugin-properties - -BUNDLED WITH - 2.1.4 diff --git a/android/app/build.gradle b/android/app/build.gradle index ab1298c..a2edb70 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -24,46 +24,37 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" -apply plugin: 'com.google.gms.google-services' - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} android { - compileSdkVersion 28 + compileSdkVersion 30 - sourceSets { - main.java.srcDirs += 'src/main/kotlin' + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' } - lintOptions { - disable 'InvalidPackage' + sourceSets { + main.java.srcDirs += 'src/main/kotlin' } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.hwa.fluttermvvmtemplate" - minSdkVersion 19 - targetSdkVersion 29 + applicationId "com.example.sample" + minSdkVersion 16 + targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } - signingConfigs { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword keystoreProperties['storePassword'] - } - } - buildTypes { release { - signingConfig signingConfigs.release + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug } } } @@ -74,6 +65,4 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation platform('com.google.firebase:firebase-bom:29.0.3') - implementation 'com.google.firebase:firebase-analytics' } diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 087c88a..ea27fed 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.example.sample"> diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b3109d8..a0902b1 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,16 +1,10 @@ - - + + + + + + + + diff --git a/android/app/src/main/res/drawable/circle_hwa.png b/android/app/src/main/res/drawable/circle_hwa.png deleted file mode 100644 index 648c07d..0000000 Binary files a/android/app/src/main/res/drawable/circle_hwa.png and /dev/null differ diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index e92ac36..304732f 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -1,10 +1,12 @@ - - + + + + diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..449a9f9 --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/color.xml b/android/app/src/main/res/values/color.xml deleted file mode 100644 index 8cc3f65..0000000 --- a/android/app/src/main/res/values/color.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - #FFFFFF - #FFFF00 - #FF00FF - #FF0000 - #C0C0C0 - #808080 - #808000 - #800080 - #800000 - #00FFFF - #00FF00 - #008080 - #008000 - #0000FF - #000080 - #000000 - \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 1f83a33..d74aa35 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ - - diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 087c88a..ea27fed 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.example.sample"> diff --git a/android/build.gradle b/android/build.gradle index 7b77fc7..ed45c65 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,28 +2,25 @@ buildscript { ext.kotlin_version = '1.3.50' repositories { google() - jcenter() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.10' } } allprojects { repositories { google() - jcenter() + mavenCentral() } } rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { project.evaluationDependsOn(':app') } diff --git a/android/fastlane/Appfile b/android/fastlane/Appfile deleted file mode 100644 index e680c17..0000000 --- a/android/fastlane/Appfile +++ /dev/null @@ -1,2 +0,0 @@ -json_key_file("secret/api-5970835861059463279-389763-87711522f0cb.json") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one -package_name("com.hwa.fluttermvvmtemplate") # e.g. com.krausefx.app diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile deleted file mode 100644 index 9ac0127..0000000 --- a/android/fastlane/Fastfile +++ /dev/null @@ -1,82 +0,0 @@ -# This file contains the fastlane.tools configuration -# You can find the documentation at https://docs.fastlane.tools -# -# For a list of all available actions, check out -# -# https://docs.fastlane.tools/actions -# -# For a list of all available plugins, check out -# -# https://docs.fastlane.tools/plugins/available-plugins -# - -# Uncomment the line if you want fastlane to automatically update itself -# update_fastlane - -default_platform(:android) - -ENV_PATH = "../asset/app/.env" -ANDROID_VERSION_NAME = "androidVersionName" -APP_BUNDLE_PATH = "../build/app/outputs/bundle/release/app-release.aab" -INTERNAL = "internal" - -platform :android do - desc "Deploy to internal test application" - lane :internal do |options| - versionNumberArrayLength = google_play_track_version_codes(track:INTERNAL) - versionNumber = (versionNumberArrayLength.length > 0 ? versionNumberArrayLength[0] : 0).to_i + 1 - incerementVersion version: options[:version] - setVersionNumber versionNumber: options[:versionNumber] - versionName = getVersionName() - flutter_build(versionName,versionNumber) - buildStore(INTERNAL) - end - - private_lane :setVersionNumber do |options| - if options[:versionNumber] != nil - set_properties_value( - key: ANDROID_VERSION_NAME, - path: ENV_PATH, - value: options[:versionNumber] - ) - end - end - - def buildStore(track) - upload_to_play_store( - track: track, - aab: APP_BUNDLE_PATH - ) - end - - private_lane :incerementVersion do |options| - if options[:version] != nil - increment_version_name_in_properties_file( - key: ANDROID_VERSION_NAME, - path: ENV_PATH, - update_type: options[:version] - ) - end - end - - def getVersionName - return get_properties_value( - key: ANDROID_VERSION_NAME, - path: ENV_PATH - ) - end - - def flutter_build(versionName,number) - - Dir.chdir '../../' do - sh('flutter', 'packages', 'get') - sh('flutter', 'clean') - sh( - "flutter build appbundle --build-name=#{ - versionName - } --build-number=#{number.to_s}" - ) - end - end - -end diff --git a/android/fastlane/Pluginfile b/android/fastlane/Pluginfile deleted file mode 100644 index e735758..0000000 --- a/android/fastlane/Pluginfile +++ /dev/null @@ -1,5 +0,0 @@ -# Autogenerated by fastlane -# -# Ensure this file is checked in to source control! - -gem 'fastlane-plugin-properties' diff --git a/android/fastlane/README.md b/android/fastlane/README.md deleted file mode 100644 index 69d8103..0000000 --- a/android/fastlane/README.md +++ /dev/null @@ -1,29 +0,0 @@ -fastlane documentation -================ -# Installation - -Make sure you have the latest version of the Xcode command line tools installed: - -``` -xcode-select --install -``` - -Install _fastlane_ using -``` -[sudo] gem install fastlane -NV -``` -or alternatively using `brew install fastlane` - -# Available Actions -## Android -### android internal -``` -fastlane android internal -``` -Deploy to internal test application - ----- - -This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. -More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). -The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/android/fastlane/report.xml b/android/fastlane/report.xml deleted file mode 100644 index e02b38f..0000000 --- a/android/fastlane/report.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/android/gradle.properties b/android/gradle.properties index 38c8d45..94adc3a 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,3 @@ org.gradle.jvmargs=-Xmx1536M -android.enableR8=true android.useAndroidX=true android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 90f271d..bc6a58a 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index d3b6a40..44e62bc 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,7 +1,3 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - include ':app' def localPropertiesFile = new File(rootProject.projectDir, "local.properties") diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 6b4c0f7..4f8d4d2 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 8.0 + 11.0 diff --git a/ios/Podfile b/ios/Podfile index 1e8c3c9..bd78433 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,17 +1,17 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +# platform :ios, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' +ENV["COCOAPODS_DISABLE_STATS"] = "true" -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, +project "Runner", { + "Debug" => :debug, + "Profile" => :release, + "Release" => :release, } def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + generated_xcode_build_settings_path = File.expand_path(File.join("..", "Flutter", "Generated.xcconfig"), __FILE__) unless File.exist?(generated_xcode_build_settings_path) raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" end @@ -23,11 +23,11 @@ def flutter_root raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" end -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) +require File.expand_path(File.join("packages", "flutter_tools", "bin", "podhelper"), flutter_root) flutter_ios_podfile_setup -target 'Runner' do +target "Runner" do use_frameworks! use_modular_headers! diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 69b339b..82c022e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,73 +1,197 @@ PODS: + - connectivity_plus (0.0.1): + - Flutter + - ReachabilitySwift - device_info (0.0.1): - Flutter + - Firebase/Analytics (10.0.0): + - Firebase/Core + - Firebase/Core (10.0.0): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 10.0.0) + - Firebase/CoreOnly (10.0.0): + - FirebaseCore (= 10.0.0) + - firebase_analytics (10.0.3): + - Firebase/Analytics (= 10.0.0) + - firebase_core + - Flutter + - firebase_core (2.1.1): + - Firebase/CoreOnly (= 10.0.0) + - Flutter + - FirebaseAnalytics (10.0.0): + - FirebaseAnalytics/AdIdSupport (= 10.0.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.0.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.0.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseCore (10.0.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Logger (~> 7.8) + - FirebaseCoreInternal (10.1.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.1.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) - Flutter (1.0.0) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) - - package_info (0.0.1): + - GoogleAppMeasurement (10.0.0): + - GoogleAppMeasurement/AdIdSupport (= 10.0.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.0.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.0.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.0.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleUtilities/AppDelegateSwizzler (7.8.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.8.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.8.0): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (7.8.0): + - GoogleUtilities/Logger + - GoogleUtilities/Network (7.8.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.8.0)" + - GoogleUtilities/Reachability (7.8.0): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.8.0): + - GoogleUtilities/Logger + - nanopb (2.30909.0): + - nanopb/decode (= 2.30909.0) + - nanopb/encode (= 2.30909.0) + - nanopb/decode (2.30909.0) + - nanopb/encode (2.30909.0) + - package_info_plus (0.4.5): - Flutter - - path_provider (0.0.1): + - path_provider_ios (0.0.1): - Flutter + - PromisesObjC (2.1.1) + - ReachabilitySwift (5.0.0) - share (0.0.1): - Flutter - - shared_preferences (0.0.1): + - shared_preferences_ios (0.0.1): - Flutter - sqflite (0.0.2): - Flutter - FMDB (>= 2.7.5) - - url_launcher (0.0.1): + - url_launcher_ios (0.0.1): - Flutter - - webview_flutter (0.0.1): + - webview_flutter_wkwebview (0.0.1): - Flutter DEPENDENCIES: + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - device_info (from `.symlinks/plugins/device_info/ios`) + - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - Flutter (from `Flutter`) - - package_info (from `.symlinks/plugins/package_info/ios`) - - path_provider (from `.symlinks/plugins/path_provider/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - share (from `.symlinks/plugins/share/ios`) - - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) + - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - - url_launcher (from `.symlinks/plugins/url_launcher/ios`) - - webview_flutter (from `.symlinks/plugins/webview_flutter/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) SPEC REPOS: trunk: + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreInternal + - FirebaseInstallations - FMDB + - GoogleAppMeasurement + - GoogleUtilities + - nanopb + - PromisesObjC + - ReachabilitySwift EXTERNAL SOURCES: + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/ios" device_info: :path: ".symlinks/plugins/device_info/ios" + firebase_analytics: + :path: ".symlinks/plugins/firebase_analytics/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" Flutter: :path: Flutter - package_info: - :path: ".symlinks/plugins/package_info/ios" - path_provider: - :path: ".symlinks/plugins/path_provider/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" share: :path: ".symlinks/plugins/share/ios" - shared_preferences: - :path: ".symlinks/plugins/shared_preferences/ios" + shared_preferences_ios: + :path: ".symlinks/plugins/shared_preferences_ios/ios" sqflite: :path: ".symlinks/plugins/sqflite/ios" - url_launcher: - :path: ".symlinks/plugins/url_launcher/ios" - webview_flutter: - :path: ".symlinks/plugins/webview_flutter/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" SPEC CHECKSUMS: + connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 - Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c + Firebase: 1b810f3d0c0532e27a48f1961f8c0400a668a2cf + firebase_analytics: ed8e5198c08a3ec3f5e1dd150dd4db07d7871e5b + firebase_core: 5c0bb0ca7d0e70480a68a6e9ad9bf55d1edd5305 + FirebaseAnalytics: 9921a52739f4ab66099da31b6e0243db78a3ac0a + FirebaseCore: 97f48a3a567a72b8d4daa0f03c3aadb78df4e995 + FirebaseCoreInternal: 96d75228e10fd369564da51bd898414eb0f54df5 + FirebaseInstallations: 99d24bac0243cf8b0e96cf5426340d211f0bcc80 + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c + GoogleAppMeasurement: 7e48a3249792ac35d6f18f107f63f199a7e9d0ce + GoogleUtilities: 1d20a6ad97ef46f67bbdec158ce00563a671ebb7 + nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 + package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e + path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 + PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb + ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 share: 0b2c3e82132f5888bccca3351c504d0003b3b410 - shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d + shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 - url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef - webview_flutter: 9f491a9b5a66f2573946a389b2677987b0ff8c0b + url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de + webview_flutter_wkwebview: b7e70ef1ddded7e69c796c7390ee74180182971f -PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c +PODFILE CHECKSUM: d593491b71aba1c29d8ba5ad656bfb19f7093630 -COCOAPODS: 1.10.1 +COCOAPODS: 1.11.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 62fb9ef..83a1ef9 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -155,7 +155,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -339,7 +339,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -429,7 +429,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -478,7 +478,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140c..3db53b6 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ en tr + CADisableMinimumFrameDurationOnPhone + diff --git a/lib/core/base/model/base_error.dart b/lib/core/base/model/base_error.dart index 4ba0682..e058e4e 100644 --- a/lib/core/base/model/base_error.dart +++ b/lib/core/base/model/base_error.dart @@ -1,7 +1,6 @@ -import '../../init/network/IResponseModel.dart'; - -class BaseError extends IErrorModel { - final String message; +import 'package:fluttermvvmtemplate/core/init/network/IResponseModel.dart'; +class BaseError extends IErrorModel { BaseError(this.message); + final String message; } diff --git a/lib/core/base/model/base_view_model.dart b/lib/core/base/model/base_view_model.dart index 873b2aa..64c97a9 100644 --- a/lib/core/base/model/base_view_model.dart +++ b/lib/core/base/model/base_view_model.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; -import '../../init/cache/locale_manager.dart'; -import '../../init/navigation/navigation_service.dart'; -import '../../init/network/ICoreDio.dart'; -import '../../init/network/network_manager.dart'; -import '../../init/network/vexana_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/cache/locale_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/navigation/navigation_service.dart'; +import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart'; +import 'package:fluttermvvmtemplate/core/init/network/network_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/network/vexana_manager.dart'; abstract class BaseViewModel { - BuildContext? context; + late BuildContext viewModelContext; ICoreDioNullSafety? coreDio = NetworkManager.instance!.coreDio; VexanaManager? vexanaManager = VexanaManager.instance; diff --git a/lib/core/base/view/base_widget.dart b/lib/core/base/view/base_widget.dart index 6156fc5..bdfe340 100644 --- a/lib/core/base/view/base_widget.dart +++ b/lib/core/base/view/base_widget.dart @@ -2,13 +2,18 @@ import 'package:flutter/material.dart'; import 'package:mobx/mobx.dart'; class BaseView extends StatefulWidget { + const BaseView({ + Key? key, + required this.viewModel, + required this.onPageBuilder, + required this.onModelReady, + this.onDispose, + }) : super(key: key); final Widget Function(BuildContext context, T value) onPageBuilder; final T viewModel; - final Function(T model) onModelReady; + final void Function(T model) onModelReady; final VoidCallback? onDispose; - const BaseView({Key? key, required this.viewModel, required this.onPageBuilder, required this.onModelReady, this.onDispose}) : super(key: key); - @override _BaseViewState createState() => _BaseViewState(); } @@ -25,7 +30,7 @@ class _BaseViewState extends State> { @override void dispose() { super.dispose(); - if (widget.onDispose != null) widget.onDispose!(); + if (widget.onDispose != null) widget.onDispose?.call(); } @override diff --git a/lib/core/constants/app/app_constants.dart b/lib/core/constants/app/app_constants.dart index 044dc60..daa94ad 100644 --- a/lib/core/constants/app/app_constants.dart +++ b/lib/core/constants/app/app_constants.dart @@ -1,3 +1,5 @@ +// ignore_for_file: constant_identifier_names + class ApplicationConstants { static const COMPANY_NAME = 'HWA'; diff --git a/lib/core/constants/image/image_constatns.dart b/lib/core/constants/image/image_constatns.dart index 6f942d3..479ef75 100644 --- a/lib/core/constants/image/image_constatns.dart +++ b/lib/core/constants/image/image_constatns.dart @@ -1,10 +1,10 @@ class ImageConstants { + + ImageConstants._init(); static ImageConstants? _instace; static ImageConstants get instance => _instace ??= ImageConstants._init(); - ImageConstants._init(); - String get logo => toPng('veli'); String get hotDog => toPng('hotdogs'); diff --git a/lib/core/constants/navigation/navigation_constants.dart b/lib/core/constants/navigation/navigation_constants.dart index 75bac31..b33b232 100644 --- a/lib/core/constants/navigation/navigation_constants.dart +++ b/lib/core/constants/navigation/navigation_constants.dart @@ -1,3 +1,5 @@ +// ignore_for_file: constant_identifier_names + class NavigationConstants { static const TEST_VIEW = '/test'; static const DEFAULT = '/'; diff --git a/lib/core/extension/context_extension.dart b/lib/core/extension/context_extension.dart index b6eb43e..4abfa83 100644 --- a/lib/core/extension/context_extension.dart +++ b/lib/core/extension/context_extension.dart @@ -53,6 +53,6 @@ extension PageExtension on BuildContext { } extension DurationExtension on BuildContext { - Duration get lowDuration => Duration(milliseconds: 500); - Duration get normalDuration => Duration(seconds: 1); + Duration get lowDuration => const Duration(milliseconds: 500); + Duration get normalDuration => const Duration(seconds: 1); } diff --git a/lib/core/extension/network_exntension.dart b/lib/core/extension/network_exntension.dart index e7b97aa..29a78a1 100644 --- a/lib/core/extension/network_exntension.dart +++ b/lib/core/extension/network_exntension.dart @@ -1,4 +1,4 @@ -import '../constants/enums/http_request_enum.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart'; extension NetworkTypeExtension on HttpTypes? { String get rawValue { diff --git a/lib/core/extension/string_extension.dart b/lib/core/extension/string_extension.dart index 6fe1596..d1a5670 100644 --- a/lib/core/extension/string_extension.dart +++ b/lib/core/extension/string_extension.dart @@ -1,6 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; -import '../constants/app/app_constants.dart'; +import 'package:fluttermvvmtemplate/core/constants/app/app_constants.dart'; extension StringLocalization on String { String get locale => this.tr(); diff --git a/lib/core/init/analytics/analytics_manager.dart b/lib/core/init/analytics/analytics_manager.dart index 10d7fcb..0d34b25 100644 --- a/lib/core/init/analytics/analytics_manager.dart +++ b/lib/core/init/analytics/analytics_manager.dart @@ -2,12 +2,12 @@ import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:flutter/material.dart'; import 'package:fluttermvvmtemplate/core/constants/app/app_constants.dart'; -class AnalytcisManager { - static final AnalytcisManager _instance = AnalytcisManager._init(); - static AnalytcisManager get instance => _instance; - AnalytcisManager._init() { +class AnalyticsManager { + AnalyticsManager._init() { init(); } + static final AnalyticsManager _instance = AnalyticsManager._init(); + static AnalyticsManager get instance => _instance; static final _analytics = FirebaseAnalytics.instance; diff --git a/lib/core/init/cache/locale_manager.dart b/lib/core/init/cache/locale_manager.dart index 6c1ea96..bdd81bc 100644 --- a/lib/core/init/cache/locale_manager.dart +++ b/lib/core/init/cache/locale_manager.dart @@ -1,18 +1,16 @@ +import 'package:fluttermvvmtemplate/core/constants/enums/locale_keys_enum.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../../constants/enums/locale_keys_enum.dart'; - class LocaleManager { - static final LocaleManager _instance = LocaleManager._init(); - - SharedPreferences? _preferences; - static LocaleManager get instance => _instance; - LocaleManager._init() { SharedPreferences.getInstance().then((value) { _preferences = value; }); } + static final LocaleManager _instance = LocaleManager._init(); + + SharedPreferences? _preferences; + static LocaleManager get instance => _instance; static Future prefrencesInit() async { instance._preferences ??= await SharedPreferences.getInstance(); } @@ -36,9 +34,7 @@ class LocaleManager { await _preferences!.setBool(key.toString(), value); } - String getStringValue(PreferencesKeys key) => - _preferences?.getString(key.toString()) ?? ''; + String getStringValue(PreferencesKeys key) => _preferences?.getString(key.toString()) ?? ''; - bool getBoolValue(PreferencesKeys key) => - _preferences!.getBool(key.toString()) ?? false; + bool getBoolValue(PreferencesKeys key) => _preferences!.getBool(key.toString()) ?? false; } diff --git a/lib/core/init/lang/language_manager.dart b/lib/core/init/lang/language_manager.dart index a946053..474a16d 100644 --- a/lib/core/init/lang/language_manager.dart +++ b/lib/core/init/lang/language_manager.dart @@ -1,16 +1,16 @@ import 'package:flutter/material.dart'; class LanguageManager { + + LanguageManager._init(); static LanguageManager? _instance; static LanguageManager get instance { _instance ??= LanguageManager._init(); return _instance!; } - LanguageManager._init(); - - final enLocale = Locale('en', 'US'); - final trLocale = Locale('tr', 'TR'); + final enLocale = const Locale('en', 'US'); + final trLocale = const Locale('tr', 'TR'); List get supportedLocales => [enLocale, trLocale]; } diff --git a/lib/core/init/lang/locale_keys.g.dart b/lib/core/init/lang/locale_keys.g.dart index 7ea0b4b..3c43d2b 100644 --- a/lib/core/init/lang/locale_keys.g.dart +++ b/lib/core/init/lang/locale_keys.g.dart @@ -1,6 +1,6 @@ // DO NOT EDIT. This is code generated via package:easy_localization/generate.dart -abstract class LocaleKeys { +abstract class LocaleKeys { static const welcome = 'welcome'; static const onBoard_page1_title = 'onBoard.page1.title'; static const onBoard_page1_desc = 'onBoard.page1.desc'; @@ -64,5 +64,4 @@ abstract class LocaleKeys { static const home_setting_applicationTour = 'home.setting.applicationTour'; static const home_setting = 'home.setting'; static const home = 'home'; - } diff --git a/lib/core/init/navigation/navigation_route.dart b/lib/core/init/navigation/navigation_route.dart index b74b539..5644208 100644 --- a/lib/core/init/navigation/navigation_route.dart +++ b/lib/core/init/navigation/navigation_route.dart @@ -1,35 +1,32 @@ import 'package:all_of_template/features/buy_view.dart'; +import 'package:architecture_widgets/src/card/not_found_navigation_widget.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; +import 'package:fluttermvvmtemplate/core/constants/navigation/navigation_constants.dart'; +import 'package:fluttermvvmtemplate/product/exception/navigate_model_not_found.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/onboard/view/on_board_view.dart'; import 'package:fluttermvvmtemplate/view/authenticate/splash/view/splash_view.dart'; - -import '../../../product/exception/navigate_model_not_found.dart'; -import '../../../view/authenticate/onboard/view/on_board_view.dart'; -import '../../../view/authenticate/test/view/test_view.dart'; -import '../../../view/settings/model/settings_dynamic.dart'; -import '../../../view/settings/view/subview/settings_dynamic_view.dart'; -import 'package:architecture_widgets/src/card/not_found_navigation_widget.dart'; -import '../../constants/navigation/navigation_constants.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/test/view/test_view.dart'; +import 'package:fluttermvvmtemplate/view/settings/model/settings_dynamic.dart'; +import 'package:fluttermvvmtemplate/view/settings/view/subview/settings_dynamic_view.dart'; class NavigationRoute { + NavigationRoute._init(); static final NavigationRoute _instance = NavigationRoute._init(); static NavigationRoute get instance => _instance; - NavigationRoute._init(); - Route generateRoute(RouteSettings args) { switch (args.name) { case NavigationConstants.DEFAULT: - return normalNavigate(SplashView(), NavigationConstants.DEFAULT); + return normalNavigate(const SplashView(), NavigationConstants.DEFAULT); case NavigationConstants.TEST_VIEW: return normalNavigate(TestsView(), NavigationConstants.TEST_VIEW); case NavigationConstants.BUY_VIEW: - return normalNavigate(BuyView(), NavigationConstants.BUY_VIEW); + return normalNavigate(const BuyView(), NavigationConstants.BUY_VIEW); case NavigationConstants.ON_BOARD: - return normalNavigate(OnBoardView(), NavigationConstants.ON_BOARD); + return normalNavigate(const OnBoardView(), NavigationConstants.ON_BOARD); case NavigationConstants.SETTINGS_WEB_VIEW: if (args.arguments is SettingsDynamicModel) { @@ -42,15 +39,16 @@ class NavigationRoute { default: return MaterialPageRoute( - builder: (context) => NotFoundNavigationWidget(), + builder: (context) => const NotFoundNavigationWidget(), ); } } MaterialPageRoute normalNavigate(Widget widget, String pageName) { return MaterialPageRoute( - builder: (context) => widget, - //analytciste görülecek olan sayfa ismi için pageName veriyoruz - settings: RouteSettings(name: pageName)); + builder: (context) => widget, + //analytciste görülecek olan sayfa ismi için pageName veriyoruz + settings: RouteSettings(name: pageName), + ); } } diff --git a/lib/core/init/navigation/navigation_service.dart b/lib/core/init/navigation/navigation_service.dart index 0d14b53..11613ed 100644 --- a/lib/core/init/navigation/navigation_service.dart +++ b/lib/core/init/navigation/navigation_service.dart @@ -1,13 +1,12 @@ import 'package:flutter/cupertino.dart'; -import 'INavigationService.dart'; +import 'package:fluttermvvmtemplate/core/init/navigation/INavigationService.dart'; class NavigationService implements INavigationService { + NavigationService._init(); static final NavigationService _instance = NavigationService._init(); static NavigationService get instance => _instance; - NavigationService._init(); - GlobalKey navigatorKey = GlobalKey(); final removeAllOldRoutes = (Route route) => false; diff --git a/lib/core/init/network/ICoreDio.dart b/lib/core/init/network/ICoreDio.dart index dd349cd..10cde4f 100644 --- a/lib/core/init/network/ICoreDio.dart +++ b/lib/core/init/network/ICoreDio.dart @@ -1,41 +1,49 @@ -import '../../base/model/base_model.dart'; -import '../../constants/enums/http_request_enum.dart'; -import 'IResponseModel.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_model.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart'; +import 'package:fluttermvvmtemplate/core/init/network/IResponseModel.dart'; abstract class ICoreDio { - Future> fetch(String path, - {required HttpTypes type, - required T parseModel, - dynamic data, - Map? queryParameters, - void Function(int, int)? onReceiveProgress}); + Future> fetch( + String path, { + required HttpTypes type, + required T parseModel, + dynamic data, + Map? queryParameters, + void Function(int, int)? onReceiveProgress, + }); } // MARK: Null SAfety abstract class ICoreDioNullSafety { - Future> send(String path, - {required HttpTypes type, - required T parseModel, - dynamic data, - Map? queryParameters, - void Function(int, int)? onReceiveProgress}); + Future> send( + String path, { + required HttpTypes type, + required BaseModel parseModel, + dynamic data, + Map? queryParameters, + void Function(int, int)? onReceiveProgress, + }); } abstract class ICoreDioFull extends ICoreDio { - Future> fetchNoNetwork(String path, - {required HttpTypes type, - required T parseModel, - dynamic data, - Map? queryParameters, - void Function(int, int)? onReceiveProgress}); + Future> fetchNoNetwork( + String path, { + required HttpTypes type, + required T parseModel, + dynamic data, + Map? queryParameters, + void Function(int, int)? onReceiveProgress, + }); } // MARK: Nul SAfety abstract class ICoreDioFullNulSafetyFull extends ICoreDioNullSafety { - Future> fetchNoNetwork(String path, - {required HttpTypes type, - required T parseModel, - dynamic data, - Map? queryParameters, - void Function(int, int)? onReceiveProgress}); + Future> fetchNoNetwork( + String path, { + required HttpTypes type, + required T parseModel, + dynamic data, + Map? queryParameters, + void Function(int, int)? onReceiveProgress, + }); } diff --git a/lib/core/init/network/IResponseModel.dart b/lib/core/init/network/IResponseModel.dart index 18cbc71..1a8e63d 100644 --- a/lib/core/init/network/IResponseModel.dart +++ b/lib/core/init/network/IResponseModel.dart @@ -8,10 +8,10 @@ abstract class IErrorModel { } class ResponseModel extends IResponseModel { + + ResponseModel({this.data, this.error}); @override final T? data; @override final IErrorModel? error; - - ResponseModel({this.data, this.error}); } diff --git a/lib/core/init/network/core_dio.dart b/lib/core/init/network/core_dio.dart index 41937fb..34cf89e 100644 --- a/lib/core/init/network/core_dio.dart +++ b/lib/core/init/network/core_dio.dart @@ -3,33 +3,40 @@ import 'dart:io'; import 'package:dio/adapter.dart'; import 'package:dio/dio.dart'; -import '../../base/model/base_error.dart'; -import '../../base/model/base_model.dart'; -import '../../constants/enums/http_request_enum.dart'; -import '../../extension/network_exntension.dart'; -import 'ICoreDio.dart'; -import 'IResponseModel.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_error.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_model.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart'; +import 'package:fluttermvvmtemplate/core/extension/network_exntension.dart'; +import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart'; +import 'package:fluttermvvmtemplate/core/init/network/IResponseModel.dart'; part './network_core/core_operations.dart'; class CoreDio with DioMixin implements Dio, ICoreDioNullSafety { - @override - final BaseOptions options; - CoreDio(this.options) { options = options; interceptors.add(InterceptorsWrapper()); httpClientAdapter = DefaultHttpClientAdapter(); } + @override + final BaseOptions options; @override - Future> send(String path, - {required HttpTypes type, - required T parseModel, - dynamic data, - Map? queryParameters, - void Function(int, int)? onReceiveProgress}) async { - final response = await request(path, data: data, options: Options(method: type.rawValue)); + Future> send( + String path, { + required HttpTypes type, + required BaseModel parseModel, + dynamic data, + Map? queryParameters, + void Function(int, int)? onReceiveProgress, + }) async { + final response = await request( + path, + data: data, + options: Options( + method: type.rawValue, + ), + ); switch (response.statusCode) { case HttpStatus.ok: case HttpStatus.accepted: diff --git a/lib/core/init/network/network_core/core_operations.dart b/lib/core/init/network/network_core/core_operations.dart index 4715f0e..188f44d 100644 --- a/lib/core/init/network/network_core/core_operations.dart +++ b/lib/core/init/network/network_core/core_operations.dart @@ -1,8 +1,8 @@ part of '../core_dio.dart'; extension _CoreDioOperations on CoreDio { - R? _responseParser(BaseModel model, dynamic data) { - if (data is List) { + R? _responseParser(BaseModel model, dynamic data) { + if (data is List>) { return data.map((e) => model.fromJson(e)).toList().cast() as R; } else if (data is Map) { return model.fromJson(data as Map) as R; diff --git a/lib/core/init/network/network_manager.dart b/lib/core/init/network/network_manager.dart index 5b367d2..a57853c 100644 --- a/lib/core/init/network/network_manager.dart +++ b/lib/core/init/network/network_manager.dart @@ -1,22 +1,16 @@ import 'package:dio/dio.dart'; -import '../../constants/enums/locale_keys_enum.dart'; -import '../cache/locale_manager.dart'; -import 'ICoreDio.dart'; -import 'core_dio.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/locale_keys_enum.dart'; +import 'package:fluttermvvmtemplate/core/init/cache/locale_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart'; +import 'package:fluttermvvmtemplate/core/init/network/core_dio.dart'; class NetworkManager { - static NetworkManager? _instance; - static NetworkManager? get instance { - _instance ??= NetworkManager._init(); - return _instance; - } - - ICoreDioNullSafety? coreDio; - NetworkManager._init() { - final baseOptions = - BaseOptions(baseUrl: 'https://jsonplaceholder.typicode.com/', headers: {'val': LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN)}); + final baseOptions = BaseOptions( + baseUrl: 'https://jsonplaceholder.typicode.com/', + headers: {'val': LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN)}, + ); // _dio = Dio(baseOptions); coreDio = CoreDio(baseOptions); @@ -30,4 +24,11 @@ class NetworkManager { // }, // )); } + static NetworkManager? _instance; + static NetworkManager? get instance { + _instance ??= NetworkManager._init(); + return _instance; + } + + ICoreDioNullSafety? coreDio; } diff --git a/lib/core/init/network/vexana_manager.dart b/lib/core/init/network/vexana_manager.dart index 4a3843f..98a6e22 100644 --- a/lib/core/init/network/vexana_manager.dart +++ b/lib/core/init/network/vexana_manager.dart @@ -3,6 +3,8 @@ import 'dart:io'; import 'package:vexana/vexana.dart'; class VexanaManager { + + VexanaManager._init(); static VexanaManager? _instace; static VexanaManager get instance { if (_instace != null) return _instace!; @@ -13,8 +15,6 @@ class VexanaManager { static const String _iosBaseUrl = 'http://localhost:3000/'; static const String _androidBaseUrl = 'http://10.0.2.2:3000/'; - VexanaManager._init(); - INetworkManager networkManager = NetworkManager(isEnableLogger: true, options: BaseOptions(baseUrl: Platform.isAndroid ? _androidBaseUrl : _iosBaseUrl)); } diff --git a/lib/core/init/notifier/provider_list.dart b/lib/core/init/notifier/provider_list.dart index 074a413..528d3bc 100644 --- a/lib/core/init/notifier/provider_list.dart +++ b/lib/core/init/notifier/provider_list.dart @@ -1,18 +1,16 @@ +import 'package:fluttermvvmtemplate/core/init/navigation/navigation_service.dart'; +import 'package:fluttermvvmtemplate/core/init/notifier/theme_notifer.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; -import '../navigation/navigation_service.dart'; -import 'theme_notifer.dart'; - class ApplicationProvider { + ApplicationProvider._init(); static ApplicationProvider? _instance; static ApplicationProvider get instance { _instance ??= ApplicationProvider._init(); return _instance!; } - ApplicationProvider._init(); - List singleItems = []; List dependItems = [ ChangeNotifierProvider( diff --git a/lib/core/init/notifier/theme_notifer.dart b/lib/core/init/notifier/theme_notifer.dart index 815532f..8fa2c8e 100644 --- a/lib/core/init/notifier/theme_notifer.dart +++ b/lib/core/init/notifier/theme_notifer.dart @@ -1,7 +1,7 @@ import 'package:architecture_theme/theme/app_theme_light.dart'; import 'package:flutter/material.dart'; -import '../../constants/enums/app_theme_enum.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/app_theme_enum.dart'; class ThemeNotifier extends ChangeNotifier { ThemeData _currentTheme = AppThemeLight.instance.theme; @@ -30,7 +30,6 @@ class ThemeNotifier extends ChangeNotifier { _currenThemeEnum = AppThemes.DARK; } else { _currentTheme = AppThemeLight.instance.theme; - ; _currenThemeEnum = AppThemes.LIGHT; } notifyListeners(); diff --git a/lib/core/init/theme/light/color_scheme_light.dart b/lib/core/init/theme/light/color_scheme_light.dart index d2427a9..6a49550 100644 --- a/lib/core/init/theme/light/color_scheme_light.dart +++ b/lib/core/init/theme/light/color_scheme_light.dart @@ -1,21 +1,21 @@ import 'package:flutter/material.dart'; class ColorSchemeLight { + + ColorSchemeLight._init(); static ColorSchemeLight? _instace; static ColorSchemeLight? get instance { - if (_instace == null) _instace = ColorSchemeLight._init(); + _instace ??= ColorSchemeLight._init(); return _instace; } - ColorSchemeLight._init(); - - final Color brown = Color(0xffa87e6f); - final Color red = Color(0xffc10e0e); - final Color white = Color(0xffffffff); - final Color gray = Color(0xffa5a6ae); - final Color lightGray = Color(0xfff7f7f7); - final Color darkGray = Color(0xff676870); - final Color black = Color(0xff020306); + final Color brown = const Color(0xffa87e6f); + final Color red = const Color(0xffc10e0e); + final Color white = const Color(0xffffffff); + final Color gray = const Color(0xffa5a6ae); + final Color lightGray = const Color(0xfff7f7f7); + final Color darkGray = const Color(0xff676870); + final Color black = const Color(0xff020306); - final Color azure = Color(0xff27928d); + final Color azure = const Color(0xff27928d); } diff --git a/lib/core/init/theme/light/light_theme_interface.dart b/lib/core/init/theme/light/light_theme_interface.dart index 76f3d81..3c05e73 100644 --- a/lib/core/init/theme/light/light_theme_interface.dart +++ b/lib/core/init/theme/light/light_theme_interface.dart @@ -1,6 +1,6 @@ -import 'color_scheme_light.dart'; -import 'padding_insets.dart'; -import 'text_theme_light.dart'; +import 'package:fluttermvvmtemplate/core/init/theme/light/color_scheme_light.dart'; +import 'package:fluttermvvmtemplate/core/init/theme/light/padding_insets.dart'; +import 'package:fluttermvvmtemplate/core/init/theme/light/text_theme_light.dart'; abstract class ILightTheme { TextThemeLight? textThemeLight = TextThemeLight.instance; diff --git a/lib/core/init/theme/light/padding_insets.dart b/lib/core/init/theme/light/padding_insets.dart index a1b6f74..01affe7 100644 --- a/lib/core/init/theme/light/padding_insets.dart +++ b/lib/core/init/theme/light/padding_insets.dart @@ -1,5 +1,5 @@ import 'package:flutter/rendering.dart'; class PaddingInsets { - final lowPaddingAll = EdgeInsets.all(5); + final lowPaddingAll = const EdgeInsets.all(5); } diff --git a/lib/core/init/theme/light/text_theme_light.dart b/lib/core/init/theme/light/text_theme_light.dart index 40b87af..3c824f2 100644 --- a/lib/core/init/theme/light/text_theme_light.dart +++ b/lib/core/init/theme/light/text_theme_light.dart @@ -1,18 +1,39 @@ import 'package:flutter/material.dart'; class TextThemeLight { - static TextThemeLight? _instace; + TextThemeLight._init(); + static TextThemeLight? _instance; static TextThemeLight? get instance { - if (_instace == null) _instace = TextThemeLight._init(); - return _instace; + _instance ??= TextThemeLight._init(); + return _instance; } - TextThemeLight._init(); - - final TextStyle headline1 = TextStyle(fontSize: 96, fontWeight: FontWeight.w300, letterSpacing: -1.5); - final TextStyle headline2 = TextStyle(fontSize: 60, fontWeight: FontWeight.w300, letterSpacing: -0.5); - final TextStyle headline3 = TextStyle(fontSize: 48, fontWeight: FontWeight.w400); - final TextStyle headline4 = TextStyle(fontSize: 34, fontWeight: FontWeight.w400, letterSpacing: 0.25); - final TextStyle headline5 = TextStyle(fontSize: 24, fontWeight: FontWeight.w400); - final TextStyle overline = TextStyle(fontSize: 10, fontWeight: FontWeight.w400, letterSpacing: 1.5); + final TextStyle headline1 = const TextStyle( + fontSize: 96, + fontWeight: FontWeight.w300, + letterSpacing: -1.5, + ); + final TextStyle headline2 = const TextStyle( + fontSize: 60, + fontWeight: FontWeight.w300, + letterSpacing: -0.5, + ); + final TextStyle headline3 = const TextStyle( + fontSize: 48, + fontWeight: FontWeight.w400, + ); + final TextStyle headline4 = const TextStyle( + fontSize: 34, + fontWeight: FontWeight.w400, + letterSpacing: 0.25, + ); + final TextStyle headline5 = const TextStyle( + fontSize: 24, + fontWeight: FontWeight.w400, + ); + final TextStyle overline = const TextStyle( + fontSize: 10, + fontWeight: FontWeight.w400, + letterSpacing: 1.5, + ); } diff --git a/lib/core/init/theme/panache/red_theme.dart b/lib/core/init/theme/panache/red_theme.dart index 50f913e..083a514 100644 --- a/lib/core/init/theme/panache/red_theme.dart +++ b/lib/core/init/theme/panache/red_theme.dart @@ -1,58 +1,41 @@ import 'package:flutter/material.dart'; -const String FONT_FAMILY = "Poppins"; +const String FONT_FAMILY = 'Poppins'; final ThemeData redTheme = ThemeData( fontFamily: FONT_FAMILY, - primarySwatch: Colors.red, brightness: Brightness.light, - primaryColor: Color(0xffC20003), //xxx - primaryColorBrightness: Brightness.dark, - primaryColorLight: Color(0xffffcdd2), - primaryColorDark: Color(0xffd32f2f), - accentColor: Color(0xfff44336), - accentColorBrightness: Brightness.dark, - canvasColor: Color(0xfffafafa), //XX - scaffoldBackgroundColor: Color(0xfffafafa), //xx - bottomAppBarColor: Color(0xffffffff), - cardColor: Color(0xffffffff), + primaryColor: const Color(0xffC20003), + primaryColorLight: const Color(0xffffcdd2), + primaryColorDark: const Color(0xffd32f2f), + canvasColor: const Color(0xfffafafa), //XX + scaffoldBackgroundColor: const Color(0xfffafafa), //xx + bottomAppBarColor: const Color(0xffffffff), + cardColor: const Color(0xffffffff), - dividerColor: Color(0xffffffff), //XX - highlightColor: Color(0x66bcbcbc), - splashColor: Color(0xffE8E8E8), - selectedRowColor: Color(0xfff5f5f5), - unselectedWidgetColor: Color(0x8a000000), - disabledColor: Color(0x61000000), //xx - buttonColor: Color(0xffe0e0e0), - toggleableActiveColor: Color(0xffe53935), - secondaryHeaderColor: Color(0xffffebee), - textSelectionColor: Color(0xffef9a9a), - cursorColor: Color(0xff4285f4), - textSelectionHandleColor: Color(0xffe57373), - backgroundColor: Color(0xffef9a9a), - toggleButtonsTheme: ToggleButtonsThemeData( - fillColor: Color(0xffC20003), textStyle: TextStyle(color: Colors.white), selectedColor: Colors.white), - floatingActionButtonTheme: FloatingActionButtonThemeData(backgroundColor: Color(0xffC20003)), + dividerColor: const Color(0xffffffff), //XX + highlightColor: const Color(0x66bcbcbc), + splashColor: const Color(0xffE8E8E8), + selectedRowColor: const Color(0xfff5f5f5), + unselectedWidgetColor: const Color(0x8a000000), + disabledColor: const Color(0x61000000), + toggleableActiveColor: const Color(0xffe53935), + secondaryHeaderColor: const Color(0xffffebee), + backgroundColor: const Color(0xffef9a9a), + toggleButtonsTheme: const ToggleButtonsThemeData( + fillColor: Color(0xffC20003), textStyle: TextStyle(color: Colors.white), selectedColor: Colors.white,), + floatingActionButtonTheme: const FloatingActionButtonThemeData(backgroundColor: Color(0xffC20003)), - dialogBackgroundColor: Color(0xffffffff), + dialogBackgroundColor: const Color(0xffffffff), - indicatorColor: Color(0xffC20003), //XX - hintColor: Color(0x8a000000), //xx - errorColor: Color(0xffd32f2f), - buttonTheme: ButtonThemeData( - textTheme: ButtonTextTheme.normal, - minWidth: 88, - height: 36, - padding: EdgeInsets.only(top: 0, bottom: 0, left: 16, right: 16), + indicatorColor: const Color(0xffC20003), //XX + hintColor: const Color(0x8a000000), //xx + errorColor: const Color(0xffd32f2f), + buttonTheme: const ButtonThemeData( + padding: EdgeInsets.only(left: 16, right: 16), shape: RoundedRectangleBorder( - side: BorderSide( - color: Color(0xff000000), - width: 0, - style: BorderStyle.none, - ), - borderRadius: BorderRadius.all(Radius.circular(2.0)), - ), - alignedDropdown: false, + borderRadius: BorderRadius.all(Radius.circular(2)), + ), buttonColor: Color(0xffe0e0e0), disabledColor: Color(0x61000000), highlightColor: Color(0x29000000), @@ -61,9 +44,7 @@ final ThemeData redTheme = ThemeData( hoverColor: Color(0x0a000000), colorScheme: ColorScheme( primary: Color(0xfff44336), - primaryVariant: Color(0xffd32f2f), - secondary: Color(0xffC20003), //xx - secondaryVariant: Color(0xffd32f2f), + secondary: Color(0xffC20003), surface: Color(0xffffffff), background: Color(0xffef9a9a), error: Color(0xffd32f2f), @@ -76,7 +57,7 @@ final ThemeData redTheme = ThemeData( ), ), - textTheme: TextTheme( + textTheme: const TextTheme( //XX headline1: TextStyle( color: Color(0x8a000000), @@ -127,25 +108,21 @@ final ThemeData redTheme = ThemeData( ), bodyText1: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), bodyText2: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), caption: TextStyle( color: Color(0x8a000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), button: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), @@ -157,12 +134,11 @@ final ThemeData redTheme = ThemeData( ), overline: TextStyle( color: Color(0xff000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), ), - primaryTextTheme: TextTheme( + primaryTextTheme: const TextTheme( //XX headline1: TextStyle( color: Color(0xfffafafa), @@ -213,175 +189,112 @@ final ThemeData redTheme = ThemeData( ), bodyText1: TextStyle( color: Color(0xfffafafa), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), bodyText2: TextStyle( color: Color(0xffffffff), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), caption: TextStyle( color: Color(0xb3ffffff), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), button: TextStyle( color: Color(0xffffffff), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), subtitle2: TextStyle( color: Color(0xffffffff), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), overline: TextStyle( color: Color(0xffffffff), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), ), - inputDecorationTheme: InputDecorationTheme( + inputDecorationTheme: const InputDecorationTheme( labelStyle: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), helperStyle: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), hintStyle: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), errorStyle: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), - errorMaxLines: null, - isDense: false, - contentPadding: EdgeInsets.only(top: 12, bottom: 12, left: 0, right: 0), - isCollapsed: false, + contentPadding: EdgeInsets.only(top: 12, bottom: 12), prefixStyle: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), suffixStyle: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), counterStyle: TextStyle( color: Color(0xdd000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), - filled: false, fillColor: Color(0x00000000), errorBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Color(0xff000000), - width: 1, - style: BorderStyle.solid, - ), - borderRadius: BorderRadius.all(Radius.circular(4.0)), + borderRadius: BorderRadius.all(Radius.circular(4)), ), focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Color(0xff000000), - width: 1, - style: BorderStyle.solid, - ), - borderRadius: BorderRadius.all(Radius.circular(4.0)), + borderRadius: BorderRadius.all(Radius.circular(4)), ), focusedErrorBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Color(0xff000000), - width: 1, - style: BorderStyle.solid, - ), - borderRadius: BorderRadius.all(Radius.circular(4.0)), + borderRadius: BorderRadius.all(Radius.circular(4)), ), disabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Color(0xff000000), - width: 1, - style: BorderStyle.solid, - ), - borderRadius: BorderRadius.all(Radius.circular(4.0)), + borderRadius: BorderRadius.all(Radius.circular(4)), ), enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Color(0xff000000), - width: 1, - style: BorderStyle.solid, - ), - borderRadius: BorderRadius.all(Radius.circular(4.0)), + borderRadius: BorderRadius.all(Radius.circular(4)), ), border: UnderlineInputBorder( - borderSide: BorderSide( - color: Color(0xff000000), - width: 1, - style: BorderStyle.solid, - ), - borderRadius: BorderRadius.all(Radius.circular(4.0)), + borderRadius: BorderRadius.all(Radius.circular(4)), ), ), - iconTheme: IconThemeData( + iconTheme: const IconThemeData( color: Color(0xdd000000), opacity: 1, size: 24, ), - primaryIconTheme: IconThemeData( + primaryIconTheme: const IconThemeData( color: Color(0xffffffff), opacity: 1, size: 24, ), - sliderTheme: SliderThemeData( - activeTrackColor: null, - inactiveTrackColor: null, - disabledActiveTrackColor: null, - disabledInactiveTrackColor: null, - activeTickMarkColor: null, - inactiveTickMarkColor: null, - disabledActiveTickMarkColor: null, - disabledInactiveTickMarkColor: null, - thumbColor: null, - disabledThumbColor: null, - thumbShape: null, - overlayColor: null, - valueIndicatorColor: null, - valueIndicatorShape: null, - showValueIndicator: null, + sliderTheme: const SliderThemeData( valueIndicatorTextStyle: TextStyle( color: Color(0xffffffff), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), ), - tabBarTheme: TabBarTheme( + tabBarTheme: const TabBarTheme( //xx labelStyle: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), unselectedLabelStyle: TextStyle(fontSize: 10), @@ -389,41 +302,30 @@ final ThemeData redTheme = ThemeData( labelColor: Color(0xffffffff), unselectedLabelColor: Color(0xb2ffffff), ), - chipTheme: ChipThemeData( + chipTheme: const ChipThemeData( backgroundColor: Color(0x1f000000), brightness: Brightness.light, deleteIconColor: Color(0xde000000), disabledColor: Color(0x0c000000), - labelPadding: EdgeInsets.only(top: 0, bottom: 0, left: 8, right: 8), + labelPadding: EdgeInsets.only(left: 8, right: 8), labelStyle: TextStyle( color: Color(0xde000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), padding: EdgeInsets.only(top: 4, bottom: 4, left: 4, right: 4), secondaryLabelStyle: TextStyle( color: Color(0x3d000000), - fontSize: null, fontWeight: FontWeight.w400, fontStyle: FontStyle.normal, ), secondarySelectedColor: Color(0x3df44336), selectedColor: Color(0x3d000000), shape: StadiumBorder( - side: BorderSide( - color: Color(0xff000000), - width: 0, - style: BorderStyle.none, - )), + ), ), - dialogTheme: DialogTheme( + dialogTheme: const DialogTheme( shape: RoundedRectangleBorder( - side: BorderSide( - color: Color(0xff000000), - width: 0, - style: BorderStyle.none, - ), - borderRadius: BorderRadius.all(Radius.circular(0.0)), - )), + + ),), textSelectionTheme: const TextSelectionThemeData(cursorColor: Color(0xff4285f4), selectionColor: Color(0xffef9a9a), selectionHandleColor: Color(0xffe57373),), colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.red).copyWith(secondary: const Color(0xfff44336)), ); diff --git a/lib/main.dart b/lib/main.dart index da9c0ab..506a49c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,27 +1,28 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/constants/app/app_constants.dart'; +import 'package:fluttermvvmtemplate/core/init/analytics/analytics_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/language_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/navigation/navigation_route.dart'; +import 'package:fluttermvvmtemplate/core/init/navigation/navigation_service.dart'; +import 'package:fluttermvvmtemplate/core/init/notifier/provider_list.dart'; +import 'package:fluttermvvmtemplate/core/init/notifier/theme_notifer.dart'; import 'package:provider/provider.dart'; -import 'core/constants/app/app_constants.dart'; -import 'core/init/analytics/analytics_manager.dart'; -import 'core/init/lang/language_manager.dart'; -import 'core/init/navigation/navigation_route.dart'; -import 'core/init/navigation/navigation_service.dart'; -import 'core/init/notifier/provider_list.dart'; -import 'core/init/notifier/theme_notifer.dart'; - Future main() async { await _init(); - runApp(MultiProvider( - providers: [...ApplicationProvider.instance.dependItems], - child: EasyLocalization( - child: MyApp(), - supportedLocales: LanguageManager.instance.supportedLocales, - path: ApplicationConstants.LANG_ASSET_PATH, - startLocale: LanguageManager.instance.enLocale, + runApp( + MultiProvider( + providers: [...ApplicationProvider.instance.dependItems], + child: EasyLocalization( + supportedLocales: LanguageManager.instance.supportedLocales, + path: ApplicationConstants.LANG_ASSET_PATH, + startLocale: LanguageManager.instance.enLocale, + child: MyApp(), + ), ), - )); + ); } Future _init() async { @@ -41,7 +42,7 @@ class MyApp extends StatelessWidget { locale: context.locale, onGenerateRoute: NavigationRoute.instance.generateRoute, navigatorKey: NavigationService.instance.navigatorKey, - navigatorObservers: AnalytcisManager.instance.observer, + navigatorObservers: AnalyticsManager.instance.observer, ); } } diff --git a/lib/product/exception/navigate_model_not_found.dart b/lib/product/exception/navigate_model_not_found.dart index a197521..4478451 100644 --- a/lib/product/exception/navigate_model_not_found.dart +++ b/lib/product/exception/navigate_model_not_found.dart @@ -1,7 +1,7 @@ class NavigateException implements Exception { - final dynamic model; NavigateException(this.model); + final dynamic model; @override String toString() { diff --git a/lib/product/model/user.dart b/lib/product/model/user.dart index 8325c73..cba9b2b 100644 --- a/lib/product/model/user.dart +++ b/lib/product/model/user.dart @@ -1,12 +1,12 @@ class UserModel { - final String userName; - final String userSurname; UserModel(this.userName, this.userSurname); - - String get shortName => '${userName[0]}${userSurname[0]}'; - String get fullName => '${userName} ${userSurname}'; factory UserModel.fake() { return UserModel('Veli', 'Bacik'); } + final String userName; + final String userSurname; + + String get shortName => '${userName[0]}${userSurname[0]}'; + String get fullName => '$userName $userSurname'; } diff --git a/lib/product/widget/button/header_button.dart b/lib/product/widget/button/header_button.dart index 5a3f394..a0fb2aa 100644 --- a/lib/product/widget/button/header_button.dart +++ b/lib/product/widget/button/header_button.dart @@ -1,14 +1,12 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; import 'package:kartal/kartal.dart'; -import '../../../core/init/lang/locale_keys.g.dart'; - class HeaderButton extends StatelessWidget { + const HeaderButton({Key? key, this.titleText, this.onPressed}) : super(key: key); final String? titleText; final VoidCallback? onPressed; - - const HeaderButton({Key? key, this.titleText, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { return Padding( @@ -27,20 +25,24 @@ class HeaderButton extends StatelessWidget { ); } - FlatButton buildFlatButtonRight(BuildContext context) { - return FlatButton( - padding: EdgeInsets.zero, - onPressed: () { - if (onPressed != null) { - onPressed!(); - } - }, - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Text(LocaleKeys.home_game_viewAll.tr(), style: context.textTheme.subtitle2!.copyWith(color: context.colorScheme.onError)), - Icon(Icons.arrow_right, color: context.colorScheme.onError) - ], - )); + Widget buildFlatButtonRight(BuildContext context) { + return TextButton( + style: TextButton.styleFrom(padding: EdgeInsets.zero), + onPressed: () { + if (onPressed != null) { + onPressed!(); + } + }, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + LocaleKeys.home_game_viewAll.tr(), + style: context.textTheme.subtitle2!.copyWith(color: context.colorScheme.onError), + ), + Icon(Icons.arrow_right, color: context.colorScheme.onError) + ], + ), + ); } } diff --git a/lib/product/widget/card/burger_card.dart b/lib/product/widget/card/burger_card.dart index 35db641..8e98c04 100644 --- a/lib/product/widget/card/burger_card.dart +++ b/lib/product/widget/card/burger_card.dart @@ -1,39 +1,34 @@ import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; -import '../../../view/home/burger/model/burger_model.dart'; +import 'package:fluttermvvmtemplate/view/home/burger/model/burger_model.dart'; class BurgerCard extends StatelessWidget { - final BurgerModel? model; - const BurgerCard({Key? key, this.model}) : super(key: key); + final BurgerModel? model; @override Widget build(BuildContext context) { return Card( - child: Column( - children: [ - Expanded(child: Image.network(model?.image ?? '')), - Text('${model?.name}'), - buildRatingBar(), - Text('${model?.price} \$'), - ], - )); + child: Column( + children: [ + Expanded(child: Image.network(model?.image ?? '')), + Text('${model?.name}'), + buildRatingBar(), + Text('${model?.price} \$'), + ], + ), + ); } RatingBar buildRatingBar() { return RatingBar.builder( initialRating: (model?.rates ?? 0).toDouble(), minRating: 1, - direction: Axis.horizontal, allowHalfRating: true, - itemCount: 5, ignoreGestures: true, itemSize: 10, - itemPadding: EdgeInsets.zero, - itemBuilder: (context, _) => Icon(Icons.star, color: Colors.amber), - onRatingUpdate: (rating) { - print(rating); - }, + itemBuilder: (context, _) => const Icon(Icons.star, color: Colors.amber), + onRatingUpdate: print, ); } } diff --git a/lib/product/widget/card/game_card.dart b/lib/product/widget/card/game_card.dart index d2f8443..996537f 100644 --- a/lib/product/widget/card/game_card.dart +++ b/lib/product/widget/card/game_card.dart @@ -1,13 +1,12 @@ import 'package:flutter/material.dart'; -import '../../../core/extension/context_extension.dart'; -import '../../../view/home/game/model/game_model.dart'; +import 'package:fluttermvvmtemplate/core/extension/context_extension.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_model.dart'; class GameCard extends StatelessWidget { + const GameCard({Key? key, this.model, this.onPressed}) : super(key: key); final GameModel? model; final VoidCallback? onPressed; - - const GameCard({Key? key, this.model, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { return Card( diff --git a/lib/product/widget/grid/game_grid_view.dart b/lib/product/widget/grid/game_grid_view.dart index db979f1..9bcb579 100644 --- a/lib/product/widget/grid/game_grid_view.dart +++ b/lib/product/widget/grid/game_grid_view.dart @@ -1,23 +1,21 @@ import 'package:flutter/material.dart'; - -import '../../../view/home/game/model/game_model.dart'; -import '../card/game_card.dart'; +import 'package:fluttermvvmtemplate/product/widget/card/game_card.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_model.dart'; class GameGrid extends StatelessWidget { + const GameGrid({Key? key, this.models, this.onPressed}) : super(key: key); final List? models; final void Function(GameModel item, int indx)? onPressed; - - const GameGrid({Key? key, this.models, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { return GridView.builder( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, childAspectRatio: 0.8, ), itemCount: 3, shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), + physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) => GameCard( model: models![index], onPressed: () { diff --git a/lib/product/widget/pageview/game_slider.dart b/lib/product/widget/pageview/game_slider.dart index 00c6385..29ffa4d 100644 --- a/lib/product/widget/pageview/game_slider.dart +++ b/lib/product/widget/pageview/game_slider.dart @@ -1,13 +1,11 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/slider_model.dart'; import 'package:kartal/kartal.dart'; -import '../../../view/home/game/model/slider_model.dart'; - class GameSlider extends StatefulWidget { - final List? sliderModel; - const GameSlider({Key? key, this.sliderModel}) : super(key: key); + final List? sliderModel; @override _GameSliderState createState() => _GameSliderState(); @@ -46,7 +44,8 @@ class _GameSliderState extends State { itemBuilder: (context, index) => Padding( padding: EdgeInsets.all(context.dynamicWidth(0.01)), child: CircleAvatar( - backgroundColor: _selectedValueIndex == index ? context.colorScheme.onError : context.colorScheme.onError.withOpacity(0.1), + backgroundColor: + _selectedValueIndex == index ? context.colorScheme.onError : context.colorScheme.onError.withOpacity(0.1), radius: 10, ), ), diff --git a/lib/view/_product/_constants/image_path_svg.dart b/lib/view/_product/_constants/image_path_svg.dart index b85ea3e..04b551b 100644 --- a/lib/view/_product/_constants/image_path_svg.dart +++ b/lib/view/_product/_constants/image_path_svg.dart @@ -1,13 +1,12 @@ -import '../../../core/extension/string_extension.dart'; +import 'package:fluttermvvmtemplate/core/extension/string_extension.dart'; class SVGImagePaths { + SVGImagePaths._init(); static SVGImagePaths? _instace; static SVGImagePaths get instance { return _instace ??= SVGImagePaths._init(); } - SVGImagePaths._init(); - final relaxSVG = 'relax'.toSVG; final astronautSVG = 'astronaut'.toSVG; final chattingSVG = 'chat'.toSVG; diff --git a/lib/view/_product/_model/query/friend_query.dart b/lib/view/_product/_model/query/friend_query.dart index f3d926d..7f7f037 100644 --- a/lib/view/_product/_model/query/friend_query.dart +++ b/lib/view/_product/_model/query/friend_query.dart @@ -1,6 +1,6 @@ class FriendQuery { - final int? limit; - final String? q; FriendQuery({this.limit, this.q}); + final int? limit; + final String? q; } diff --git a/lib/view/_product/_utilty/decoration_helper.dart b/lib/view/_product/_utilty/decoration_helper.dart index cdf2375..d6489e0 100644 --- a/lib/view/_product/_utilty/decoration_helper.dart +++ b/lib/view/_product/_utilty/decoration_helper.dart @@ -1,14 +1,12 @@ -import 'package:flutter/material.dart'; - import 'package:architecture_widgets/src/decoration/circle_decoration.dart'; -import '../../../core/extension/context_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/extension/context_extension.dart'; class DecorationHelper { - BuildContext? context; DecorationHelper({ this.context, }); + BuildContext? context; - Decoration get circleDecoriaton => - CircleDecoration(color: context!.colors.surface, radius: 3); + Decoration get circleDecoriaton => CircleDecoration(color: context!.colors.surface, radius: 3); } diff --git a/lib/view/_product/_utilty/service_helper.dart b/lib/view/_product/_utilty/service_helper.dart index 11843d4..17660ec 100644 --- a/lib/view/_product/_utilty/service_helper.dart +++ b/lib/view/_product/_utilty/service_helper.dart @@ -1,10 +1,19 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:vexana/vexana.dart'; abstract class ServiceHelper { - void showMessage(GlobalKey? scaffoldKey, IErrorModel? errorModel) { + void showMessage( + GlobalKey? scaffoldKey, + IErrorModel? errorModel, + ) { if (scaffoldKey == null || errorModel == null) return; - scaffoldKey.currentState!.showSnackBar(SnackBar(content: Text(errorModel.description ?? errorModel.statusCode.toString()))); + + if (scaffoldKey.currentContext == null) return; + ScaffoldMessenger.of(scaffoldKey.currentContext!).showSnackBar( + SnackBar( + content: Text( + errorModel.description ?? errorModel.statusCode.toString(), + )), + ); } } diff --git a/lib/view/_product/_utilty/thorottle_helper.dart b/lib/view/_product/_utilty/thorottle_helper.dart index ef6899e..c95abf2 100644 --- a/lib/view/_product/_utilty/thorottle_helper.dart +++ b/lib/view/_product/_utilty/thorottle_helper.dart @@ -1,17 +1,17 @@ import 'dart:async'; class ThrottleStringHelper { + ThrottleStringHelper() { + _onSetMaxValue(); + } String? _pastText; final int _maxTimerValue = 5; int _timerValue = 0; - ThrottleStringHelper() { - _onSetMaxValue(); - } void onDelayTouch(String text, Function(String? text) onComplete) { _pastText = text; if (_timerValue == _maxTimerValue) { - Timer.periodic(Duration(milliseconds: 100), (timer) { + Timer.periodic(const Duration(milliseconds: 100), (timer) { _timerValue--; if (_timerValue == 0) { diff --git a/lib/view/_product/_widgets/animation/social_card_animation.dart b/lib/view/_product/_widgets/animation/social_card_animation.dart index ee3e217..9a15a2f 100644 --- a/lib/view/_product/_widgets/animation/social_card_animation.dart +++ b/lib/view/_product/_widgets/animation/social_card_animation.dart @@ -1,16 +1,16 @@ import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; -import '../../../home/social/model/social_user_model.dart'; -import '../../../home/social/view/social_view_detial.dart'; +import 'package:fluttermvvmtemplate/view/home/social/model/social_user_model.dart'; +import 'package:fluttermvvmtemplate/view/home/social/view/social_view_detial.dart'; class OpenContainerSocailWrapper extends StatelessWidget { - final ContainerTransitionType _transitionType = ContainerTransitionType.fade; const OpenContainerSocailWrapper({ this.closedBuilder, this.onClosed, this.socialUser, }); + final ContainerTransitionType _transitionType = ContainerTransitionType.fade; final OpenContainerBuilder? closedBuilder; final ClosedCallback? onClosed; diff --git a/lib/view/_product/_widgets/avatar/on_board_circle.dart b/lib/view/_product/_widgets/avatar/on_board_circle.dart index 602afd2..d897eb2 100644 --- a/lib/view/_product/_widgets/avatar/on_board_circle.dart +++ b/lib/view/_product/_widgets/avatar/on_board_circle.dart @@ -1,18 +1,16 @@ import 'package:flutter/material.dart'; -import '../../../../core/extension/context_extension.dart'; +import 'package:fluttermvvmtemplate/core/extension/context_extension.dart'; class OnBoardCircle extends StatelessWidget { - final bool isSelected; - const OnBoardCircle({Key? key, required this.isSelected}) : super(key: key); + final bool isSelected; @override Widget build(BuildContext context) { return Padding( padding: context.paddingLow, child: CircleAvatar( - backgroundColor: - context.colors.onError.withOpacity(isSelected ? 1 : 0.2), + backgroundColor: context.colors.onError.withOpacity(isSelected ? 1 : 0.2), radius: isSelected ? context.width * 0.015 : context.width * 0.01, ), ); diff --git a/lib/view/_product/_widgets/button/face_book_button.dart b/lib/view/_product/_widgets/button/face_book_button.dart index 474988c..ff7c7e7 100644 --- a/lib/view/_product/_widgets/button/face_book_button.dart +++ b/lib/view/_product/_widgets/button/face_book_button.dart @@ -1,18 +1,16 @@ -import 'package:flutter/material.dart'; - import 'package:architecture_widgets/src/button/title_text_button.dart'; +import 'package:flutter/material.dart'; class FaceBookButton extends StatelessWidget { - final Function(FaceBookModel? data, {String? errorMessage})? onComplete; - const FaceBookButton({Key? key, this.onComplete}) : super(key: key); + final void Function(FaceBookModel? data, {String? errorMessage})? onComplete; @override Widget build(BuildContext context) { return TitleTextButton( text: 'Facebbok login', onPressed: () { - final isLengthSixCharacter = 'asdasdasd'.length == 6; + const isLengthSixCharacter = 'asdasdasd'.length == 6; if (isLengthSixCharacter) { onComplete!(FaceBookModel('asdasd', 'ASdasd')); @@ -25,8 +23,7 @@ class FaceBookButton extends StatelessWidget { } class FaceBookModel { + FaceBookModel(this.token, this.mail); final String token; final String mail; - - FaceBookModel(this.token, this.mail); } diff --git a/lib/view/_product/_widgets/button/login_button.dart b/lib/view/_product/_widgets/button/login_button.dart index 6a5ff94..f472944 100644 --- a/lib/view/_product/_widgets/button/login_button.dart +++ b/lib/view/_product/_widgets/button/login_button.dart @@ -1,17 +1,15 @@ -import 'package:flutter/material.dart'; - import 'package:architecture_widgets/src/button/icon_button.dart'; +import 'package:flutter/material.dart'; class MVVMLoginButton extends StatelessWidget { - final Function(String data)? onComplete; - const MVVMLoginButton({Key? key, this.onComplete}) : super(key: key); + final ValueChanged? onComplete; @override Widget build(BuildContext context) { return IconNormalButton( icon: Icons.access_alarm, onPressed: () { - onComplete!("OKEY"); + onComplete!('OKEY'); // BUSINESS CALL }, ); diff --git a/lib/view/_product/_widgets/card/build_user_card.dart b/lib/view/_product/_widgets/card/build_user_card.dart index 1a7ac69..6294ee5 100644 --- a/lib/view/_product/_widgets/card/build_user_card.dart +++ b/lib/view/_product/_widgets/card/build_user_card.dart @@ -1,15 +1,13 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/model/house_model.dart'; import 'package:kartal/kartal.dart'; -import '../../../home/build/feed/model/house_model.dart'; - class BuildUserCard extends StatelessWidget { + const BuildUserCard({Key? key, required this.model, this.onPressedLikeId, this.isLiked = false}) : super(key: key); final HouseModel model; final bool isLiked; final Function(String? id)? onPressedLikeId; - - const BuildUserCard({Key? key, required this.model, this.onPressedLikeId, this.isLiked = false}) : super(key: key); @override Widget build(BuildContext context) { return Column( @@ -31,7 +29,11 @@ class BuildUserCard extends StatelessWidget { Widget buildWrap(BuildContext context) { return Column( children: [ - AutoSizeText(model.title!, style: context.textTheme.headline6!.copyWith(fontWeight: FontWeight.w600), maxLines: 1), + AutoSizeText( + model.title!, + style: context.textTheme.headline6!.copyWith(fontWeight: FontWeight.w600), + maxLines: 1, + ), Text(model.description!), ], ); @@ -39,12 +41,13 @@ class BuildUserCard extends StatelessWidget { IconButton buildIconButton() { return IconButton( - icon: Icon( - Icons.favorite, - color: isLiked ? Colors.pink : Colors.black12, - ), - onPressed: () { - onPressedLikeId!(model.id); - }); + icon: Icon( + Icons.favorite, + color: isLiked ? Colors.pink : Colors.black12, + ), + onPressed: () { + onPressedLikeId!(model.id); + }, + ); } } diff --git a/lib/view/_product/_widgets/list-tile/friend_card.dart b/lib/view/_product/_widgets/list-tile/friend_card.dart index 36f181c..821445e 100644 --- a/lib/view/_product/_widgets/list-tile/friend_card.dart +++ b/lib/view/_product/_widgets/list-tile/friend_card.dart @@ -1,28 +1,32 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/view/home/social/model/social_user_model.dart'; import 'package:kartal/kartal.dart'; -import '../../../../core/init/lang/locale_keys.g.dart'; -import '../../../home/social/model/social_user_model.dart'; - class FriendCard extends StatelessWidget { + const FriendCard({Key? key, this.user, this.onPressed}) : super(key: key); final SocialUser? user; final VoidCallback? onPressed; - - const FriendCard({Key? key, this.user, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { + if (user == null) { + // throw Exception('User object is null $this'); + return const SizedBox(); + } return ListTile( leading: CircleAvatar(backgroundImage: NetworkImage(user!.image!)), title: Text(user!.name!), onTap: onPressed, subtitle: Text(user!.company!), - trailing: RaisedButton( - child: Text(LocaleKeys.home_social_follow).tr(), + trailing: ElevatedButton( onPressed: () {}, - padding: EdgeInsets.zero, - textColor: context.colorScheme.background, - color: context.appTheme.buttonTheme.colorScheme!.onError, + style: ElevatedButton.styleFrom( + padding: EdgeInsets.zero, + backgroundColor: context.colorScheme.background, + foregroundColor: context.appTheme.buttonTheme.colorScheme?.onError, + ), + child: const Text(LocaleKeys.home_social_follow).tr(), ), ); } diff --git a/lib/view/_product/_widgets/listview/on_board_indicator.dart b/lib/view/_product/_widgets/listview/on_board_indicator.dart index c28963a..e93ec42 100644 --- a/lib/view/_product/_widgets/listview/on_board_indicator.dart +++ b/lib/view/_product/_widgets/listview/on_board_indicator.dart @@ -1,19 +1,17 @@ -import 'package:flutter/material.dart'; import 'package:architecture_widgets/src/list-view/indicator_list_view.dart'; +import 'package:flutter/material.dart'; class OnBoardIndcator extends StatelessWidget { + const OnBoardIndcator({Key? key, this.itemCount, this.currentIndex}) : super(key: key); final int? itemCount; final int? currentIndex; - - const OnBoardIndcator({Key? key, this.itemCount, this.currentIndex}) - : super(key: key); @override Widget build(BuildContext context) { return IndactorListView( currentIndex: currentIndex, itemCount: itemCount, onListItem: (index) { - return FlutterLogo(); + return const FlutterLogo(); }, ); } diff --git a/lib/view/authenticate/login/model/login_model.dart b/lib/view/authenticate/login/model/login_model.dart index 4bd17c9..c7fe784 100644 --- a/lib/view/authenticate/login/model/login_model.dart +++ b/lib/view/authenticate/login/model/login_model.dart @@ -5,10 +5,10 @@ part 'login_model.g.dart'; @JsonSerializable() class LoginModel extends INetworkModel { - final String? email; - final String? password; LoginModel({this.email, this.password}); + final String? email; + final String? password; @override LoginModel fromJson(Map json) { diff --git a/lib/view/authenticate/login/model/login_model.g.dart b/lib/view/authenticate/login/model/login_model.g.dart index e936868..33a185d 100644 --- a/lib/view/authenticate/login/model/login_model.g.dart +++ b/lib/view/authenticate/login/model/login_model.g.dart @@ -6,12 +6,10 @@ part of 'login_model.dart'; // JsonSerializableGenerator // ************************************************************************** -LoginModel _$LoginModelFromJson(Map json) { - return LoginModel( - email: json['email'] as String?, - password: json['password'] as String?, - ); -} +LoginModel _$LoginModelFromJson(Map json) => LoginModel( + email: json['email'] as String?, + password: json['password'] as String?, + ); Map _$LoginModelToJson(LoginModel instance) => { diff --git a/lib/view/authenticate/login/model/login_response_model.dart b/lib/view/authenticate/login/model/login_response_model.dart index dd85c96..f585406 100644 --- a/lib/view/authenticate/login/model/login_response_model.dart +++ b/lib/view/authenticate/login/model/login_response_model.dart @@ -5,9 +5,9 @@ part 'login_response_model.g.dart'; @JsonSerializable() class LoginResponseModel extends INetworkModel { - final String? token; LoginResponseModel({this.token}); + final String? token; @override LoginResponseModel fromJson(Map json) { diff --git a/lib/view/authenticate/login/model/login_response_model.g.dart b/lib/view/authenticate/login/model/login_response_model.g.dart index b1cc7ac..35898bd 100644 --- a/lib/view/authenticate/login/model/login_response_model.g.dart +++ b/lib/view/authenticate/login/model/login_response_model.g.dart @@ -6,11 +6,10 @@ part of 'login_response_model.dart'; // JsonSerializableGenerator // ************************************************************************** -LoginResponseModel _$LoginResponseModelFromJson(Map json) { - return LoginResponseModel( - token: json['token'] as String?, - ); -} +LoginResponseModel _$LoginResponseModelFromJson(Map json) => + LoginResponseModel( + token: json['token'] as String?, + ); Map _$LoginResponseModelToJson(LoginResponseModel instance) => { diff --git a/lib/view/authenticate/login/service/ILoginService.dart b/lib/view/authenticate/login/service/ILoginService.dart index f553d9d..a3a050f 100644 --- a/lib/view/authenticate/login/service/ILoginService.dart +++ b/lib/view/authenticate/login/service/ILoginService.dart @@ -1,12 +1,10 @@ +import 'package:fluttermvvmtemplate/view/authenticate/login/model/login_model.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/login/model/login_response_model.dart'; import 'package:vexana/vexana.dart'; -import '../model/login_model.dart'; -import '../model/login_response_model.dart'; - abstract class ILoginService { - final INetworkManager manager; - ILoginService(this.manager); + final INetworkManager manager; Future fetchUserControl(LoginModel model); } diff --git a/lib/view/authenticate/login/service/login_service.dart b/lib/view/authenticate/login/service/login_service.dart index 924728c..a0e866f 100644 --- a/lib/view/authenticate/login/service/login_service.dart +++ b/lib/view/authenticate/login/service/login_service.dart @@ -1,17 +1,20 @@ +import 'package:fluttermvvmtemplate/view/_product/enum/network_route_enum.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/login/model/login_model.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/login/model/login_response_model.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/login/service/ILoginService.dart'; import 'package:vexana/vexana.dart'; -import '../../../_product/enum/network_route_enum.dart'; -import '../model/login_model.dart'; -import '../model/login_response_model.dart'; -import 'ILoginService.dart'; - class LoginService extends ILoginService { LoginService(INetworkManager manager) : super(manager); @override Future fetchUserControl(LoginModel model) async { - final response = await manager.send(NetworkRoutes.LOGIN.rawValue, - parseModel: LoginResponseModel(), method: RequestType.POST, data: model); + final response = await manager.send( + NetworkRoutes.LOGIN.rawValue, + parseModel: LoginResponseModel(), + method: RequestType.POST, + data: model, + ); if (response.data is LoginResponseModel) { return response.data; diff --git a/lib/view/authenticate/login/view/login_view.dart b/lib/view/authenticate/login/view/login_view.dart index 68c06bc..8696846 100644 --- a/lib/view/authenticate/login/view/login_view.dart +++ b/lib/view/authenticate/login/view/login_view.dart @@ -2,12 +2,12 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import '../../../../core/base/view/base_widget.dart'; -import '../../../../core/constants/image/image_constatns.dart'; -import '../../../../core/extension/context_extension.dart'; -import '../../../../core/extension/string_extension.dart'; -import '../../../../core/init/lang/locale_keys.g.dart'; -import '../viewmodel/login_view_model.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/constants/image/image_constatns.dart'; +import 'package:fluttermvvmtemplate/core/extension/context_extension.dart'; +import 'package:fluttermvvmtemplate/core/extension/string_extension.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/login/viewmodel/login_view_model.dart'; class LoginView extends StatelessWidget { @override @@ -38,15 +38,17 @@ class LoginView extends StatelessWidget { AnimatedContainer buildAnimatedContainer(BuildContext context) { return AnimatedContainer( - duration: context.lowDuration, - height: context.mediaQuery.viewInsets.bottom > 0 ? 0 : context.height * 0.3, - color: Colors.white, - child: Center(child: Image.asset(ImageConstants.instance.hotDog))); + duration: context.lowDuration, + height: context.mediaQuery.viewInsets.bottom > 0 ? 0 : context.height * 0.3, + color: Colors.white, + child: Center(child: Image.asset(ImageConstants.instance.hotDog)), + ); } Container buildContainerTabBar(BuildContext context) { return Container( - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.vertical(bottom: Radius.circular(50))), + decoration: + const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.vertical(bottom: Radius.circular(50))), child: Padding( padding: EdgeInsets.only(left: context.width * 0.1, right: context.width * 0.1, bottom: context.width * 0.01), child: buildTabBar(context), @@ -56,16 +58,17 @@ class LoginView extends StatelessWidget { TabBar buildTabBar(BuildContext context) { return TabBar( - labelStyle: context.textTheme.headline5, - unselectedLabelStyle: context.textTheme.headline5, - labelColor: Colors.black, - indicatorColor: Colors.yellow, - indicatorWeight: 5, - indicatorSize: TabBarIndicatorSize.label, - tabs: [ - Tab(text: ' ${LocaleKeys.login_tab1.tr()} '), - Tab(text: LocaleKeys.login_tab2.tr()), - ]); + labelStyle: context.textTheme.headline5, + unselectedLabelStyle: context.textTheme.headline5, + labelColor: Colors.black, + indicatorColor: Colors.yellow, + indicatorWeight: 5, + indicatorSize: TabBarIndicatorSize.label, + tabs: [ + Tab(text: ' ${LocaleKeys.login_tab1.tr()} '), + Tab(text: LocaleKeys.login_tab2.tr()), + ], + ); } Form buildForm(LoginViewModel value, BuildContext context) { @@ -74,40 +77,46 @@ class LoginView extends StatelessWidget { autovalidateMode: AutovalidateMode.always, child: Column( children: [ - Spacer(flex: 6), + const Spacer(flex: 6), buildTextFormFieldEmail(context, value), buildTextFormFieldPassword(context, value), - Spacer(), + const Spacer(), buildTextForgot(), - Spacer(flex: 6), + const Spacer(flex: 6), buildRaisedButtonLogin(context, value), buildWrapForgot(), - Spacer(), + const Spacer(), ], ), ); } Widget buildTextFormFieldPassword(BuildContext context, LoginViewModel viewModel) { - return Observer(builder: (_) { - return TextFormField( - controller: viewModel.passwordController, - validator: (value) => value!.isNotEmpty ? null : 'This field required', - obscureText: viewModel.isLockOpen, - decoration: InputDecoration( + return Observer( + builder: (_) { + return TextFormField( + controller: viewModel.passwordController, + validator: (value) => value!.isNotEmpty ? null : 'This field required', + obscureText: viewModel.isLockOpen, + decoration: InputDecoration( labelStyle: context.textTheme.subtitle1, labelText: LocaleKeys.login_password.tr(), icon: buildContainerIconField(context, Icons.vpn_key), - suffixIcon: FlatButton( - onPressed: () { - viewModel.isLockStateChange(); - }, - padding: EdgeInsets.zero, - child: Observer(builder: (_) { + suffixIcon: IconButton( + onPressed: () { + viewModel.isLockStateChange(); + }, + padding: EdgeInsets.zero, + icon: Observer( + builder: (_) { return Icon(viewModel.isLockOpen ? Icons.lock : Icons.lock_open); - }))), - ); - }); + }, + ), + ), + ), + ); + }, + ); } TextFormField buildTextFormFieldEmail(BuildContext context, LoginViewModel viewModel) { @@ -126,32 +135,47 @@ class LoginView extends StatelessWidget { return Container( color: context.colors.onError, padding: context.paddingLow, - child: Icon(icon, color: context.colors.primaryVariant), + child: Icon(icon, color: context.colors.primaryContainer), ); } - Widget buildTextForgot() => Align(alignment: Alignment.centerRight, child: Text(LocaleKeys.login_forgotText, textAlign: TextAlign.end).tr()); + Widget buildTextForgot() => Align( + alignment: Alignment.centerRight, + child: const Text(LocaleKeys.login_forgotText, textAlign: TextAlign.end).tr(), + ); Widget buildRaisedButtonLogin(BuildContext context, LoginViewModel viewModel) { - return Observer(builder: (_) { - return RaisedButton( - padding: context.paddingNormal, - onPressed: viewModel.isLoading - ? null - : () { - viewModel.fetchLoginSevice(); - }, - shape: StadiumBorder(), - child: Center(child: Text(LocaleKeys.login_login.tr(), style: context.textTheme.headline5)), - color: context.colors.onError, - ); - }); + return Observer( + builder: (_) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + padding: context.paddingNormal, + shape: const StadiumBorder(), + backgroundColor: context.colors.onError, + ), + onPressed: viewModel.isLoading + ? null + : () { + viewModel.fetchLoginService(); + }, + child: Center( + child: Text( + LocaleKeys.login_login.tr(), + style: context.textTheme.headline5, + ), + ), + ); + }, + ); } Wrap buildWrapForgot() { return Wrap( crossAxisAlignment: WrapCrossAlignment.center, - children: [Text(LocaleKeys.login_dontAccount.tr()), FlatButton(onPressed: () {}, child: Text(LocaleKeys.login_tab2.tr()))], + children: [ + Text(LocaleKeys.login_dontAccount.tr()), + TextButton(onPressed: () {}, child: Text(LocaleKeys.login_tab2.tr())) + ], ); } } diff --git a/lib/view/authenticate/login/view/login_view_two.dart b/lib/view/authenticate/login/view/login_view_two.dart index 5d061be..0ef54fb 100644 --- a/lib/view/authenticate/login/view/login_view_two.dart +++ b/lib/view/authenticate/login/view/login_view_two.dart @@ -9,42 +9,59 @@ class UserView extends StatelessWidget { body: Stack( children: [ Positioned( - right: 0, - left: 0, - height: MediaQuery.of(context).size.height * 0.4, - child: Column( - children: [ - Expanded(flex: 9, child: Container(color: Colors.red, child: FlutterLogo(size: 200))), - Container( - child: Padding( - padding: EdgeInsets.only(left: 30, right: 30, bottom: 5), - child: TabBar(indicatorSize: TabBarIndicatorSize.label, tabs: [ + right: 0, + left: 0, + height: MediaQuery.of(context).size.height * 0.4, + child: Column( + children: [ + Expanded(flex: 9, child: Container(color: Colors.red, child: const FlutterLogo(size: 200))), + Container( + decoration: const BoxDecoration( + color: Colors.yellow, + borderRadius: BorderRadius.vertical(bottom: Radius.circular(30)), + ), + child: const Padding( + padding: EdgeInsets.only(left: 30, right: 30, bottom: 5), + child: TabBar( + indicatorSize: TabBarIndicatorSize.label, + tabs: [ Tab( - text: " Login ", + text: ' Login ', ), Tab(icon: Icon(Icons.radio)), - ]), + ], ), - decoration: BoxDecoration(color: Colors.yellow, borderRadius: BorderRadius.vertical(bottom: Radius.circular(30))), ), - // Spacer(flex: 12) - ], - )), + ), + // Spacer(flex: 12) + ], + ), + ), Positioned.fill( - left: 0, - right: 0, - top: MediaQuery.of(context).size.height * 0.4, - child: Center( - child: SingleChildScrollView( - child: SizedBox( - height: MediaQuery.of(context).size.height * 0.25, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [TextField(), TextField(), RaisedButton(onPressed: null), RaisedButton(onPressed: null)], - ), + top: MediaQuery.of(context).size.height * 0.4, + child: Center( + child: SingleChildScrollView( + child: SizedBox( + height: MediaQuery.of(context).size.height * 0.25, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + TextField(), + TextField(), + ElevatedButton( + onPressed: null, + child: Text(''), + ), + ElevatedButton( + onPressed: null, + child: Text(''), + ) + ], ), ), - )) + ), + ), + ) ], ), ), diff --git a/lib/view/authenticate/login/viewmodel/login_view_model.dart b/lib/view/authenticate/login/viewmodel/login_view_model.dart index e33fafa..a201468 100644 --- a/lib/view/authenticate/login/viewmodel/login_view_model.dart +++ b/lib/view/authenticate/login/viewmodel/login_view_model.dart @@ -1,13 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/locale_keys_enum.dart'; +import 'package:fluttermvvmtemplate/core/init/network/vexana_manager.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/login/model/login_model.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/login/service/ILoginService.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/login/service/login_service.dart'; import 'package:mobx/mobx.dart'; -import '../../../../core/base/model/base_view_model.dart'; -import '../../../../core/constants/enums/locale_keys_enum.dart'; -import '../../../../core/init/network/vexana_manager.dart'; -import '../model/login_model.dart'; -import '../service/ILoginService.dart'; -import '../service/login_service.dart'; - part 'login_view_model.g.dart'; class LoginViewModel = _LoginViewModelBase with _$LoginViewModel; @@ -17,16 +16,15 @@ abstract class _LoginViewModelBase with Store, BaseViewModel { GlobalKey scaffoldState = GlobalKey(); late ILoginService loginService; - TextEditingController? emailController; - TextEditingController? passwordController; + TextEditingController emailController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); @override - void setContext(BuildContext context) => this.context = context; + void setContext(BuildContext context) => viewModelContext = context; + @override void init() { loginService = LoginService(VexanaManager.instance.networkManager); - emailController = TextEditingController(); - passwordController = TextEditingController(); } @observable @@ -36,21 +34,39 @@ abstract class _LoginViewModelBase with Store, BaseViewModel { bool isLockOpen = false; @action - Future fetchLoginSevice() async { + Future fetchLoginService() async { isLoadingChange(); if (formState.currentState!.validate()) { - final response = await loginService.fetchUserControl(LoginModel(email: emailController!.text, password: passwordController!.text)); + final response = await loginService.fetchUserControl( + LoginModel( + email: emailController.text, + password: passwordController.text, + ), + ); if (response != null) { - if (scaffoldState.currentState != null) { - scaffoldState.currentState!.showSnackBar(SnackBar(content: Text(response.token!))); + if (response.token?.isEmpty ?? true) return; + if (scaffoldState.currentContext != null) { + ScaffoldMessenger.of(scaffoldState.currentContext!).showSnackBar( + SnackBar( + content: Text(response.token!), + ), + ); } - await localeManager.setStringValue(PreferencesKeys.TOKEN, response.token!); + await localeManager.setStringValue( + PreferencesKeys.TOKEN, + response.token!, + ); } } isLoadingChange(); } + void dispose() { + emailController.dispose(); + passwordController.dispose(); + } + @action void isLoadingChange() { isLoading = !isLoading; diff --git a/lib/view/authenticate/login/viewmodel/login_view_model.g.dart b/lib/view/authenticate/login/viewmodel/login_view_model.g.dart index 860887e..19b35e0 100644 --- a/lib/view/authenticate/login/viewmodel/login_view_model.g.dart +++ b/lib/view/authenticate/login/viewmodel/login_view_model.g.dart @@ -6,10 +6,11 @@ part of 'login_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$LoginViewModel on _LoginViewModelBase, Store { - final _$isLoadingAtom = Atom(name: '_LoginViewModelBase.isLoading'); + late final _$isLoadingAtom = + Atom(name: '_LoginViewModelBase.isLoading', context: context); @override bool get isLoading { @@ -24,7 +25,8 @@ mixin _$LoginViewModel on _LoginViewModelBase, Store { }); } - final _$isLockOpenAtom = Atom(name: '_LoginViewModelBase.isLockOpen'); + late final _$isLockOpenAtom = + Atom(name: '_LoginViewModelBase.isLockOpen', context: context); @override bool get isLockOpen { @@ -39,16 +41,16 @@ mixin _$LoginViewModel on _LoginViewModelBase, Store { }); } - final _$fetchLoginSeviceAsyncAction = - AsyncAction('_LoginViewModelBase.fetchLoginSevice'); + late final _$fetchLoginServiceAsyncAction = + AsyncAction('_LoginViewModelBase.fetchLoginService', context: context); @override - Future fetchLoginSevice() { - return _$fetchLoginSeviceAsyncAction.run(() => super.fetchLoginSevice()); + Future fetchLoginService() { + return _$fetchLoginServiceAsyncAction.run(() => super.fetchLoginService()); } - final _$_LoginViewModelBaseActionController = - ActionController(name: '_LoginViewModelBase'); + late final _$_LoginViewModelBaseActionController = + ActionController(name: '_LoginViewModelBase', context: context); @override void isLoadingChange() { diff --git a/lib/view/authenticate/onboard/model/on_board_model.dart b/lib/view/authenticate/onboard/model/on_board_model.dart index e33fe3f..0ac9681 100644 --- a/lib/view/authenticate/onboard/model/on_board_model.dart +++ b/lib/view/authenticate/onboard/model/on_board_model.dart @@ -1,7 +1,7 @@ class OnBoardModel { + + OnBoardModel(this.title, this.description, this.imagePath); final String title; final String description; final String imagePath; - - OnBoardModel(this.title, this.description, this.imagePath); } diff --git a/lib/view/authenticate/onboard/view/on_board_view.dart b/lib/view/authenticate/onboard/view/on_board_view.dart index 41041fd..f852f5c 100644 --- a/lib/view/authenticate/onboard/view/on_board_view.dart +++ b/lib/view/authenticate/onboard/view/on_board_view.dart @@ -1,15 +1,16 @@ +import 'package:architecture_widgets/src/text/auto_locale_text.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_svg/svg.dart'; - -import '../../../../core/base/view/base_widget.dart'; -import 'package:architecture_widgets/src/text/auto_locale_text.dart'; -import '../../../../core/extension/context_extension.dart'; -import '../../../_product/_widgets/avatar/on_board_circle.dart'; -import '../model/on_board_model.dart'; -import '../viewModel/on_board_view_model.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/extension/context_extension.dart'; +import 'package:fluttermvvmtemplate/view/_product/_widgets/avatar/on_board_circle.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/onboard/model/on_board_model.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/onboard/viewModel/on_board_view_model.dart'; class OnBoardView extends StatelessWidget { + const OnBoardView({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { return BaseView( @@ -18,13 +19,12 @@ class OnBoardView extends StatelessWidget { model.setContext(context); model.init(); }, - onPageBuilder: (BuildContext context, OnBoardViewModel viewModel) => - Scaffold( + onPageBuilder: (BuildContext context, OnBoardViewModel viewModel) => Scaffold( body: Padding( padding: context.paddingNormalHorizontal, child: Column( children: [ - Spacer(flex: 1), + const Spacer(), Expanded(flex: 5, child: buildPageView(viewModel)), Expanded(flex: 2, child: buildRowFooter(viewModel, context)), ], @@ -36,12 +36,12 @@ class OnBoardView extends StatelessWidget { PageView buildPageView(OnBoardViewModel viewModel) { return PageView.builder( - itemCount: viewModel.onBoardItems.length, - onPageChanged: (value) { - viewModel.changeCurrentIndex(value); - }, - itemBuilder: (context, index) => - buildColumnBody(context, viewModel.onBoardItems[index])); + itemCount: viewModel.onBoardItems.length, + onPageChanged: (value) { + viewModel.changeCurrentIndex(value); + }, + itemBuilder: (context, index) => buildColumnBody(context, viewModel.onBoardItems[index]), + ); } Row buildRowFooter(OnBoardViewModel viewModel, BuildContext context) { @@ -49,10 +49,18 @@ class OnBoardView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ buildListViewCircles(viewModel), - Expanded(child: Center(child: Observer(builder: (_) { - return Visibility( - visible: viewModel.isLoading, child: CircularProgressIndicator()); - }))), + Expanded( + child: Center( + child: Observer( + builder: (_) { + return Visibility( + visible: viewModel.isLoading, + child: const CircularProgressIndicator(), + ); + }, + ), + ), + ), buildFloatingActionButtonSkip(context, viewModel) ], ); @@ -64,22 +72,26 @@ class OnBoardView extends StatelessWidget { shrinkWrap: true, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { - return Observer(builder: (_) { - return OnBoardCircle( - isSelected: viewModel.currentIndex == index, - ); - }); + return Observer( + builder: (_) { + return OnBoardCircle( + isSelected: viewModel.currentIndex == index, + ); + }, + ); }, ); } FloatingActionButton buildFloatingActionButtonSkip( - BuildContext context, OnBoardViewModel viewModel) { + BuildContext context, + OnBoardViewModel viewModel, + ) { return FloatingActionButton( - backgroundColor: context.colors.secondaryVariant, + backgroundColor: context.colors.secondaryContainer, child: Icon( Icons.keyboard_arrow_right, - color: context.colors.primaryVariant, + color: context.colors.primaryContainer, ), onPressed: () => viewModel.completeToOnBoard(), ); @@ -99,23 +111,30 @@ class OnBoardView extends StatelessWidget { children: [ buildAutoLocaleTextTitle(model, context), Padding( - padding: context.paddingMediumHorizontal, - child: buildAutoLocaleTextDescription(model, context)) + padding: context.paddingMediumHorizontal, + child: buildAutoLocaleTextDescription(model, context), + ) ], ); } AutoLocaleText buildAutoLocaleTextTitle( - OnBoardModel model, BuildContext context) { + OnBoardModel model, + BuildContext context, + ) { return AutoLocaleText( value: model.title, style: Theme.of(context).textTheme.headline3!.copyWith( - fontWeight: FontWeight.bold, color: context.colors.onSecondary), + fontWeight: FontWeight.bold, + color: context.colors.onSecondary, + ), ); } AutoLocaleText buildAutoLocaleTextDescription( - OnBoardModel model, BuildContext context) { + OnBoardModel model, + BuildContext context, + ) { return AutoLocaleText( value: model.description, textAlign: TextAlign.center, diff --git a/lib/view/authenticate/onboard/viewModel/on_board_view_model.dart b/lib/view/authenticate/onboard/viewModel/on_board_view_model.dart index a68f6be..d1c3297 100644 --- a/lib/view/authenticate/onboard/viewModel/on_board_view_model.dart +++ b/lib/view/authenticate/onboard/viewModel/on_board_view_model.dart @@ -1,20 +1,22 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/locale_keys_enum.dart'; +import 'package:fluttermvvmtemplate/core/constants/navigation/navigation_constants.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/view/_product/_constants/image_path_svg.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/onboard/model/on_board_model.dart'; import 'package:mobx/mobx.dart'; -import '../../../../core/base/model/base_view_model.dart'; -import '../../../../core/constants/enums/locale_keys_enum.dart'; -import '../../../../core/constants/navigation/navigation_constants.dart'; -import '../../../../core/init/lang/locale_keys.g.dart'; -import '../../../_product/_constants/image_path_svg.dart'; -import '../model/on_board_model.dart'; - part 'on_board_view_model.g.dart'; class OnBoardViewModel = _OnBoardViewModelBase with _$OnBoardViewModel; abstract class _OnBoardViewModelBase with Store, BaseViewModel { @override - void setContext(BuildContext context) => this.context = context; + void setContext(BuildContext context) { + viewModelContext = context; + } + List onBoardItems = []; @observable @@ -30,9 +32,24 @@ abstract class _OnBoardViewModelBase with Store, BaseViewModel { @override void init() { - onBoardItems.add(OnBoardModel(LocaleKeys.onBoard_page1_title, LocaleKeys.onBoard_page1_desc, SVGImagePaths.instance.astronautSVG)); - onBoardItems.add(OnBoardModel(LocaleKeys.onBoard_page1_title, LocaleKeys.onBoard_page2_desc, SVGImagePaths.instance.chattingSVG)); - onBoardItems.add(OnBoardModel(LocaleKeys.onBoard_page3_title, LocaleKeys.onBoard_page3_desc, SVGImagePaths.instance.relaxSVG)); + onBoardItems.addAll([ + OnBoardModel( + LocaleKeys.onBoard_page1_title, + LocaleKeys.onBoard_page1_desc, + SVGImagePaths.instance.astronautSVG, + ), + OnBoardModel( + LocaleKeys.onBoard_page1_title, + LocaleKeys.onBoard_page2_desc, + SVGImagePaths.instance.chattingSVG, + ), + OnBoardModel( + LocaleKeys.onBoard_page1_title, + LocaleKeys.onBoard_page2_desc, + SVGImagePaths.instance.chattingSVG, + ), + OnBoardModel(LocaleKeys.onBoard_page3_title, LocaleKeys.onBoard_page3_desc, SVGImagePaths.instance.relaxSVG), + ]); } @action diff --git a/lib/view/authenticate/onboard/viewModel/on_board_view_model.g.dart b/lib/view/authenticate/onboard/viewModel/on_board_view_model.g.dart index 0f77498..928e09e 100644 --- a/lib/view/authenticate/onboard/viewModel/on_board_view_model.g.dart +++ b/lib/view/authenticate/onboard/viewModel/on_board_view_model.g.dart @@ -6,10 +6,11 @@ part of 'on_board_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$OnBoardViewModel on _OnBoardViewModelBase, Store { - final _$isLoadingAtom = Atom(name: '_OnBoardViewModelBase.isLoading'); + late final _$isLoadingAtom = + Atom(name: '_OnBoardViewModelBase.isLoading', context: context); @override bool get isLoading { @@ -24,7 +25,8 @@ mixin _$OnBoardViewModel on _OnBoardViewModelBase, Store { }); } - final _$currentIndexAtom = Atom(name: '_OnBoardViewModelBase.currentIndex'); + late final _$currentIndexAtom = + Atom(name: '_OnBoardViewModelBase.currentIndex', context: context); @override int get currentIndex { @@ -39,8 +41,8 @@ mixin _$OnBoardViewModel on _OnBoardViewModelBase, Store { }); } - final _$_OnBoardViewModelBaseActionController = - ActionController(name: '_OnBoardViewModelBase'); + late final _$_OnBoardViewModelBaseActionController = + ActionController(name: '_OnBoardViewModelBase', context: context); @override void changeCurrentIndex(int value) { diff --git a/lib/view/authenticate/splash/model/force_update_model.dart b/lib/view/authenticate/splash/model/force_update_model.dart index df187fb..292d16c 100644 --- a/lib/view/authenticate/splash/model/force_update_model.dart +++ b/lib/view/authenticate/splash/model/force_update_model.dart @@ -5,14 +5,14 @@ part 'force_update_model.g.dart'; @JsonSerializable() class ForceUpdateModel extends INetworkModel { - bool? isForceUpdate; - String? type; - String? currentVersion; ForceUpdateModel({ this.isForceUpdate, this.type, this.currentVersion, }); + bool? isForceUpdate; + String? type; + String? currentVersion; @override ForceUpdateModel fromJson(Map json) { diff --git a/lib/view/authenticate/splash/model/force_update_model.g.dart b/lib/view/authenticate/splash/model/force_update_model.g.dart index a849013..031b903 100644 --- a/lib/view/authenticate/splash/model/force_update_model.g.dart +++ b/lib/view/authenticate/splash/model/force_update_model.g.dart @@ -6,13 +6,12 @@ part of 'force_update_model.dart'; // JsonSerializableGenerator // ************************************************************************** -ForceUpdateModel _$ForceUpdateModelFromJson(Map json) { - return ForceUpdateModel( - isForceUpdate: json['isForceUpdate'] as bool?, - type: json['type'] as String?, - currentVersion: json['currentVersion'] as String?, - ); -} +ForceUpdateModel _$ForceUpdateModelFromJson(Map json) => + ForceUpdateModel( + isForceUpdate: json['isForceUpdate'] as bool?, + type: json['type'] as String?, + currentVersion: json['currentVersion'] as String?, + ); Map _$ForceUpdateModelToJson(ForceUpdateModel instance) => { diff --git a/lib/view/authenticate/splash/service/splash_service.dart b/lib/view/authenticate/splash/service/splash_service.dart index 9255724..92f9280 100644 --- a/lib/view/authenticate/splash/service/splash_service.dart +++ b/lib/view/authenticate/splash/service/splash_service.dart @@ -1,14 +1,14 @@ -import 'package:flutter/cupertino.dart'; import 'package:fluttermvvmtemplate/view/authenticate/splash/model/force_update_model.dart'; import 'package:vexana/vexana.dart'; abstract class ISplashService { - final INetworkManager networkManager; - ISplashService(this.networkManager); + final INetworkManager networkManager; - Future checkDeviceVersion( - {required String version, required String platform}); + Future checkDeviceVersion({ + required String version, + required String platform, + }); } enum SplashServiceQuery { VERSION, PLATFORM } @@ -25,21 +25,24 @@ extension SplashServiceQueryExtension on SplashServiceQuery { } class SplashService extends ISplashService { - final String _path = 'version'; SplashService(INetworkManager networkManager) : super(networkManager); + final String _path = 'version'; @override - Future checkDeviceVersion( - {required String version, required String platform}) async { - final response = - await networkManager.send( + Future checkDeviceVersion({ + required String version, + required String platform, + }) async { + final response = await networkManager.send( _path, parseModel: ForceUpdateModel(), method: RequestType.GET, - queryParameters: Map.fromEntries([ - SplashServiceQuery.VERSION.toMapValue(version), - SplashServiceQuery.PLATFORM.toMapValue(platform) - ]), + queryParameters: Map.fromEntries( + [ + SplashServiceQuery.VERSION.toMapValue(version), + SplashServiceQuery.PLATFORM.toMapValue(platform), + ], + ), ); return response.data; } diff --git a/lib/view/authenticate/splash/view/splash_view.dart b/lib/view/authenticate/splash/view/splash_view.dart index cd2aebd..9b0c84c 100644 --- a/lib/view/authenticate/splash/view/splash_view.dart +++ b/lib/view/authenticate/splash/view/splash_view.dart @@ -1,13 +1,12 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/constants/image/image_constatns.dart'; import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/splash/viewmodel/splash_view_model.dart'; import 'package:kartal/kartal.dart'; -import '../../../../core/base/view/base_widget.dart'; -import '../../../../core/constants/image/image_constatns.dart'; -import '../viewmodel/splash_view_model.dart'; - class SplashView extends StatelessWidget { const SplashView({Key? key}) : super(key: key); @@ -19,8 +18,7 @@ class SplashView extends StatelessWidget { model.setContext(context); model.init(); }, - onPageBuilder: (BuildContext context, SplashViewModel value) => - buildScaffoldBody(context, value), + onPageBuilder: buildScaffoldBody, ); } @@ -28,46 +26,58 @@ class SplashView extends StatelessWidget { return Scaffold( backgroundColor: context.colorScheme.onSurface, body: SafeArea( - child: Stack( - children: [ - buildCenterTextWelcome(context, viewModel), - buildAnimatedAlignIcon(viewModel, context), - ], - )), + child: Stack( + children: [ + buildCenterTextWelcome(context, viewModel), + buildAnimatedAlignIcon(viewModel, context), + ], + ), + ), ); } Center buildCenterTextWelcome( - BuildContext context, SplashViewModel viewModel) { - return Center(child: Observer(builder: (_) { - return AnimatedOpacity( - duration: context.durationNormal, - opacity: viewModel.isFirstInit ? 0 : 1, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - LocaleKeys.splash_welcome.tr(), - style: context.textTheme.headline4?.copyWith( - fontWeight: FontWeight.w700, - color: context.colorScheme.primaryVariant), - textAlign: TextAlign.center, + BuildContext context, + SplashViewModel viewModel, + ) { + return Center( + child: Observer( + builder: (_) { + return AnimatedOpacity( + duration: context.durationNormal, + opacity: viewModel.isFirstInit ? 0 : 1, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + LocaleKeys.splash_welcome.tr(), + style: context.textTheme.headline4?.copyWith( + fontWeight: FontWeight.w700, + color: context.colorScheme.primaryContainer, + ), + textAlign: TextAlign.center, + ), + const CircularProgressIndicator.adaptive() + ], ), - CircularProgressIndicator.adaptive() - ], - ), - ); - })); + ); + }, + ), + ); } Widget buildAnimatedAlignIcon( - SplashViewModel viewModel, BuildContext context) { - return Observer(builder: (_) { - return AnimatedAlign( - alignment: - viewModel.isFirstInit ? Alignment.center : Alignment.bottomCenter, + SplashViewModel viewModel, + BuildContext context, + ) { + return Observer( + builder: (_) { + return AnimatedAlign( + alignment: viewModel.isFirstInit ? Alignment.center : Alignment.bottomCenter, duration: context.durationLow, - child: Image.asset(ImageConstants.instance.projeIcon)); - }); + child: Image.asset(ImageConstants.instance.projeIcon), + ); + }, + ); } } diff --git a/lib/view/authenticate/splash/viewmodel/device_and_cahe.dart b/lib/view/authenticate/splash/viewmodel/device_and_cahe.dart index 21df3c1..3933797 100644 --- a/lib/view/authenticate/splash/viewmodel/device_and_cahe.dart +++ b/lib/view/authenticate/splash/viewmodel/device_and_cahe.dart @@ -1,7 +1,6 @@ +import 'package:fluttermvvmtemplate/core/init/cache/locale_manager.dart'; import 'package:kartal/kartal.dart'; -import '../../../../core/init/cache/locale_manager.dart'; - mixin DeviceAndCache { Future deviceandCacheInit() async { await Future.wait([ diff --git a/lib/view/authenticate/splash/viewmodel/splash_view_model.dart b/lib/view/authenticate/splash/viewmodel/splash_view_model.dart index 6ddc025..f537de0 100644 --- a/lib/view/authenticate/splash/viewmodel/splash_view_model.dart +++ b/lib/view/authenticate/splash/viewmodel/splash_view_model.dart @@ -2,25 +2,22 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; import 'package:fluttermvvmtemplate/core/constants/navigation/navigation_constants.dart'; +import 'package:fluttermvvmtemplate/product/enum/platform_project.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/splash/model/force_update_model.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/splash/service/splash_service.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/splash/viewmodel/device_and_cahe.dart'; import 'package:kartal/kartal.dart'; -import 'package:logger/logger.dart'; import 'package:mobx/mobx.dart'; -import '../../../../core/base/model/base_view_model.dart'; -import '../../../../core/init/cache/locale_manager.dart'; -import '../../../../product/enum/platform_project.dart'; -import '../model/force_update_model.dart'; -import '../service/splash_service.dart'; -import 'device_and_cahe.dart'; - part 'splash_view_model.g.dart'; class SplashViewModel = _SplashViewModelBase with _$SplashViewModel; abstract class _SplashViewModelBase with Store, BaseViewModel, DeviceAndCache { @override - void setContext(BuildContext context) => this.context = context; + void setContext(BuildContext context) => viewModelContext = context; @observable bool isFirstInit = true; @@ -30,12 +27,12 @@ abstract class _SplashViewModelBase with Store, BaseViewModel, DeviceAndCache { @override void init() { startAnimationOnView(); - WidgetsBinding.instance?.addPostFrameCallback((timeStamp) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { controlAppState(); }); // Dummy for moduler page - Future.delayed(Duration(seconds: 1)).then((value) { + Future.delayed(const Duration(seconds: 1)).then((value) { navigation.navigateToPage(path: NavigationConstants.BUY_VIEW); }); } @@ -48,7 +45,7 @@ abstract class _SplashViewModelBase with Store, BaseViewModel, DeviceAndCache { _networkInit(); final isNeedForceUpdate = await _checkAppVersion(); if (isNeedForceUpdate) { - showAboutDialog(context: context!, children: [Text('Neeed to Update')]); + showAboutDialog(context: viewModelContext, children: [const Text('Neeed to Update')]); } else { // await navigation.navigateToPageClear(path: NavigationConstants.TEST_VIEW); } @@ -62,7 +59,9 @@ abstract class _SplashViewModelBase with Store, BaseViewModel, DeviceAndCache { Future _checkAppVersion() async { final response = await service?.checkDeviceVersion( - version: ''.version, platform: '${PlatformProject.IOS.versionNumber}'); + version: ''.version, + platform: '${PlatformProject.IOS.versionNumber}', + ); if (response is ForceUpdateModel) { return response.isForceUpdate ?? false; @@ -72,8 +71,7 @@ abstract class _SplashViewModelBase with Store, BaseViewModel, DeviceAndCache { } Future startAnimationOnView() async { - if (context == null) return; - await Future.delayed(context!.durationLow); + await Future.delayed(viewModelContext.durationLow); _changeFirstInit(); } @@ -85,10 +83,13 @@ abstract class _SplashViewModelBase with Store, BaseViewModel, DeviceAndCache { class _UserVersionCreate { static String createNumber(int number) { - var model = ForceUpdateModel(currentVersion: '1.0.3'); + final model = ForceUpdateModel(currentVersion: '1.0.3'); final data = jsonEncode(model); final lastData = jsonDecode(data); - - return ForceUpdateModel().fromJson(lastData).currentVersion ?? ''; + if (lastData is Map) { + return ForceUpdateModel().fromJson(lastData).currentVersion ?? ''; + } + // throw + return ''; } } diff --git a/lib/view/authenticate/splash/viewmodel/splash_view_model.g.dart b/lib/view/authenticate/splash/viewmodel/splash_view_model.g.dart index 050d79b..1f8c11a 100644 --- a/lib/view/authenticate/splash/viewmodel/splash_view_model.g.dart +++ b/lib/view/authenticate/splash/viewmodel/splash_view_model.g.dart @@ -6,10 +6,11 @@ part of 'splash_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$SplashViewModel on _SplashViewModelBase, Store { - final _$isFirstInitAtom = Atom(name: '_SplashViewModelBase.isFirstInit'); + late final _$isFirstInitAtom = + Atom(name: '_SplashViewModelBase.isFirstInit', context: context); @override bool get isFirstInit { @@ -24,8 +25,8 @@ mixin _$SplashViewModel on _SplashViewModelBase, Store { }); } - final _$_SplashViewModelBaseActionController = - ActionController(name: '_SplashViewModelBase'); + late final _$_SplashViewModelBaseActionController = + ActionController(name: '_SplashViewModelBase', context: context); @override void _changeFirstInit() { diff --git a/lib/view/authenticate/test/model/test_model.dart b/lib/view/authenticate/test/model/test_model.dart index b73287a..a3fea55 100644 --- a/lib/view/authenticate/test/model/test_model.dart +++ b/lib/view/authenticate/test/model/test_model.dart @@ -1,17 +1,16 @@ +import 'package:equatable/equatable.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_model.dart'; import 'package:json_annotation/json_annotation.dart'; -import '../../../../core/base/model/base_model.dart'; - part 'test_model.g.dart'; @JsonSerializable() -class TestModel extends BaseModel { - int? userId; - int? id; - String? title; - bool? completed; - +class TestModel extends BaseModel with EquatableMixin { TestModel({this.userId, this.id, this.title, this.completed}); + final int? userId; + final int? id; + final String? title; + final bool? completed; @override Map toJson() { @@ -22,4 +21,21 @@ class TestModel extends BaseModel { TestModel fromJson(Map json) { return _$TestModelFromJson(json); } + + @override + List get props => [userId, id, title, completed]; + + TestModel copyWith({ + int? userId, + int? id, + String? title, + bool? completed, + }) { + return TestModel( + userId: userId ?? this.userId, + id: id ?? this.id, + title: title ?? this.title, + completed: completed ?? this.completed, + ); + } } diff --git a/lib/view/authenticate/test/model/test_model.g.dart b/lib/view/authenticate/test/model/test_model.g.dart index 8de3c0f..7ade817 100644 --- a/lib/view/authenticate/test/model/test_model.g.dart +++ b/lib/view/authenticate/test/model/test_model.g.dart @@ -6,14 +6,12 @@ part of 'test_model.dart'; // JsonSerializableGenerator // ************************************************************************** -TestModel _$TestModelFromJson(Map json) { - return TestModel( - userId: json['userId'] as int?, - id: json['id'] as int?, - title: json['title'] as String?, - completed: json['completed'] as bool?, - ); -} +TestModel _$TestModelFromJson(Map json) => TestModel( + userId: json['userId'] as int?, + id: json['id'] as int?, + title: json['title'] as String?, + completed: json['completed'] as bool?, + ); Map _$TestModelToJson(TestModel instance) => { 'userId': instance.userId, diff --git a/lib/view/authenticate/test/view/test_view.dart b/lib/view/authenticate/test/view/test_view.dart index b194277..8511945 100644 --- a/lib/view/authenticate/test/view/test_view.dart +++ b/lib/view/authenticate/test/view/test_view.dart @@ -2,14 +2,14 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import '../../../../core/base/state/base_state.dart'; -import '../../../../core/base/view/base_widget.dart'; -import '../../../../core/constants/enums/locale_keys_enum.dart'; -import '../../../../core/extension/string_extension.dart'; -import '../../../../core/init/cache/locale_manager.dart'; -import '../../../../core/init/lang/language_manager.dart'; -import '../../../../core/init/lang/locale_keys.g.dart'; -import '../viewmodel/test_view_model.dart'; +import 'package:fluttermvvmtemplate/core/base/state/base_state.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/locale_keys_enum.dart'; +import 'package:fluttermvvmtemplate/core/extension/string_extension.dart'; +import 'package:fluttermvvmtemplate/core/init/cache/locale_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/language_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/test/viewmodel/test_view_model.dart'; class TestsView extends StatefulWidget { @override @@ -46,10 +46,11 @@ class _TestsViewState extends BaseState { IconButton iconButtonChangeTheme() { return IconButton( - icon: Icon(Icons.change_history), - onPressed: () { - context.setLocale(LanguageManager.instance.enLocale); - }); + icon: const Icon(Icons.change_history), + onPressed: () { + context.setLocale(LanguageManager.instance.enLocale); + }, + ); } Widget get textNumber { diff --git a/lib/view/authenticate/test/viewmodel/test_view_model.dart b/lib/view/authenticate/test/viewmodel/test_view_model.dart index a6e1345..08a6cec 100644 --- a/lib/view/authenticate/test/viewmodel/test_view_model.dart +++ b/lib/view/authenticate/test/viewmodel/test_view_model.dart @@ -1,13 +1,12 @@ import 'package:flutter/cupertino.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/app_theme_enum.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart'; +import 'package:fluttermvvmtemplate/core/init/notifier/theme_notifer.dart'; +import 'package:fluttermvvmtemplate/view/authenticate/test/model/test_model.dart'; import 'package:mobx/mobx.dart'; import 'package:provider/provider.dart'; -import '../../../../core/base/model/base_view_model.dart'; -import '../../../../core/constants/enums/app_theme_enum.dart'; -import '../../../../core/constants/enums/http_request_enum.dart'; -import '../../../../core/init/notifier/theme_notifer.dart'; -import '../model/test_model.dart'; - part 'test_view_model.g.dart'; class TestViewModel = _TestViewModelBase with _$TestViewModel; @@ -15,7 +14,7 @@ class TestViewModel = _TestViewModelBase with _$TestViewModel; abstract class _TestViewModelBase with Store, BaseViewModel { @override void setContext(BuildContext context) { - this.context = context; + viewModelContext = context; } @override @@ -36,7 +35,7 @@ abstract class _TestViewModelBase with Store, BaseViewModel { } void changeTheme() { - Provider.of(context!, listen: false).changeValue(AppThemes.DARK); + Provider.of(viewModelContext, listen: false).changeValue(AppThemes.DARK); } @action diff --git a/lib/view/authenticate/test/viewmodel/test_view_model.g.dart b/lib/view/authenticate/test/viewmodel/test_view_model.g.dart index 4f95173..7bffd00 100644 --- a/lib/view/authenticate/test/viewmodel/test_view_model.g.dart +++ b/lib/view/authenticate/test/viewmodel/test_view_model.g.dart @@ -6,7 +6,7 @@ part of 'test_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$TestViewModel on _TestViewModelBase, Store { Computed? _$isEvenComputed; @@ -16,7 +16,8 @@ mixin _$TestViewModel on _TestViewModelBase, Store { Computed(() => super.isEven, name: '_TestViewModelBase.isEven')) .value; - final _$isLoadingAtom = Atom(name: '_TestViewModelBase.isLoading'); + late final _$isLoadingAtom = + Atom(name: '_TestViewModelBase.isLoading', context: context); @override bool get isLoading { @@ -31,7 +32,8 @@ mixin _$TestViewModel on _TestViewModelBase, Store { }); } - final _$numberAtom = Atom(name: '_TestViewModelBase.number'); + late final _$numberAtom = + Atom(name: '_TestViewModelBase.number', context: context); @override int get number { @@ -46,16 +48,16 @@ mixin _$TestViewModel on _TestViewModelBase, Store { }); } - final _$getSampleRequestAsyncAction = - AsyncAction('_TestViewModelBase.getSampleRequest'); + late final _$getSampleRequestAsyncAction = + AsyncAction('_TestViewModelBase.getSampleRequest', context: context); @override Future getSampleRequest() { return _$getSampleRequestAsyncAction.run(() => super.getSampleRequest()); } - final _$_TestViewModelBaseActionController = - ActionController(name: '_TestViewModelBase'); + late final _$_TestViewModelBaseActionController = + ActionController(name: '_TestViewModelBase', context: context); @override void incrementNumber() { diff --git a/lib/view/home/build/feed/model/house_model.dart b/lib/view/home/build/feed/model/house_model.dart index 8b4ec29..8a72a0a 100644 --- a/lib/view/home/build/feed/model/house_model.dart +++ b/lib/view/home/build/feed/model/house_model.dart @@ -5,7 +5,9 @@ part 'house_model.g.dart'; @JsonSerializable() class HouseModel extends INetworkModel { - @JsonKey(name: "_id") + + HouseModel({this.id, this.title, this.description, this.image, this.user, this.iV}); + @JsonKey(name: '_id') String? id; String? title; String? description; @@ -13,8 +15,6 @@ class HouseModel extends INetworkModel { UserHouse? user; int? iV; - HouseModel({this.id, this.title, this.description, this.image, this.user, this.iV}); - @override HouseModel fromJson(Map json) { return _$HouseModelFromJson(json); @@ -28,22 +28,22 @@ class HouseModel extends INetworkModel { @JsonSerializable() class UserHouse extends INetworkModel { - @JsonKey(name: "_id") + + UserHouse({this.id, this.name, this.image, this.date}); + + factory UserHouse.fromJson(Map json) { + return _$UserHouseFromJson(json); + } + @JsonKey(name: '_id') String? id; String? name; String? image; String? date; - UserHouse({this.id, this.name, this.image, this.date}); - @override UserHouse fromJson(Map json) { return _$UserHouseFromJson(json); } - - factory UserHouse.fromJson(Map json) { - return _$UserHouseFromJson(json); - } @override Map toJson() { return _$UserHouseToJson(this); diff --git a/lib/view/home/build/feed/model/house_model.g.dart b/lib/view/home/build/feed/model/house_model.g.dart index 53d5f4d..aab3834 100644 --- a/lib/view/home/build/feed/model/house_model.g.dart +++ b/lib/view/home/build/feed/model/house_model.g.dart @@ -6,20 +6,18 @@ part of 'house_model.dart'; // JsonSerializableGenerator // ************************************************************************** -HouseModel _$HouseModelFromJson(Map json) { - return HouseModel( - id: json['_id'] as String?, - title: json['title'] as String?, - description: json['description'] as String?, - image: json['image'] as String?, - user: json['user'] == null - ? null - : UserHouse.fromJson((json['user'] as Map).map( - (k, e) => MapEntry(k, e as Object), - )), - iV: json['iV'] as int?, - ); -} +HouseModel _$HouseModelFromJson(Map json) => HouseModel( + id: json['_id'] as String?, + title: json['title'] as String?, + description: json['description'] as String?, + image: json['image'] as String?, + user: json['user'] == null + ? null + : UserHouse.fromJson((json['user'] as Map).map( + (k, e) => MapEntry(k, e as Object), + )), + iV: json['iV'] as int?, + ); Map _$HouseModelToJson(HouseModel instance) => { @@ -31,14 +29,12 @@ Map _$HouseModelToJson(HouseModel instance) => 'iV': instance.iV, }; -UserHouse _$UserHouseFromJson(Map json) { - return UserHouse( - id: json['_id'] as String?, - name: json['name'] as String?, - image: json['image'] as String?, - date: json['date'] as String?, - ); -} +UserHouse _$UserHouseFromJson(Map json) => UserHouse( + id: json['_id'] as String?, + name: json['name'] as String?, + image: json['image'] as String?, + date: json['date'] as String?, + ); Map _$UserHouseToJson(UserHouse instance) => { '_id': instance.id, diff --git a/lib/view/home/build/feed/service/IBuildFeedService.dart b/lib/view/home/build/feed/service/IBuildFeedService.dart index 540df3e..811bdf8 100644 --- a/lib/view/home/build/feed/service/IBuildFeedService.dart +++ b/lib/view/home/build/feed/service/IBuildFeedService.dart @@ -1,14 +1,11 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/model/house_model.dart'; import 'package:vexana/vexana.dart'; -import '../model/house_model.dart'; - abstract class IBuildFeedService { + IBuildFeedService(this.manager, this.scaffoldyKey); final INetworkManager manager; final GlobalKey scaffoldyKey; - IBuildFeedService(this.manager, this.scaffoldyKey); - Future?> fetchUserHouseList(); } diff --git a/lib/view/home/build/feed/service/build_feed_service.dart b/lib/view/home/build/feed/service/build_feed_service.dart index d7773c0..b161cd6 100644 --- a/lib/view/home/build/feed/service/build_feed_service.dart +++ b/lib/view/home/build/feed/service/build_feed_service.dart @@ -1,19 +1,20 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/service_helper.dart'; +import 'package:fluttermvvmtemplate/view/_product/enum/network_route_enum.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/model/house_model.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/service/IBuildFeedService.dart'; import 'package:vexana/vexana.dart'; -import '../../../../_product/_utilty/service_helper.dart'; -import '../../../../_product/enum/network_route_enum.dart'; -import '../model/house_model.dart'; -import 'IBuildFeedService.dart'; - class BuildFeedService extends IBuildFeedService with ServiceHelper { BuildFeedService(INetworkManager manager, GlobalKey key) : super(manager, key); @override Future?> fetchUserHouseList() async { - final response = - await manager.send>(NetworkRoutes.BUILD_HOME.rawValue, parseModel: HouseModel(), method: RequestType.GET); + final response = await manager.send>( + NetworkRoutes.BUILD_HOME.rawValue, + parseModel: HouseModel(), + method: RequestType.GET, + ); showMessage(scaffoldyKey, response.error); return response.data; } diff --git a/lib/view/home/build/feed/view/build_feed_view.dart b/lib/view/home/build/feed/view/build_feed_view.dart index 4f42a8f..a0e85b2 100644 --- a/lib/view/home/build/feed/view/build_feed_view.dart +++ b/lib/view/home/build/feed/view/build_feed_view.dart @@ -1,15 +1,16 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/view/_product/_widgets/card/build_user_card.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/model/house_model.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/viewmodel/build_feed_view_model.dart'; import 'package:kartal/kartal.dart'; -import '../../../../../core/base/view/base_widget.dart'; -import '../../../../../core/init/lang/locale_keys.g.dart'; -import '../../../../_product/_widgets/card/build_user_card.dart'; -import '../model/house_model.dart'; -import '../viewmodel/build_feed_view_model.dart'; - class BuildFeedView extends StatelessWidget { + const BuildFeedView({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { return BaseView( @@ -23,26 +24,37 @@ class BuildFeedView extends StatelessWidget { key: viewModel.scaffoldKey, appBar: buildAppBar(), body: DefaultTabController( - length: 4, - child: Observer(builder: (_) { + length: 4, + child: Observer( + builder: (_) { return viewModel.isLoaindg ? buildCenter() : viewModel.houseModels == null || viewModel.houseModels!.isEmpty - ? Center(child: Text('Not Found')) + ? const Center(child: Text('Not Found')) : buildListViewRecommended(viewModel, context); - })), + }, + ), + ), ), ); } - ListView buildListViewRecommended(BuildFeedViewModel viewModel, BuildContext context) { + ListView buildListViewRecommended( + BuildFeedViewModel viewModel, + BuildContext context, + ) { return ListView( padding: context.paddingLow, children: [ buildTabBar(viewModel), buildSizedBoxLAtestPageView(context, viewModel), context.emptySizedHeightBoxLow, - Text(LocaleKeys.home_build_subTitle.tr(), style: context.textTheme.headline5!.copyWith(fontWeight: FontWeight.w600)), + Text( + LocaleKeys.home_build_subTitle.tr(), + style: context.textTheme.headline5!.copyWith( + fontWeight: FontWeight.w600, + ), + ), context.emptySizedHeightBoxLow, buildListBottom(viewModel) ], @@ -51,37 +63,43 @@ class BuildFeedView extends StatelessWidget { ListView buildListBottom(BuildFeedViewModel viewModel) { return ListView.builder( - physics: NeverScrollableScrollPhysics(), + physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) => SizedBox( - height: context.dynamicHeight(0.15), - child: Card( - child: Row( - children: [ - Expanded(flex: 3, child: Image.network(viewModel.houseModels![index].image!)), - Expanded(flex: 9, child: buildObserver(viewModel, index)), - ], - ), - )), + height: context.dynamicHeight(0.15), + child: Card( + child: Row( + children: [ + Expanded(flex: 3, child: Image.network(viewModel.houseModels![index].image!)), + Expanded(flex: 9, child: buildObserver(viewModel, index)), + ], + ), + ), + ), itemCount: 3, shrinkWrap: true, ); } Observer buildObserver(BuildFeedViewModel viewModel, int index) { - return Observer(builder: (_) { - return BuildUserCard( - model: viewModel.houseModels![index], - isLiked: viewModel.likeItems.contains(viewModel.houseModels![index].id), - onPressedLikeId: (id) { - if (id != null) { - viewModel.onLikeItemPressed(id); - } - }, - ); - }); + return Observer( + builder: (_) { + return BuildUserCard( + model: viewModel.houseModels![index], + isLiked: viewModel.likeItems.contains(viewModel.houseModels![index].id), + onPressedLikeId: (id) { + if (id != null) { + viewModel.onLikeItemPressed(id); + } + }, + ); + }, + ); } - SizedBox buildSizedBoxLAtestPageView(BuildContext context, BuildFeedViewModel viewModel) { + SizedBox buildSizedBoxLAtestPageView( + BuildContext context, + BuildFeedViewModel viewModel, + ) { return SizedBox( height: context.dynamicHeight(0.3), child: PageView.builder( @@ -93,22 +111,26 @@ class BuildFeedView extends StatelessWidget { } TabBar buildTabBar(BuildFeedViewModel viewModel) { - return TabBar(indicator: viewModel.helper.circleDecoriaton, indicatorSize: TabBarIndicatorSize.label, tabs: [ - Tab(text: LocaleKeys.home_build_tabbar_tab1.tr()), - Tab(text: LocaleKeys.home_build_tabbar_tab2.tr()), - Tab(text: LocaleKeys.home_build_tabbar_tab3.tr()), - Tab(text: LocaleKeys.home_build_tabbar_tab4.tr()), - ]); + return TabBar( + indicator: viewModel.helper.circleDecoriaton, + indicatorSize: TabBarIndicatorSize.label, + tabs: [ + Tab(text: LocaleKeys.home_build_tabbar_tab1.tr()), + Tab(text: LocaleKeys.home_build_tabbar_tab2.tr()), + Tab(text: LocaleKeys.home_build_tabbar_tab3.tr()), + Tab(text: LocaleKeys.home_build_tabbar_tab4.tr()), + ], + ); } - Center buildCenter() => Center(child: CircularProgressIndicator()); + Center buildCenter() => const Center(child: CircularProgressIndicator()); AppBar buildAppBar() { return AppBar( backgroundColor: Colors.transparent, elevation: 0, - leading: IconButton(icon: Icon(Icons.format_align_left), onPressed: () {}), - actions: [IconButton(icon: Icon(Icons.search), onPressed: () {})], + leading: IconButton(icon: const Icon(Icons.format_align_left), onPressed: () {}), + actions: [IconButton(icon: const Icon(Icons.search), onPressed: () {})], ); } @@ -128,17 +150,19 @@ class BuildFeedView extends StatelessWidget { return Card( child: Padding( padding: context.paddingLow, - child: Observer(builder: (_) { - return BuildUserCard( - model: model, - isLiked: viewModel.likeItems.contains(model.id), - onPressedLikeId: (id) { - if (id != null) { - viewModel.onLikeItemPressed(id); - } - }, - ); - }), + child: Observer( + builder: (_) { + return BuildUserCard( + model: model, + isLiked: viewModel.likeItems.contains(model.id), + onPressedLikeId: (id) { + if (id != null) { + viewModel.onLikeItemPressed(id); + } + }, + ); + }, + ), ), ); } diff --git a/lib/view/home/build/feed/viewmodel/build_feed_view_model.dart b/lib/view/home/build/feed/viewmodel/build_feed_view_model.dart index ae4a111..c2585e3 100644 --- a/lib/view/home/build/feed/viewmodel/build_feed_view_model.dart +++ b/lib/view/home/build/feed/viewmodel/build_feed_view_model.dart @@ -1,19 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/decoration_helper.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/model/house_model.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/service/IBuildFeedService.dart'; +import 'package:fluttermvvmtemplate/view/home/build/feed/service/build_feed_service.dart'; import 'package:mobx/mobx.dart'; -import '../../../../../core/base/model/base_view_model.dart'; -import '../../../../_product/_utilty/decoration_helper.dart'; -import '../model/house_model.dart'; -import '../service/IBuildFeedService.dart'; -import '../service/build_feed_service.dart'; - part 'build_feed_view_model.g.dart'; class BuildFeedViewModel = _BuildFeedViewModelBase with _$BuildFeedViewModel; abstract class _BuildFeedViewModelBase with Store, BaseViewModel { @override - void setContext(BuildContext context) => this.context = context; + void setContext(BuildContext context) => viewModelContext = context; GlobalKey scaffoldKey = GlobalKey(); late DecorationHelper helper; @@ -43,7 +42,7 @@ abstract class _BuildFeedViewModelBase with Store, BaseViewModel { @override void init() { - helper = DecorationHelper(context: context); + helper = DecorationHelper(context: viewModelContext); feedService = BuildFeedService(vexanaManager!.networkManager, scaffoldKey); } diff --git a/lib/view/home/build/feed/viewmodel/build_feed_view_model.g.dart b/lib/view/home/build/feed/viewmodel/build_feed_view_model.g.dart index 85fb988..faaf21e 100644 --- a/lib/view/home/build/feed/viewmodel/build_feed_view_model.g.dart +++ b/lib/view/home/build/feed/viewmodel/build_feed_view_model.g.dart @@ -6,7 +6,7 @@ part of 'build_feed_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$BuildFeedViewModel on _BuildFeedViewModelBase, Store { Computed? _$sliderHouseComputed; @@ -17,7 +17,8 @@ mixin _$BuildFeedViewModel on _BuildFeedViewModelBase, Store { name: '_BuildFeedViewModelBase.sliderHouse')) .value; - final _$likeItemsAtom = Atom(name: '_BuildFeedViewModelBase.likeItems'); + late final _$likeItemsAtom = + Atom(name: '_BuildFeedViewModelBase.likeItems', context: context); @override List get likeItems { @@ -32,7 +33,8 @@ mixin _$BuildFeedViewModel on _BuildFeedViewModelBase, Store { }); } - final _$houseModelsAtom = Atom(name: '_BuildFeedViewModelBase.houseModels'); + late final _$houseModelsAtom = + Atom(name: '_BuildFeedViewModelBase.houseModels', context: context); @override List? get houseModels { @@ -47,7 +49,8 @@ mixin _$BuildFeedViewModel on _BuildFeedViewModelBase, Store { }); } - final _$isLoaindgAtom = Atom(name: '_BuildFeedViewModelBase.isLoaindg'); + late final _$isLoaindgAtom = + Atom(name: '_BuildFeedViewModelBase.isLoaindg', context: context); @override bool get isLoaindg { @@ -62,16 +65,16 @@ mixin _$BuildFeedViewModel on _BuildFeedViewModelBase, Store { }); } - final _$getListAllAsyncAction = - AsyncAction('_BuildFeedViewModelBase.getListAll'); + late final _$getListAllAsyncAction = + AsyncAction('_BuildFeedViewModelBase.getListAll', context: context); @override Future getListAll() { return _$getListAllAsyncAction.run(() => super.getListAll()); } - final _$_BuildFeedViewModelBaseActionController = - ActionController(name: '_BuildFeedViewModelBase'); + late final _$_BuildFeedViewModelBaseActionController = + ActionController(name: '_BuildFeedViewModelBase', context: context); @override void onLikeItemPressed(String id) { diff --git a/lib/view/home/burger/model/burger_model.g.dart b/lib/view/home/burger/model/burger_model.g.dart index 65c8be0..d5ef629 100644 --- a/lib/view/home/burger/model/burger_model.g.dart +++ b/lib/view/home/burger/model/burger_model.g.dart @@ -6,16 +6,14 @@ part of 'burger_model.dart'; // JsonSerializableGenerator // ************************************************************************** -BurgerModel _$BurgerModelFromJson(Map json) { - return BurgerModel() - ..id = json['_id'] as String? - ..image = json['image'] as String? - ..name = json['name'] as String? - ..price = json['price'] as int? - ..rates = json['rates'] as int? - ..isFavorite = json['isFavorite'] as bool? - ..updated = json['updated'] as String?; -} +BurgerModel _$BurgerModelFromJson(Map json) => BurgerModel() + ..id = json['_id'] as String? + ..image = json['image'] as String? + ..name = json['name'] as String? + ..price = json['price'] as int? + ..rates = json['rates'] as int? + ..isFavorite = json['isFavorite'] as bool? + ..updated = json['updated'] as String?; Map _$BurgerModelToJson(BurgerModel instance) => { diff --git a/lib/view/home/burger/service/burger_serivce.dart b/lib/view/home/burger/service/burger_serivce.dart index 5f65f82..ba3cc9a 100644 --- a/lib/view/home/burger/service/burger_serivce.dart +++ b/lib/view/home/burger/service/burger_serivce.dart @@ -1,18 +1,19 @@ +import 'package:fluttermvvmtemplate/view/_product/_mixin/network_helper.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/burger_network_enum.dart'; +import 'package:fluttermvvmtemplate/view/home/burger/model/burger_model.dart'; import 'package:vexana/vexana.dart'; -import '../../../_product/_mixin/network_helper.dart'; -import '../../../_product/_utilty/burger_network_enum.dart'; -import '../model/burger_model.dart'; - abstract class IBurgerService { - final INetworkManager manager; - IBurgerService(this.manager); + final INetworkManager manager; Future> fetchFavoriteBurgers(); Future> fetchBurgersLimited({double? max = 50, double? min = 0}); - Future> fetchBurgersSorted({required BurgerSortValues sort, BurgerSortValuesType types = BurgerSortValuesType.ASC}); + Future> fetchBurgersSorted({ + required BurgerSortValues sort, + BurgerSortValuesType types = BurgerSortValuesType.ASC, + }); } class BurgerService extends IBurgerService with NetworkHelper { @@ -20,29 +21,44 @@ class BurgerService extends IBurgerService with NetworkHelper { @override Future> fetchBurgersLimited({double? max = 50, double? min = 0}) async { - final response = await manager.send>(BurgerNetworkPath.PRICE.rawValue, - parseModel: BurgerModel(), - method: RequestType.GET, - queryParameters: Map.fromEntries([BurgerQueryParamaters.MIN.rawValue(min?.toInt()), BurgerQueryParamaters.MAX.rawValue(max?.toInt())])); + final response = await manager.send>( + BurgerNetworkPath.PRICE.rawValue, + parseModel: BurgerModel(), + method: RequestType.GET, + queryParameters: Map.fromEntries( + [BurgerQueryParamaters.MIN.rawValue(min?.toInt()), BurgerQueryParamaters.MAX.rawValue(max?.toInt())], + ), + ); return response.data ?? []; } @override - Future> fetchBurgersSorted({required BurgerSortValues sort, BurgerSortValuesType types = BurgerSortValuesType.ASC}) async { - final response = await manager.send>(BurgerNetworkPath.MAIN.rawValue, - parseModel: BurgerModel(), - method: RequestType.GET, - queryParameters: - Map.fromEntries([BurgerQueryParamaters.SORT.rawValue(sort.rawValue), BurgerQueryParamaters.SORT_TYPE.rawValue(types.rawValue)])); + Future> fetchBurgersSorted({ + required BurgerSortValues sort, + BurgerSortValuesType types = BurgerSortValuesType.ASC, + }) async { + final response = await manager.send>( + BurgerNetworkPath.MAIN.rawValue, + parseModel: BurgerModel(), + method: RequestType.GET, + queryParameters: Map.fromEntries([ + BurgerQueryParamaters.SORT.rawValue(sort.rawValue), + BurgerQueryParamaters.SORT_TYPE.rawValue(types.rawValue) + ]), + ); return response.data ?? []; } @override Future> fetchFavoriteBurgers() async { - final response = await manager.send>(BurgerNetworkPath.MAIN.rawValue, - parseModel: BurgerModel(), method: RequestType.GET, queryParameters: Map.fromEntries([BurgerQueryParamaters.FAVORITE.rawValue(true)])); + final response = await manager.send>( + BurgerNetworkPath.MAIN.rawValue, + parseModel: BurgerModel(), + method: RequestType.GET, + queryParameters: Map.fromEntries([BurgerQueryParamaters.FAVORITE.rawValue(true)]), + ); showLog(response); return response.data ?? []; } diff --git a/lib/view/home/burger/view/burgers_view.dart b/lib/view/home/burger/view/burgers_view.dart index 93c7b03..5f548b3 100644 --- a/lib/view/home/burger/view/burgers_view.dart +++ b/lib/view/home/burger/view/burgers_view.dart @@ -2,36 +2,30 @@ import 'package:architecture_widgets/architecture_widgets.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/core/init/network/vexana_manager.dart'; +import 'package:fluttermvvmtemplate/product/widget/card/burger_card.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/burger_network_enum.dart'; +import 'package:fluttermvvmtemplate/view/home/burger/service/burger_serivce.dart'; +import 'package:fluttermvvmtemplate/view/home/burger/viewmodel/burger_view_model.dart'; import 'package:kartal/kartal.dart'; -import '../../../../core/base/view/base_widget.dart'; -import '../../../../core/init/lang/locale_keys.g.dart'; -import '../../../../core/init/network/vexana_manager.dart'; -import '../../../../product/widget/card/burger_card.dart'; -import '../../../_product/_utilty/burger_network_enum.dart'; -import '../service/burger_serivce.dart'; -import '../viewmodel/burger_view_model.dart'; - -enum _BurgerViews { - BEST_SELL_TITLE, - BURGER_FOVORITE, - NORMAL_TITLE, - BURGER_VIEW -} +enum _BurgerViews { BEST_SELL_TITLE, BURGER_FOVORITE, NORMAL_TITLE, BURGER_VIEW } class BurgersView extends StatelessWidget { - final _title = 'VB BURGER'; + const BurgersView({Key? key}) : super(key: key); + + final String _title = 'VB BURGER'; @override Widget build(BuildContext context) { return BaseView( - viewModel: - BurgerViewModel(BurgerService(VexanaManager.instance.networkManager)), + viewModel: BurgerViewModel(BurgerService(VexanaManager.instance.networkManager)), onModelReady: (model) { model.setContext(context); model.init(); }, - onPageBuilder: (BuildContext context, BurgerViewModel viewModel) => - Scaffold( + onPageBuilder: (BuildContext context, BurgerViewModel viewModel) => Scaffold( appBar: buildAppBar(context, viewModel), body: buildObserverBuildbody(viewModel, context), ), @@ -39,23 +33,27 @@ class BurgersView extends StatelessWidget { } Observer buildObserverBuildbody( - BurgerViewModel viewModel, BuildContext context) { - return Observer(builder: (_) { - return viewModel.isLoading - ? buildCenterLoading() - : buildPaddingListView(context, viewModel); - }); + BurgerViewModel viewModel, + BuildContext context, + ) { + return Observer( + builder: (_) { + return viewModel.isLoading ? buildCenterLoading() : buildPaddingListView(context, viewModel); + }, + ); } Padding buildPaddingListView( - BuildContext context, BurgerViewModel viewModel) { + BuildContext context, + BurgerViewModel viewModel, + ) { return Padding( padding: context.paddingLow, child: ListView.builder( itemCount: _BurgerViews.values.length, itemBuilder: (context, index) { - final _views = _BurgerViews.values[index]; - switch (_views) { + final views = _BurgerViews.values[index]; + switch (views) { case _BurgerViews.BEST_SELL_TITLE: return buildTextBestSell(context); case _BurgerViews.BURGER_FOVORITE: @@ -75,33 +73,37 @@ class BurgersView extends StatelessWidget { title: Text( _title, style: context.textTheme.headline5?.copyWith( - fontWeight: FontWeight.w600, color: context.colorScheme.onError), + fontWeight: FontWeight.w600, + color: context.colorScheme.onError, + ), ), centerTitle: false, - leading: - Icon(Icons.food_bank_outlined, color: context.colorScheme.onError), + leading: Icon(Icons.food_bank_outlined, color: context.colorScheme.onError), actions: [ IconButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (context) => - buildBottomSheetBody(context, viewModel)); - }, - icon: Icon(Icons.filter_alt)) + onPressed: () { + showModalBottomSheet( + context: context, + builder: (context) => buildBottomSheetBody(context, viewModel), + ); + }, + icon: const Icon(Icons.filter_alt), + ) ], ); } Widget buildBottomSheetBody( - BuildContext context, BurgerViewModel viewModel) => + BuildContext context, + BurgerViewModel viewModel, + ) => Padding( padding: context.paddingLow, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Filter'), - Divider(height: 2, thickness: 2), + const Text('Filter'), + const Divider(height: 2, thickness: 2), Row( children: [ Expanded( @@ -114,10 +116,11 @@ class BurgersView extends StatelessWidget { ), ), IconButton( - onPressed: () { - viewModel.fetchMinMax(); - }, - icon: Icon(Icons.check_box_outline_blank)) + onPressed: () { + viewModel.fetchMinMax(); + }, + icon: const Icon(Icons.check_box_outline_blank), + ) ], ), Card( @@ -126,22 +129,27 @@ class BurgersView extends StatelessWidget { Wrap( spacing: 10, children: BurgerSortValues.values - .map((e) => IconButton( + .map( + (e) => IconButton( padding: EdgeInsets.zero, onPressed: () { viewModel.fetchSort(e); }, - icon: Text(e.rawValue, maxLines: 1))) + icon: Text(e.rawValue, maxLines: 1), + ), + ) .toList(), ), Row( children: [ IconButton( - onPressed: () => viewModel.changeAscending(true), - icon: Icon(Icons.plus_one)), + onPressed: () => viewModel.changeAscending(true), + icon: const Icon(Icons.plus_one), + ), IconButton( - onPressed: () => viewModel.changeAscending(true), - icon: Icon(Icons.design_services_rounded)), + onPressed: () => viewModel.changeAscending(true), + icon: const Icon(Icons.design_services_rounded), + ), ], ), ], @@ -154,8 +162,10 @@ class BurgersView extends StatelessWidget { Padding buildPaddingNormalTitle(BuildContext context) { return Padding( padding: context.verticalPaddingLow, - child: Text(LocaleKeys.home_burgers_normalProducts.tr(), - style: context.textTheme.headline5), + child: Text( + LocaleKeys.home_burgers_normalProducts.tr(), + style: context.textTheme.headline5, + ), ); } @@ -163,41 +173,52 @@ class BurgersView extends StatelessWidget { return Text( LocaleKeys.home_burgers_favoriteProducts.tr(), style: context.textTheme.headline3?.copyWith( - color: context.colorScheme.onSecondary, fontWeight: FontWeight.bold), + color: context.colorScheme.onSecondary, + fontWeight: FontWeight.bold, + ), ); } - Center buildCenterLoading() => - Center(child: CircularProgressIndicator.adaptive()); + Center buildCenterLoading() => const Center(child: CircularProgressIndicator.adaptive()); SizedBox buildSizedBoxFavorite( - BuildContext context, BurgerViewModel viewModel) => + BuildContext context, + BurgerViewModel viewModel, + ) => SizedBox( - height: context.dynamicHeight(0.3), - child: BurgerCard().buildList(viewModel.favoriteBurgerModel)); + height: context.dynamicHeight(0.3), + child: const BurgerCard().buildList(viewModel.favoriteBurgerModel), + ); Widget buildSizedBoxNormalBurgers( - BurgerViewModel viewModel, BuildContext context) { + BurgerViewModel viewModel, + BuildContext context, + ) { viewModel.fetchNormalItems(); return SizedBox( - child: Observer(builder: (_) { - return viewModel.isLoadingMain - ? SizedBox( - height: context.dynamicHeight(0.1), child: buildCenterLoading()) - : GridView.builder( - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2), - itemBuilder: (context, index) { - return BurgerCard( - model: viewModel.mainBurgerModel[index], - ); - }, - itemCount: viewModel.mainBurgerModel.length, - ); - }), + child: Observer( + builder: (_) { + return viewModel.isLoadingMain + ? SizedBox( + height: context.dynamicHeight(0.1), + child: buildCenterLoading(), + ) + : GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + ), + itemBuilder: (context, index) { + return BurgerCard( + model: viewModel.mainBurgerModel[index], + ); + }, + itemCount: viewModel.mainBurgerModel.length, + ); + }, + ), ); } } diff --git a/lib/view/home/burger/viewmodel/burger_view_model.dart b/lib/view/home/burger/viewmodel/burger_view_model.dart index 98db86c..8a82e1e 100644 --- a/lib/view/home/burger/viewmodel/burger_view_model.dart +++ b/lib/view/home/burger/viewmodel/burger_view_model.dart @@ -1,20 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/burger_network_enum.dart'; +import 'package:fluttermvvmtemplate/view/home/burger/model/burger_model.dart'; +import 'package:fluttermvvmtemplate/view/home/burger/service/burger_serivce.dart'; import 'package:kartal/kartal.dart'; import 'package:mobx/mobx.dart'; -import '../../../../core/base/model/base_view_model.dart'; -import '../../../_product/_utilty/burger_network_enum.dart'; -import '../model/burger_model.dart'; -import '../service/burger_serivce.dart'; - part 'burger_view_model.g.dart'; class BurgerViewModel = _BurgerViewModelBase with _$BurgerViewModel; abstract class _BurgerViewModelBase with Store, BaseViewModel { - final IBurgerService burgerService; - _BurgerViewModelBase(this.burgerService); + final IBurgerService burgerService; @observable bool isLoading = false; @@ -26,7 +24,7 @@ abstract class _BurgerViewModelBase with Store, BaseViewModel { @observable List mainBurgerModel = []; @override - void setContext(BuildContext context) => this.context = context; + void setContext(BuildContext context) => viewModelContext = context; RangeValues? _values; @@ -71,16 +69,19 @@ abstract class _BurgerViewModelBase with Store, BaseViewModel { @action Future fetchMinMax() async { - context?.navigation.pop(); + viewModelContext.navigation.pop(); _changeLoadingMain(); mainBurgerModel = await burgerService.fetchBurgersLimited(max: _values?.end, min: _values?.start); _changeLoadingMain(); } Future fetchSort(BurgerSortValues value) async { - context?.navigation.pop(); + viewModelContext.navigation.pop(); _changeLoadingMain(); - mainBurgerModel = await burgerService.fetchBurgersSorted(sort: value, types: _isAscending ? BurgerSortValuesType.ASC : BurgerSortValuesType.DSC); + mainBurgerModel = await burgerService.fetchBurgersSorted( + sort: value, + types: _isAscending ? BurgerSortValuesType.ASC : BurgerSortValuesType.DSC, + ); _changeLoadingMain(); } } diff --git a/lib/view/home/burger/viewmodel/burger_view_model.g.dart b/lib/view/home/burger/viewmodel/burger_view_model.g.dart index f6c4ebc..c6df23a 100644 --- a/lib/view/home/burger/viewmodel/burger_view_model.g.dart +++ b/lib/view/home/burger/viewmodel/burger_view_model.g.dart @@ -6,10 +6,11 @@ part of 'burger_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$BurgerViewModel on _BurgerViewModelBase, Store { - final _$isLoadingAtom = Atom(name: '_BurgerViewModelBase.isLoading'); + late final _$isLoadingAtom = + Atom(name: '_BurgerViewModelBase.isLoading', context: context); @override bool get isLoading { @@ -24,7 +25,8 @@ mixin _$BurgerViewModel on _BurgerViewModelBase, Store { }); } - final _$isLoadingMainAtom = Atom(name: '_BurgerViewModelBase.isLoadingMain'); + late final _$isLoadingMainAtom = + Atom(name: '_BurgerViewModelBase.isLoadingMain', context: context); @override bool get isLoadingMain { @@ -39,8 +41,8 @@ mixin _$BurgerViewModel on _BurgerViewModelBase, Store { }); } - final _$favoriteBurgerModelAtom = - Atom(name: '_BurgerViewModelBase.favoriteBurgerModel'); + late final _$favoriteBurgerModelAtom = + Atom(name: '_BurgerViewModelBase.favoriteBurgerModel', context: context); @override List get favoriteBurgerModel { @@ -55,8 +57,8 @@ mixin _$BurgerViewModel on _BurgerViewModelBase, Store { }); } - final _$mainBurgerModelAtom = - Atom(name: '_BurgerViewModelBase.mainBurgerModel'); + late final _$mainBurgerModelAtom = + Atom(name: '_BurgerViewModelBase.mainBurgerModel', context: context); @override List get mainBurgerModel { @@ -71,32 +73,32 @@ mixin _$BurgerViewModel on _BurgerViewModelBase, Store { }); } - final _$fetchFavoriteAsyncAction = - AsyncAction('_BurgerViewModelBase.fetchFavorite'); + late final _$fetchFavoriteAsyncAction = + AsyncAction('_BurgerViewModelBase.fetchFavorite', context: context); @override Future fetchFavorite() { return _$fetchFavoriteAsyncAction.run(() => super.fetchFavorite()); } - final _$fetchNormalItemsAsyncAction = - AsyncAction('_BurgerViewModelBase.fetchNormalItems'); + late final _$fetchNormalItemsAsyncAction = + AsyncAction('_BurgerViewModelBase.fetchNormalItems', context: context); @override Future fetchNormalItems() { return _$fetchNormalItemsAsyncAction.run(() => super.fetchNormalItems()); } - final _$fetchMinMaxAsyncAction = - AsyncAction('_BurgerViewModelBase.fetchMinMax'); + late final _$fetchMinMaxAsyncAction = + AsyncAction('_BurgerViewModelBase.fetchMinMax', context: context); @override Future fetchMinMax() { return _$fetchMinMaxAsyncAction.run(() => super.fetchMinMax()); } - final _$_BurgerViewModelBaseActionController = - ActionController(name: '_BurgerViewModelBase'); + late final _$_BurgerViewModelBaseActionController = + ActionController(name: '_BurgerViewModelBase', context: context); @override void _changeLoading() { diff --git a/lib/view/home/game/model/game_model.dart b/lib/view/home/game/model/game_model.dart index c528a4b..dd822e0 100644 --- a/lib/view/home/game/model/game_model.dart +++ b/lib/view/home/game/model/game_model.dart @@ -5,12 +5,6 @@ part 'game_model.g.dart'; @JsonSerializable() class GameModel extends INetworkModel { - @JsonKey(name: '_id') - String? sId; - String? image; - String? name; - int? money; - int? category; GameModel({ this.sId, this.image, @@ -18,6 +12,12 @@ class GameModel extends INetworkModel { this.money, this.category, }); + @JsonKey(name: '_id') + String? sId; + String? image; + String? name; + int? money; + int? category; @override GameModel fromJson(Map json) { diff --git a/lib/view/home/game/model/game_model.g.dart b/lib/view/home/game/model/game_model.g.dart index bb3b11f..388ed67 100644 --- a/lib/view/home/game/model/game_model.g.dart +++ b/lib/view/home/game/model/game_model.g.dart @@ -6,15 +6,13 @@ part of 'game_model.dart'; // JsonSerializableGenerator // ************************************************************************** -GameModel _$GameModelFromJson(Map json) { - return GameModel( - sId: json['_id'] as String?, - image: json['image'] as String?, - name: json['name'] as String?, - money: json['money'] as int?, - category: json['category'] as int?, - ); -} +GameModel _$GameModelFromJson(Map json) => GameModel( + sId: json['_id'] as String?, + image: json['image'] as String?, + name: json['name'] as String?, + money: json['money'] as int?, + category: json['category'] as int?, + ); Map _$GameModelToJson(GameModel instance) => { '_id': instance.sId, diff --git a/lib/view/home/game/model/game_view_state.dart b/lib/view/home/game/model/game_view_state.dart index 392c7f3..5708814 100644 --- a/lib/view/home/game/model/game_view_state.dart +++ b/lib/view/home/game/model/game_view_state.dart @@ -1,3 +1,5 @@ +// ignore_for_file: constant_identifier_names + enum GameViewItems { SEARCH_BAR, TABBAR, diff --git a/lib/view/home/game/model/slider_model.dart b/lib/view/home/game/model/slider_model.dart index d214776..4053cb9 100644 --- a/lib/view/home/game/model/slider_model.dart +++ b/lib/view/home/game/model/slider_model.dart @@ -5,12 +5,12 @@ part 'slider_model.g.dart'; @JsonSerializable() class SliderModel extends INetworkModel { + + SliderModel({this.image, this.text, this.detailId}); final String? image; final String? text; final String? detailId; - SliderModel({this.image, this.text, this.detailId}); - @override SliderModel fromJson(Map json) { return _$SliderModelFromJson(json); diff --git a/lib/view/home/game/model/slider_model.g.dart b/lib/view/home/game/model/slider_model.g.dart index 73b984f..8f552f2 100644 --- a/lib/view/home/game/model/slider_model.g.dart +++ b/lib/view/home/game/model/slider_model.g.dart @@ -6,13 +6,11 @@ part of 'slider_model.dart'; // JsonSerializableGenerator // ************************************************************************** -SliderModel _$SliderModelFromJson(Map json) { - return SliderModel( - image: json['image'] as String?, - text: json['text'] as String?, - detailId: json['detailId'] as String?, - ); -} +SliderModel _$SliderModelFromJson(Map json) => SliderModel( + image: json['image'] as String?, + text: json['text'] as String?, + detailId: json['detailId'] as String?, + ); Map _$SliderModelToJson(SliderModel instance) => { diff --git a/lib/view/home/game/service/IGameService.dart b/lib/view/home/game/service/IGameService.dart index 29a42f5..4e14b95 100644 --- a/lib/view/home/game/service/IGameService.dart +++ b/lib/view/home/game/service/IGameService.dart @@ -1,16 +1,14 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_enums.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_model.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/slider_model.dart'; import 'package:vexana/vexana.dart'; -import '../model/game_enums.dart'; -import '../model/game_model.dart'; -import '../model/slider_model.dart'; - abstract class IGameService { + IGameService(this.manager, this.scaffoldyKey); final INetworkManager manager; final GlobalKey scaffoldyKey; - IGameService(this.manager, this.scaffoldyKey); - Future?> fetchSliderItems(); Future?> fetchGameItems(GameEnum type); } diff --git a/lib/view/home/game/service/game_service.dart b/lib/view/home/game/service/game_service.dart index 24b4cb2..7d7338a 100644 --- a/lib/view/home/game/service/game_service.dart +++ b/lib/view/home/game/service/game_service.dart @@ -1,30 +1,36 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/service_helper.dart'; +import 'package:fluttermvvmtemplate/view/_product/enum/network_route_enum.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_enums.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_model.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/slider_model.dart'; +import 'package:fluttermvvmtemplate/view/home/game/service/IGameService.dart'; import 'package:vexana/vexana.dart'; -import '../../../_product/_utilty/service_helper.dart'; -import '../../../_product/enum/network_route_enum.dart'; -import '../model/game_enums.dart'; -import '../model/game_model.dart'; -import '../model/slider_model.dart'; -import 'IGameService.dart'; - class GameService extends IGameService with ServiceHelper { GameService(INetworkManager manager, GlobalKey scaffoldyKey) : super(manager, scaffoldyKey); @override Future?> fetchGameItems(GameEnum type) async { - final response = await manager.send>(NetworkRoutes.GAME.rawValue, - urlSuffix: '/${type.index + 1}', parseModel: GameModel(), method: RequestType.GET); + final response = await manager.send>( + NetworkRoutes.GAME.rawValue, + urlSuffix: '/${type.index + 1}', + parseModel: GameModel(), + method: RequestType.GET, + ); showMessage(scaffoldyKey, response.error); - await Future.delayed(Duration(seconds: 5)); + await Future.delayed(const Duration(seconds: 5)); return response.data; } @override Future?> fetchSliderItems() async { - final response = - await manager.send>(NetworkRoutes.SLIDER.rawValue, parseModel: SliderModel(), method: RequestType.GET); + final response = await manager.send>( + NetworkRoutes.SLIDER.rawValue, + parseModel: SliderModel(), + method: RequestType.GET, + ); showMessage(scaffoldyKey, response.error); return response.data; } diff --git a/lib/view/home/game/view/game_view.dart b/lib/view/home/game/view/game_view.dart index a724c82..3502373 100644 --- a/lib/view/home/game/view/game_view.dart +++ b/lib/view/home/game/view/game_view.dart @@ -1,43 +1,46 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/core/init/network/vexana_manager.dart'; +import 'package:fluttermvvmtemplate/product/widget/button/header_button.dart'; +import 'package:fluttermvvmtemplate/product/widget/grid/game_grid_view.dart'; +import 'package:fluttermvvmtemplate/product/widget/pageview/game_slider.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_model.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_view_state.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/slider_model.dart'; +import 'package:fluttermvvmtemplate/view/home/game/service/game_service.dart'; +import 'package:fluttermvvmtemplate/view/home/game/viewmodel/game_view_model.dart'; import 'package:kartal/kartal.dart'; import 'package:shimmer/shimmer.dart'; -import '../../../../core/base/view/base_widget.dart'; -import '../../../../core/init/lang/locale_keys.g.dart'; -import '../../../../core/init/network/vexana_manager.dart'; -import '../../../../product/widget/button/header_button.dart'; -import '../../../../product/widget/grid/game_grid_view.dart'; -import '../../../../product/widget/pageview/game_slider.dart'; -import '../model/game_model.dart'; -import '../model/game_view_state.dart'; -import '../model/slider_model.dart'; -import '../service/game_service.dart'; -import '../viewmodel/game_view_model.dart'; - part './subview/game_view_cards.dart'; class GameView extends StatelessWidget { - final GlobalKey _scaffoldyKey = GlobalKey(); + final GlobalKey _scaffoldKey = GlobalKey(); @override Widget build(BuildContext context) { return BaseView( - viewModel: GameViewModel(GameService(VexanaManager.instance.networkManager, _scaffoldyKey)), + viewModel: GameViewModel(GameService( + VexanaManager.instance.networkManager, + _scaffoldKey, + )), onModelReady: (model) { model.setContext(context); model.init(); }, onPageBuilder: (BuildContext context, GameViewModel value) => Scaffold( - key: _scaffoldyKey, + key: _scaffoldKey, appBar: buildAppBar(context), - body: Observer(builder: (_) { - return value.isLoading - ? Center(child: CircularProgressIndicator()) - : DefaultTabController( - length: value.gameTabItems.length, - child: ListView.builder( + body: Observer( + builder: (_) { + return value.isLoading + ? const Center(child: CircularProgressIndicator()) + : DefaultTabController( + length: value.gameTabItems.length, + child: ListView.builder( itemCount: GameViewItems.values.length, itemBuilder: (context, index) { switch (GameViewItems.values[index]) { @@ -46,25 +49,29 @@ class GameView extends StatelessWidget { case GameViewItems.TABBAR: return buildTabBar(context, value); case GameViewItems.SLIDER: - return buildSizedBoxSlider(context, value.sliderItems); + return buildSizedBoxSlider( + context, + value.sliderItems, + ); case GameViewItems.NEW_UPDATE_GAMES_CARD: return buildColumnNewCard(value); case GameViewItems.TOP_UPDATE_GAMES_CARD: return buildColumnUpdate(value); - default: - throw Exception('STATE NOT FOUND'); // return Card(child: Text("data")); } - })); - }), + }, + ), + ); + }, + ), ), ); } AppBar buildAppBar(BuildContext context) { return AppBar( - leading: Icon(Icons.rounded_corner), - actions: [IconButton(icon: Icon(Icons.camera_enhance), onPressed: () {})], + leading: const Icon(Icons.rounded_corner), + actions: [IconButton(icon: const Icon(Icons.camera_enhance), onPressed: () {})], title: Text( LocaleKeys.home_game_title.tr(), style: context.textTheme.headline5!.copyWith(color: context.colorScheme.onError, fontWeight: FontWeight.w600), @@ -74,15 +81,18 @@ class GameView extends StatelessWidget { TabBar buildTabBar(BuildContext context, GameViewModel value) { return TabBar( - isScrollable: true, - indicatorColor: context.colorScheme.onError, - labelPadding: EdgeInsets.zero, - indicatorWeight: 3, - tabs: value.gameTabItems - .map((e) => Tab( - child: Padding(padding: context.paddingLow, child: Text(e.tr())), - )) - .toList()); + isScrollable: true, + indicatorColor: context.colorScheme.onError, + labelPadding: EdgeInsets.zero, + indicatorWeight: 3, + tabs: value.gameTabItems + .map( + (e) => Tab( + child: Padding(padding: context.paddingLow, child: Text(e.tr())), + ), + ) + .toList(), + ); } Widget buildSizedBoxSlider(BuildContext context, List? items) { @@ -100,7 +110,7 @@ class GameView extends StatelessWidget { Padding buildPaddingSearchBar(BuildContext context) { return Padding( padding: context.paddingLow, - child: TextField( + child: const TextField( decoration: InputDecoration(prefixIcon: Icon(Icons.search)), ), ); diff --git a/lib/view/home/game/view/subview/game_view_cards.dart b/lib/view/home/game/view/subview/game_view_cards.dart index cb2f389..9495592 100644 --- a/lib/view/home/game/view/subview/game_view_cards.dart +++ b/lib/view/home/game/view/subview/game_view_cards.dart @@ -2,43 +2,46 @@ part of '../game_view.dart'; extension _GameViewGamesCard on GameView { Widget buildColumnNewCard(GameViewModel viewModel) { - return viewModel.onNewsGameItems().toBuild?>( - onSuccess: (data) { - return Column( - children: [HeaderButton(titleText: LocaleKeys.home_game_newUpdate), GameGrid(models: data)], - ); - }, - loadingWidget: SizedBox( - height: 200, - width: 100, - child: Shimmer.fromColors( - baseColor: Colors.grey, - highlightColor: Colors.grey[200]!, - child: ListTile( - leading: CircleAvatar(), - title: Text('data'), - subtitle: Text('data'), + return viewModel.onNewsGameItems().toBuild( + onSuccess: (data) { + return Column( + children: [const HeaderButton(titleText: LocaleKeys.home_game_newUpdate), GameGrid(models: data)], + ); + }, + loadingWidget: SizedBox( + height: 200, + width: 100, + child: Shimmer.fromColors( + baseColor: Colors.grey, + highlightColor: Colors.grey[200]!, + child: const ListTile( + leading: CircleAvatar(), + title: Text('data'), + subtitle: Text('data'), + ), ), ), - ), - notFoundWidget: Text('data'), - onError: Text('data')); + data: [], + notFoundWidget: const Text('data'), + onError: const Text('data'), + ); } Widget buildColumnUpdate(GameViewModel viewModel) { - return viewModel.onNewsGameItems().toBuild?>( - onSuccess: (data) { - return Column( - children: [ - HeaderButton(titleText: LocaleKeys.home_game_topDownload), - GameGrid( - models: data, - ) - ], - ); - }, - loadingWidget: CircularProgressIndicator(), - notFoundWidget: Text('data'), - onError: Text('data')); + return viewModel.onNewsGameItems().toBuild( + onSuccess: (data) { + return Column( + children: [ + const HeaderButton(titleText: LocaleKeys.home_game_topDownload), + GameGrid( + models: data, + ) + ], + ); + }, + loadingWidget: const CircularProgressIndicator(), + notFoundWidget: const Text('data'), + onError: const Text('data'), + ); } } diff --git a/lib/view/home/game/viewmodel/game_view_model.dart b/lib/view/home/game/viewmodel/game_view_model.dart index d984825..79409f0 100644 --- a/lib/view/home/game/viewmodel/game_view_model.dart +++ b/lib/view/home/game/viewmodel/game_view_model.dart @@ -1,18 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_enums.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/game_model.dart'; +import 'package:fluttermvvmtemplate/view/home/game/model/slider_model.dart'; +import 'package:fluttermvvmtemplate/view/home/game/service/game_service.dart'; import 'package:mobx/mobx.dart'; -import '../../../../core/base/model/base_view_model.dart'; -import '../../../../core/init/lang/locale_keys.g.dart'; -import '../model/game_enums.dart'; -import '../model/game_model.dart'; -import '../model/slider_model.dart'; -import '../service/game_service.dart'; - part 'game_view_model.g.dart'; class GameViewModel = _GameViewModelBase with _$GameViewModel; abstract class _GameViewModelBase with Store, BaseViewModel { + _GameViewModelBase(this.gameService); final List gameTabItems = [ LocaleKeys.home_game_tabbar_tab1, LocaleKeys.home_game_tabbar_tab2, @@ -26,10 +26,9 @@ abstract class _GameViewModelBase with Store, BaseViewModel { List? sliderItems = []; List newsGameItems = []; List topGameITems = []; - _GameViewModelBase(this.gameService); @override - void setContext(BuildContext context) => this.context = context; + void setContext(BuildContext context) => viewModelContext = context; @observable bool isLoading = false; diff --git a/lib/view/home/game/viewmodel/game_view_model.g.dart b/lib/view/home/game/viewmodel/game_view_model.g.dart index 50910c0..6a44b32 100644 --- a/lib/view/home/game/viewmodel/game_view_model.g.dart +++ b/lib/view/home/game/viewmodel/game_view_model.g.dart @@ -6,10 +6,11 @@ part of 'game_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$GameViewModel on _GameViewModelBase, Store { - final _$isLoadingAtom = Atom(name: '_GameViewModelBase.isLoading'); + late final _$isLoadingAtom = + Atom(name: '_GameViewModelBase.isLoading', context: context); @override bool get isLoading { @@ -24,16 +25,16 @@ mixin _$GameViewModel on _GameViewModelBase, Store { }); } - final _$fetchSliderItemsAsyncAction = - AsyncAction('_GameViewModelBase.fetchSliderItems'); + late final _$fetchSliderItemsAsyncAction = + AsyncAction('_GameViewModelBase.fetchSliderItems', context: context); @override Future fetchSliderItems() { return _$fetchSliderItemsAsyncAction.run(() => super.fetchSliderItems()); } - final _$_GameViewModelBaseActionController = - ActionController(name: '_GameViewModelBase'); + late final _$_GameViewModelBaseActionController = + ActionController(name: '_GameViewModelBase', context: context); @override void changeLoading() { diff --git a/lib/view/home/social/model/social_user_model.dart b/lib/view/home/social/model/social_user_model.dart index 52b1f53..85f0724 100644 --- a/lib/view/home/social/model/social_user_model.dart +++ b/lib/view/home/social/model/social_user_model.dart @@ -5,11 +5,6 @@ part 'social_user_model.g.dart'; @JsonSerializable() class SocialUser extends INetworkModel { - @JsonKey(name: '_id') - String? id; - String? name; - String? company; - String? image; SocialUser({this.name, this.company, this.image}); @@ -19,6 +14,11 @@ class SocialUser extends INetworkModel { company = json['company'] as String?; image = json['image'] as String?; } + @JsonKey(name: '_id') + String? id; + String? name; + String? company; + String? image; @override Map toJson() { diff --git a/lib/view/home/social/model/social_user_model.g.dart b/lib/view/home/social/model/social_user_model.g.dart index 7ca97da..80a5e32 100644 --- a/lib/view/home/social/model/social_user_model.g.dart +++ b/lib/view/home/social/model/social_user_model.g.dart @@ -6,13 +6,11 @@ part of 'social_user_model.dart'; // JsonSerializableGenerator // ************************************************************************** -SocialUser _$SocialUserFromJson(Map json) { - return SocialUser( - name: json['name'] as String?, - company: json['company'] as String?, - image: json['image'] as String?, - )..id = json['_id'] as String?; -} +SocialUser _$SocialUserFromJson(Map json) => SocialUser( + name: json['name'] as String?, + company: json['company'] as String?, + image: json['image'] as String?, + )..id = json['_id'] as String?; Map _$SocialUserToJson(SocialUser instance) => { diff --git a/lib/view/home/social/service/ISocialService.dart b/lib/view/home/social/service/ISocialService.dart index 48934b7..892d888 100644 --- a/lib/view/home/social/service/ISocialService.dart +++ b/lib/view/home/social/service/ISocialService.dart @@ -1,16 +1,13 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/view/_product/_model/query/friend_query.dart'; +import 'package:fluttermvvmtemplate/view/home/social/model/social_user_model.dart'; import 'package:vexana/vexana.dart'; -import '../../../_product/_model/query/friend_query.dart'; -import '../model/social_user_model.dart'; - abstract class ISocialServiceService { + ISocialServiceService(this.manager, this.scaffoldyKey); final INetworkManager manager; final GlobalKey? scaffoldyKey; - ISocialServiceService(this.manager, this.scaffoldyKey); - Future> fetchUserHouseList(FriendQuery query); Future> fetchUserNameQuery(String text); Future fetchUser(id); diff --git a/lib/view/home/social/service/socail_service.dart b/lib/view/home/social/service/socail_service.dart index 72cb6f2..4e3fac9 100644 --- a/lib/view/home/social/service/socail_service.dart +++ b/lib/view/home/social/service/socail_service.dart @@ -1,32 +1,36 @@ import 'package:flutter/src/material/scaffold.dart'; import 'package:flutter/src/widgets/framework.dart'; -import 'package:vexana/src/interface/INetworkService.dart'; +import 'package:fluttermvvmtemplate/view/_product/_model/query/friend_query.dart'; +import 'package:fluttermvvmtemplate/view/_product/_model/query/friend_query_enum.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/service_helper.dart'; +import 'package:fluttermvvmtemplate/view/_product/enum/network_route_enum.dart'; +import 'package:fluttermvvmtemplate/view/home/social/model/social_user_model.dart'; +import 'package:fluttermvvmtemplate/view/home/social/service/ISocialService.dart'; import 'package:vexana/vexana.dart'; -import '../../../_product/_model/query/friend_query.dart'; -import '../../../_product/_model/query/friend_query_enum.dart'; -import '../../../_product/_utilty/service_helper.dart'; -import '../../../_product/enum/network_route_enum.dart'; -import '../model/social_user_model.dart'; -import 'ISocialService.dart'; - class SocailService extends ISocialServiceService with ServiceHelper { SocailService(INetworkManager manager, GlobalKey? scaffoldyKey) : super(manager, scaffoldyKey); @override Future fetchUser(id) async { - final response = await manager.send(NetworkRoutes.FRIENDS.rawValue, - parseModel: SocialUser(), urlSuffix: '/$id', method: RequestType.GET); + final response = await manager.send( + NetworkRoutes.FRIENDS.rawValue, + parseModel: SocialUser(), + urlSuffix: '/$id', + method: RequestType.GET, + ); showMessage(scaffoldyKey, response.error); return response.data; } @override Future> fetchUserHouseList(FriendQuery query) async { - final response = await manager.send>(NetworkRoutes.FRIENDS.rawValue, - parseModel: SocialUser(), - queryParameters: {FriendQueryEnum.LIMIT.rawValue: query.limit, FriendQueryEnum.Q.rawValue: query.q}, - method: RequestType.GET); + final response = await manager.send>( + NetworkRoutes.FRIENDS.rawValue, + parseModel: SocialUser(), + queryParameters: {FriendQueryEnum.LIMIT.rawValue: query.limit, FriendQueryEnum.Q.rawValue: query.q}, + method: RequestType.GET, + ); showMessage(scaffoldyKey, response.error); return response.data ?? []; } diff --git a/lib/view/home/social/view/social_view.dart b/lib/view/home/social/view/social_view.dart index aef4fbf..645253c 100644 --- a/lib/view/home/social/view/social_view.dart +++ b/lib/view/home/social/view/social_view.dart @@ -1,17 +1,18 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; import 'package:fluttermvvmtemplate/core/init/network/vexana_manager.dart'; +import 'package:fluttermvvmtemplate/view/_product/_widgets/animation/social_card_animation.dart'; +import 'package:fluttermvvmtemplate/view/_product/_widgets/list-tile/friend_card.dart'; import 'package:fluttermvvmtemplate/view/home/social/service/socail_service.dart'; +import 'package:fluttermvvmtemplate/view/home/social/viewmodel/social_view_model.dart'; import 'package:kartal/kartal.dart'; -import '../../../../core/base/view/base_widget.dart'; -import '../../../../core/init/lang/locale_keys.g.dart'; -import '../../../_product/_widgets/animation/social_card_animation.dart'; -import '../../../_product/_widgets/list-tile/friend_card.dart'; -import '../viewmodel/social_view_model.dart'; - class SocialView extends StatelessWidget { + SocialView({Key? key}) : super(key: key); + final GlobalKey scaffoldKey = GlobalKey(); @override @@ -31,14 +32,16 @@ class SocialView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ buildTextFindFriends(context).tr(), - Spacer(flex: 2), + const Spacer(flex: 2), TextField( onChanged: (value) { viewModel.fetchAllSearchQuery(value); }, - decoration: InputDecoration(prefixIcon: Icon(Icons.search, color: context.colorScheme.onSecondary.withOpacity(0.2))), + decoration: InputDecoration( + prefixIcon: Icon(Icons.search, color: context.colorScheme.onSecondary.withOpacity(0.2)), + ), ), - Spacer(flex: 2), + const Spacer(flex: 2), Expanded(flex: 90, child: Observer(builder: (_) => buildListViewUser(viewModel))) ], ), @@ -51,17 +54,21 @@ class SocialView extends StatelessWidget { return AppBar( backgroundColor: Colors.transparent, elevation: 0, - leading: FlatButton(onPressed: () {}, padding: EdgeInsets.zero, child: Text(LocaleKeys.home_social_cancel).tr()), + leading: TextButton( + onPressed: () {}, + child: const Text(LocaleKeys.home_social_cancel).tr(), + ), actions: [ - FlatButton( - onPressed: () {}, - child: Text( - LocaleKeys.home_social_next, - style: context.textTheme.subtitle1!.copyWith( - fontWeight: FontWeight.w600, - color: context.appTheme.buttonTheme.colorScheme!.onError, - ), - ).tr()) + TextButton( + onPressed: () {}, + child: Text( + LocaleKeys.home_social_next, + style: context.textTheme.subtitle1!.copyWith( + fontWeight: FontWeight.w600, + color: context.appTheme.buttonTheme.colorScheme!.onError, + ), + ).tr(), + ) ], ); } diff --git a/lib/view/home/social/view/social_view_detial.dart b/lib/view/home/social/view/social_view_detial.dart index 1221655..7816072 100644 --- a/lib/view/home/social/view/social_view_detial.dart +++ b/lib/view/home/social/view/social_view_detial.dart @@ -1,36 +1,35 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/init/network/vexana_manager.dart'; +import 'package:fluttermvvmtemplate/view/home/social/model/social_user_model.dart'; +import 'package:fluttermvvmtemplate/view/home/social/service/ISocialService.dart'; +import 'package:fluttermvvmtemplate/view/home/social/service/socail_service.dart'; import 'package:kartal/kartal.dart'; import 'package:vexana/vexana.dart'; -import '../../../../core/init/network/vexana_manager.dart'; -import '../model/social_user_model.dart'; -import '../service/ISocialService.dart'; -import '../service/socail_service.dart'; - class SocialUserViewDetail extends StatelessWidget { + SocialUserViewDetail({ + Key? key, + this.socialUser, + }) : super(key: key); final SocialUser? socialUser; final INetworkManager manager = VexanaManager.instance.networkManager; ISocialServiceService get socialServiceService => SocailService(manager, null); - - SocialUserViewDetail({ - Key? key, - this.socialUser, - }) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), - body: socialServiceService.fetchUser(socialUser!.id).toBuild( - onSuccess: (data) { - return Center(child: Image.network(data!.image!)); - }, - loadingWidget: CircularProgressIndicator(), - notFoundWidget: Center( - child: Text('Not Found'), + body: socialServiceService.fetchUser(socialUser!.id).toBuild( + onSuccess: (data) { + return Center(child: Image.network(data!.image!)); + }, + loadingWidget: const CircularProgressIndicator(), + notFoundWidget: const Center( + child: Text('Not Found'), + ), + onError: const Text('errro'), ), - onError: Text('errro')), ); } } diff --git a/lib/view/home/social/viewmodel/social_view_model.dart b/lib/view/home/social/viewmodel/social_view_model.dart index 9ef796f..633eb29 100644 --- a/lib/view/home/social/viewmodel/social_view_model.dart +++ b/lib/view/home/social/viewmodel/social_view_model.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; +import 'package:fluttermvvmtemplate/view/_product/_model/query/friend_query.dart'; +import 'package:fluttermvvmtemplate/view/_product/_utilty/thorottle_helper.dart'; +import 'package:fluttermvvmtemplate/view/home/social/model/social_user_model.dart'; +import 'package:fluttermvvmtemplate/view/home/social/service/ISocialService.dart'; import 'package:mobx/mobx.dart'; -import '../../../../core/base/model/base_view_model.dart'; -import '../../../_product/_model/query/friend_query.dart'; -import '../../../_product/_utilty/thorottle_helper.dart'; -import '../model/social_user_model.dart'; -import '../service/ISocialService.dart'; - part 'social_view_model.g.dart'; class SocialViewModel = _SocialViewModelBase with _$SocialViewModel; abstract class _SocialViewModelBase with Store, BaseViewModel { + _SocialViewModelBase(this._socialService); final ISocialServiceService _socialService; int _page = 0; String? _query = ''; @@ -28,10 +28,8 @@ abstract class _SocialViewModelBase with Store, BaseViewModel { @observable bool isPageLoadingLazyLoad = false; - _SocialViewModelBase(this._socialService); - @override - void setContext(BuildContext? context) => this.context = context; + void setContext(BuildContext context) => viewModelContext = context; @override void init() { _throttleStringHelper = ThrottleStringHelper(); diff --git a/lib/view/home/social/viewmodel/social_view_model.g.dart b/lib/view/home/social/viewmodel/social_view_model.g.dart index f3b1d93..545e7e6 100644 --- a/lib/view/home/social/viewmodel/social_view_model.g.dart +++ b/lib/view/home/social/viewmodel/social_view_model.g.dart @@ -6,11 +6,11 @@ part of 'social_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$SocialViewModel on _SocialViewModelBase, Store { - final _$socialUserListAtom = - Atom(name: '_SocialViewModelBase.socialUserList'); + late final _$socialUserListAtom = + Atom(name: '_SocialViewModelBase.socialUserList', context: context); @override List get socialUserList { @@ -25,7 +25,8 @@ mixin _$SocialViewModel on _SocialViewModelBase, Store { }); } - final _$isPageLoadingAtom = Atom(name: '_SocialViewModelBase.isPageLoading'); + late final _$isPageLoadingAtom = + Atom(name: '_SocialViewModelBase.isPageLoading', context: context); @override bool get isPageLoading { @@ -40,8 +41,8 @@ mixin _$SocialViewModel on _SocialViewModelBase, Store { }); } - final _$isPageLoadingLazyLoadAtom = - Atom(name: '_SocialViewModelBase.isPageLoadingLazyLoad'); + late final _$isPageLoadingLazyLoadAtom = Atom( + name: '_SocialViewModelBase.isPageLoadingLazyLoad', context: context); @override bool get isPageLoadingLazyLoad { @@ -57,16 +58,16 @@ mixin _$SocialViewModel on _SocialViewModelBase, Store { }); } - final _$_fetchAllUserAsyncAction = - AsyncAction('_SocialViewModelBase._fetchAllUser'); + late final _$_fetchAllUserAsyncAction = + AsyncAction('_SocialViewModelBase._fetchAllUser', context: context); @override Future _fetchAllUser() { return _$_fetchAllUserAsyncAction.run(() => super._fetchAllUser()); } - final _$fetchAllUserLoadingAsyncAction = - AsyncAction('_SocialViewModelBase.fetchAllUserLoading'); + late final _$fetchAllUserLoadingAsyncAction = + AsyncAction('_SocialViewModelBase.fetchAllUserLoading', context: context); @override Future fetchAllUserLoading(int index) { @@ -74,8 +75,8 @@ mixin _$SocialViewModel on _SocialViewModelBase, Store { .run(() => super.fetchAllUserLoading(index)); } - final _$_SocialViewModelBaseActionController = - ActionController(name: '_SocialViewModelBase'); + late final _$_SocialViewModelBaseActionController = + ActionController(name: '_SocialViewModelBase', context: context); @override void fetchAllSearchQuery(String text) { diff --git a/lib/view/settings/model/settings_dynamic.dart b/lib/view/settings/model/settings_dynamic.dart index b93289d..4f57900 100644 --- a/lib/view/settings/model/settings_dynamic.dart +++ b/lib/view/settings/model/settings_dynamic.dart @@ -1,12 +1,10 @@ class SettingsDynamicModel { - final String? url; - final String title; SettingsDynamicModel(this.title, {this.url}); factory SettingsDynamicModel.fakeArchitecturePR() { return SettingsDynamicModel('Project Contributors', - url: 'https://github.com/VB10/flutter-architecture-template/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc'); + url: 'https://github.com/VB10/flutter-architecture-template/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc',); } factory SettingsDynamicModel.fakeNull() { @@ -14,4 +12,6 @@ class SettingsDynamicModel { 'Project Contributors', ); } + final String? url; + final String title; } diff --git a/lib/view/settings/view/settings_view.dart b/lib/view/settings/view/settings_view.dart index b9d96f2..41300c3 100644 --- a/lib/view/settings/view/settings_view.dart +++ b/lib/view/settings/view/settings_view.dart @@ -1,19 +1,20 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:fluttermvvmtemplate/core/base/view/base_widget.dart'; +import 'package:fluttermvvmtemplate/core/constants/enums/app_theme_enum.dart'; +import 'package:fluttermvvmtemplate/core/extension/widget_extension.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/language_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/locale_keys.g.dart'; +import 'package:fluttermvvmtemplate/core/init/notifier/theme_notifer.dart'; +import 'package:fluttermvvmtemplate/product/enum/lottie_path_enum.dart'; +import 'package:fluttermvvmtemplate/view/settings/viewmodel/settings_view_model.dart'; import 'package:kartal/kartal.dart'; import 'package:provider/provider.dart'; -import '../../../core/base/view/base_widget.dart'; -import '../../../core/constants/enums/app_theme_enum.dart'; -import '../../../core/extension/widget_extension.dart'; -import '../../../core/init/lang/language_manager.dart'; -import '../../../core/init/lang/locale_keys.g.dart'; -import '../../../core/init/notifier/theme_notifer.dart'; -import '../../../product/enum/lottie_path_enum.dart'; -import '../viewmodel/settings_view_model.dart'; - class SettingsView extends StatelessWidget { + const SettingsView({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { return BaseView( @@ -37,9 +38,11 @@ class SettingsView extends StatelessWidget { buildCardAbout(context, viewModel).toSliver, context.emptySizedHeightBoxNormal.toSliver, Text( - '${''.version}', + ''.version, textAlign: TextAlign.center, - style: context.textTheme.headline6?.copyWith(fontWeight: FontWeight.w100), + style: context.textTheme.headline6?.copyWith( + fontWeight: FontWeight.w100, + ), ).toSliver, context.emptySizedHeightBoxNormal.toSliver, buildTextButtonLogOut(context, viewModel).toSliver, @@ -52,70 +55,111 @@ class SettingsView extends StatelessWidget { Card buildCardNavigationTour(SettingsViewModel viewModel) { return Card( - child: ListTile( - onTap: viewModel.navigateToOnBoard, - title: Text(LocaleKeys.home_setting_applicationTour.tr()), - trailing: Icon(Icons.arrow_right), - )); + child: ListTile( + onTap: viewModel.navigateToOnBoard, + title: Text(LocaleKeys.home_setting_applicationTour.tr()), + trailing: const Icon(Icons.arrow_right), + ), + ); } TextButton buildTextButtonLogOut(BuildContext context, SettingsViewModel viewModel) { return TextButton.icon( - style: ButtonStyle( - shape: MaterialStateProperty.all(StadiumBorder()), - padding: MaterialStateProperty.all(context.paddingNormal), - backgroundColor: MaterialStateProperty.all(context.colorScheme.onError.withOpacity(0.7))), - onPressed: viewModel.logutApp, - icon: Icon(Icons.exit_to_app), - label: Text(LocaleKeys.home_setting_exit.tr())); + style: ButtonStyle( + shape: MaterialStateProperty.all(const StadiumBorder()), + padding: MaterialStateProperty.all(context.paddingNormal), + backgroundColor: MaterialStateProperty.all(context.colorScheme.onError.withOpacity(0.7)), + ), + onPressed: viewModel.logutApp, + icon: const Icon(Icons.exit_to_app), + label: Text(LocaleKeys.home_setting_exit.tr()), + ); } Widget buildBuildCardHeaderProjectCore(BuildContext context, SettingsViewModel viewModel) { - return buildCardHeader(context, viewModel, title: LocaleKeys.home_setting_core_title, children: [ - ListTile( - title: Text(LocaleKeys.home_setting_core_themeTitle.tr()), - trailing: IconButton( - icon: context.watch().currenThemeEnum == AppThemes.LIGHT ? LottiePathEnum.MOON.toWidget : LottiePathEnum.SUNNY.toWidget, - onPressed: viewModel.changeAppTheme), - subtitle: Text(LocaleKeys.home_setting_core_themeDesc), - ), - ListTile( - title: Text(LocaleKeys.home_setting_core_langTitle.tr()), - trailing: Observer(builder: (_) { - return DropdownButton(items: [ - DropdownMenuItem(child: Text(LanguageManager.instance.trLocale.countryCode!.toUpperCase()), value: LanguageManager.instance.trLocale), - DropdownMenuItem(child: Text(LanguageManager.instance.enLocale.countryCode!.toUpperCase()), value: LanguageManager.instance.enLocale), - ], onChanged: viewModel.changeAppLocalization, value: viewModel.appLocale); - }), - subtitle: Text(LocaleKeys.home_setting_core_langDesc.tr()), - ), - ]); + return buildCardHeader( + context, + viewModel, + title: LocaleKeys.home_setting_core_title, + children: [ + ListTile( + title: Text(LocaleKeys.home_setting_core_themeTitle.tr()), + trailing: IconButton( + icon: context.watch().currenThemeEnum == AppThemes.LIGHT + ? LottiePathEnum.MOON.toWidget + : LottiePathEnum.SUNNY.toWidget, + onPressed: viewModel.changeAppTheme, + ), + subtitle: const Text(LocaleKeys.home_setting_core_themeDesc), + ), + ListTile( + title: Text(LocaleKeys.home_setting_core_langTitle.tr()), + trailing: Observer( + builder: (_) { + return DropdownButton( + items: [ + DropdownMenuItem( + value: LanguageManager.instance.trLocale, + child: Text( + LanguageManager.instance.trLocale.countryCode?.toUpperCase() ?? '', + ), + ), + DropdownMenuItem( + value: LanguageManager.instance.enLocale, + child: Text( + LanguageManager.instance.enLocale.countryCode?.toUpperCase() ?? '', + ), + ), + ], + onChanged: viewModel.changeAppLocalization, + value: viewModel.appLocale, + ); + }, + ), + subtitle: Text(LocaleKeys.home_setting_core_langDesc.tr()), + ), + ], + ); } - Widget buildCardHeader(BuildContext context, SettingsViewModel viewModel, {required String title, required List children}) { + Widget buildCardHeader( + BuildContext context, + SettingsViewModel viewModel, { + required String title, + required List children, + }) { return Card( child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [Padding(padding: context.paddingLow, child: Text(title.tr(), style: context.textTheme.headline5)), Divider(), ...children], + children: [ + Padding(padding: context.paddingLow, child: Text(title.tr(), style: context.textTheme.headline5)), + const Divider(), + ...children + ], ), ); } Widget buildCardAbout(BuildContext context, SettingsViewModel viewModel) { - return buildCardHeader(context, viewModel, title: LocaleKeys.home_setting_about_title, children: [ - ListTile( - onTap: viewModel.navigateToContribution, - leading: Icon(Icons.favorite), - title: Text(LocaleKeys.home_setting_about_contribitions.tr()), - trailing: Icon(Icons.keyboard_arrow_right_outlined), - ), - ListTile( - onTap: viewModel.navigateToFakeContribution, - leading: Icon(Icons.home), - title: Text('Home Page'), - trailing: Icon(Icons.keyboard_arrow_right_outlined), - ) - ]); + return buildCardHeader( + context, + viewModel, + title: LocaleKeys.home_setting_about_title, + children: [ + ListTile( + onTap: viewModel.navigateToContribution, + leading: const Icon(Icons.favorite), + title: Text(LocaleKeys.home_setting_about_contribitions.tr()), + trailing: const Icon(Icons.keyboard_arrow_right_outlined), + ), + ListTile( + onTap: viewModel.navigateToFakeContribution, + leading: const Icon(Icons.home), + title: const Text('Home Page'), + trailing: const Icon(Icons.keyboard_arrow_right_outlined), + ) + ], + ); } Card buildCardUser(BuildContext context, SettingsViewModel viewModel) { @@ -124,10 +168,10 @@ class SettingsView extends StatelessWidget { padding: context.paddingLow, child: Row( children: [ - CircleAvatar(child: Text(viewModel.userModel.shortName), radius: 30), - Spacer(), + CircleAvatar(radius: 30, child: Text(viewModel.userModel.shortName)), + const Spacer(), Text(viewModel.userModel.fullName), - Spacer(flex: 5), + const Spacer(flex: 5), ], ), ), @@ -136,10 +180,11 @@ class SettingsView extends StatelessWidget { NestedScrollView buildNestedScrollView() { return NestedScrollView( - headerSliverBuilder: (context, innerBoxIsScrolled) { - return [buildSliverAppBar(context)]; - }, - body: Column()); + headerSliverBuilder: (context, innerBoxIsScrolled) { + return [buildSliverAppBar(context)]; + }, + body: Column(), + ); } SliverAppBar buildSliverAppBar(BuildContext context) { diff --git a/lib/view/settings/view/subview/settings_dynamic_view.dart b/lib/view/settings/view/subview/settings_dynamic_view.dart index e336a61..cf08072 100644 --- a/lib/view/settings/view/subview/settings_dynamic_view.dart +++ b/lib/view/settings/view/subview/settings_dynamic_view.dart @@ -1,14 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/constants/app/app_constants.dart'; +import 'package:fluttermvvmtemplate/view/settings/model/settings_dynamic.dart'; import 'package:kartal/kartal.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import '../../../../core/constants/app/app_constants.dart'; -import '../../model/settings_dynamic.dart'; - class SettingsDynamicView extends StatelessWidget { - final SettingsDynamicModel model; - const SettingsDynamicView({Key? key, required this.model}) : super(key: key); + final SettingsDynamicModel model; @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/view/settings/viewmodel/settings_view_model.dart b/lib/view/settings/viewmodel/settings_view_model.dart index 174586a..3ee765d 100644 --- a/lib/view/settings/viewmodel/settings_view_model.dart +++ b/lib/view/settings/viewmodel/settings_view_model.dart @@ -1,15 +1,14 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:fluttermvvmtemplate/core/base/model/base_view_model.dart'; +import 'package:fluttermvvmtemplate/core/constants/navigation/navigation_constants.dart'; +import 'package:fluttermvvmtemplate/core/init/lang/language_manager.dart'; +import 'package:fluttermvvmtemplate/core/init/notifier/theme_notifer.dart'; +import 'package:fluttermvvmtemplate/product/model/user.dart'; +import 'package:fluttermvvmtemplate/view/settings/model/settings_dynamic.dart'; import 'package:mobx/mobx.dart'; import 'package:provider/provider.dart'; -import '../../../core/base/model/base_view_model.dart'; -import '../../../core/constants/navigation/navigation_constants.dart'; -import '../../../core/init/lang/language_manager.dart'; -import '../../../core/init/notifier/theme_notifer.dart'; -import '../../../product/model/user.dart'; -import '../model/settings_dynamic.dart'; - part 'settings_view_model.g.dart'; part 'subviewmodel/about_view_model.dart'; @@ -18,7 +17,7 @@ class SettingsViewModel = _SettingsViewModelBase with _$SettingsViewModel; abstract class _SettingsViewModelBase with Store, BaseViewModel { final userModel = UserModel.fake(); @override - void setContext(BuildContext context) => this.context = context; + void setContext(BuildContext context) => viewModelContext = context; @observable Locale? appLocale = LanguageManager.instance.enLocale; @@ -27,16 +26,14 @@ abstract class _SettingsViewModelBase with Store, BaseViewModel { void init() {} void changeAppTheme() { - if (context != null) { - context!.read().changeTheme(); - } + viewModelContext.read().changeTheme(); } @action void changeAppLocalization(Locale? locale) { if (locale != null) { appLocale = locale; - context?.setLocale(locale); + viewModelContext.setLocale(locale); } } diff --git a/lib/view/settings/viewmodel/settings_view_model.g.dart b/lib/view/settings/viewmodel/settings_view_model.g.dart index b193383..79b181d 100644 --- a/lib/view/settings/viewmodel/settings_view_model.g.dart +++ b/lib/view/settings/viewmodel/settings_view_model.g.dart @@ -6,10 +6,11 @@ part of 'settings_view_model.dart'; // StoreGenerator // ************************************************************************** -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic +// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic, no_leading_underscores_for_local_identifiers mixin _$SettingsViewModel on _SettingsViewModelBase, Store { - final _$appLocaleAtom = Atom(name: '_SettingsViewModelBase.appLocale'); + late final _$appLocaleAtom = + Atom(name: '_SettingsViewModelBase.appLocale', context: context); @override Locale? get appLocale { @@ -24,8 +25,8 @@ mixin _$SettingsViewModel on _SettingsViewModelBase, Store { }); } - final _$_SettingsViewModelBaseActionController = - ActionController(name: '_SettingsViewModelBase'); + late final _$_SettingsViewModelBaseActionController = + ActionController(name: '_SettingsViewModelBase', context: context); @override void changeAppLocalization(Locale? locale) { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 287b6a9..da6ff49 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,8 +5,22 @@ import FlutterMacOS import Foundation +import connectivity_plus_macos +import firebase_analytics +import firebase_core +import package_info_plus_macos +import path_provider_macos import shared_preferences_macos +import sqflite +import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) + FLTFirebaseAnalyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAnalyticsPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/module/all_of_template/.vscode/settings.json b/module/all_of_template/.vscode/settings.json new file mode 100644 index 0000000..3a15aca --- /dev/null +++ b/module/all_of_template/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.words": [ + "kartal" + ] +} \ No newline at end of file diff --git a/module/all_of_template/analysis_options.yaml b/module/all_of_template/analysis_options.yaml new file mode 100644 index 0000000..df989ed --- /dev/null +++ b/module/all_of_template/analysis_options.yaml @@ -0,0 +1,17 @@ +include: package:very_good_analysis/analysis_options.yaml + + +analyzer: + exclude: + - "**/*.g.dart" + - "**/*.freezed.dart" + - "test/.test_coverage.dart" + - "bin/cache/**" + - "lib/generated_plugin_registrant.dart" + - test + - assets/translations + +linter: + rules: + public_member_api_docs: false + library_private_types_in_public_api: false \ No newline at end of file diff --git a/module/all_of_template/lib/features/buy_view.dart b/module/all_of_template/lib/features/buy_view.dart index 077b3ac..89ab74a 100644 --- a/module/all_of_template/lib/features/buy_view.dart +++ b/module/all_of_template/lib/features/buy_view.dart @@ -26,9 +26,9 @@ class _BuyViewState extends State { TextButton goNextPage() { return TextButton( onPressed: () { - context.navigateToPage(NextPage()); + context.navigateToPage(const NextPage()); }, - child: Text('Go'), + child: const Text('Go'), ); } @@ -37,7 +37,7 @@ class _BuyViewState extends State { onPressed: () { Navigator.of(context).pop(); }, - child: Icon(Icons.arrow_back), + child: const Icon(Icons.arrow_back), ); } diff --git a/module/all_of_template/pubspec.lock b/module/all_of_template/pubspec.lock index b1c6d44..c7b8b77 100644 --- a/module/all_of_template/pubspec.lock +++ b/module/all_of_template/pubspec.lock @@ -7,7 +7,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" boolean_selector: dependency: transitive description: @@ -21,28 +21,21 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.2.1" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" device_info: dependency: transitive description: @@ -63,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" flutter: dependency: "direct main" description: flutter @@ -85,7 +78,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" kartal: dependency: "direct main" description: @@ -106,14 +99,21 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -134,7 +134,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" pedantic: dependency: transitive description: @@ -167,7 +167,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" stack_trace: dependency: transitive description: @@ -188,28 +188,21 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.12" url_launcher: dependency: transitive description: @@ -258,7 +251,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + very_good_analysis: + dependency: "direct dev" + description: + name: very_good_analysis + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.18.0 <3.0.0" flutter: ">=2.0.0" diff --git a/module/all_of_template/pubspec.yaml b/module/all_of_template/pubspec.yaml index 65ceff3..3f356ba 100644 --- a/module/all_of_template/pubspec.yaml +++ b/module/all_of_template/pubspec.yaml @@ -1,7 +1,7 @@ name: all_of_template description: A new Flutter package project. version: 0.0.1 -homepage: +homepage: home environment: sdk: ">=2.12.0 <3.0.0" @@ -16,6 +16,8 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + + very_good_analysis: ^3.1.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/module/architecture_widgets/analysis_options.yaml b/module/architecture_widgets/analysis_options.yaml new file mode 100644 index 0000000..df989ed --- /dev/null +++ b/module/architecture_widgets/analysis_options.yaml @@ -0,0 +1,17 @@ +include: package:very_good_analysis/analysis_options.yaml + + +analyzer: + exclude: + - "**/*.g.dart" + - "**/*.freezed.dart" + - "test/.test_coverage.dart" + - "bin/cache/**" + - "lib/generated_plugin_registrant.dart" + - test + - assets/translations + +linter: + rules: + public_member_api_docs: false + library_private_types_in_public_api: false \ No newline at end of file diff --git a/module/architecture_widgets/lib/src/button/icon_button.dart b/module/architecture_widgets/lib/src/button/icon_button.dart index 2f6c539..7b3f322 100644 --- a/module/architecture_widgets/lib/src/button/icon_button.dart +++ b/module/architecture_widgets/lib/src/button/icon_button.dart @@ -1,12 +1,13 @@ +import 'package:architecture_widgets/src/button/normal_button.dart'; import 'package:flutter/material.dart'; -import 'normal_button.dart'; - class IconNormalButton extends StatelessWidget { + const IconNormalButton({Key? key, this.onPressed, required this.icon}) + : super( + key: key, + ); final VoidCallback? onPressed; final IconData icon; - - const IconNormalButton({Key? key, this.onPressed, required this.icon}) : super(key: key); @override Widget build(BuildContext context) { return NormalButton( diff --git a/module/architecture_widgets/lib/src/button/normal_button.dart b/module/architecture_widgets/lib/src/button/normal_button.dart index f3db31c..a969a9b 100644 --- a/module/architecture_widgets/lib/src/button/normal_button.dart +++ b/module/architecture_widgets/lib/src/button/normal_button.dart @@ -1,16 +1,15 @@ import 'package:flutter/material.dart'; class NormalButton extends StatelessWidget { + const NormalButton({Key? key, this.child, this.onPressed}) : super(key: key); final Widget? child; final VoidCallback? onPressed; - - const NormalButton({Key? key, this.child, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { return ElevatedButton( style: ButtonStyle( - padding: MaterialStateProperty.all(EdgeInsets.all(15)), + padding: MaterialStateProperty.all(const EdgeInsets.all(15)), elevation: MaterialStateProperty.all(10), ), onPressed: onPressed, diff --git a/module/architecture_widgets/lib/src/button/title_text_button.dart b/module/architecture_widgets/lib/src/button/title_text_button.dart index a918f5a..99dd13e 100644 --- a/module/architecture_widgets/lib/src/button/title_text_button.dart +++ b/module/architecture_widgets/lib/src/button/title_text_button.dart @@ -1,12 +1,13 @@ +import 'package:architecture_widgets/src/button/normal_button.dart'; import 'package:flutter/material.dart'; -import 'normal_button.dart'; - class TitleTextButton extends StatelessWidget { + const TitleTextButton({Key? key, this.onPressed, required this.text}) + : super( + key: key, + ); final VoidCallback? onPressed; final String text; - - const TitleTextButton({Key? key, this.onPressed, required this.text}) : super(key: key); @override Widget build(BuildContext context) { return NormalButton( diff --git a/module/architecture_widgets/lib/src/card/not_found_navigation_widget.dart b/module/architecture_widgets/lib/src/card/not_found_navigation_widget.dart index d01e7e1..3f63ed9 100644 --- a/module/architecture_widgets/lib/src/card/not_found_navigation_widget.dart +++ b/module/architecture_widgets/lib/src/card/not_found_navigation_widget.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; class NotFoundNavigationWidget extends StatelessWidget { + const NotFoundNavigationWidget({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { - return Scaffold( + return const Scaffold( body: Text('Not Found'), ); } diff --git a/module/architecture_widgets/lib/src/column/form_column.dart b/module/architecture_widgets/lib/src/column/form_column.dart index 535e665..2d64e75 100644 --- a/module/architecture_widgets/lib/src/column/form_column.dart +++ b/module/architecture_widgets/lib/src/column/form_column.dart @@ -1,21 +1,20 @@ import 'package:flutter/material.dart'; class FormColumn extends StatelessWidget { - final List? children; - const FormColumn({Key? key, this.children}) : super(key: key); + final List? children; @override Widget build(BuildContext context) { return Row( children: [ - Spacer(flex: 1), + const Spacer(), Expanded( flex: 8, child: Column( children: children!, ), ), - Spacer(flex: 1), + const Spacer(), ], ); } diff --git a/module/architecture_widgets/lib/src/container/random_color_container.dart b/module/architecture_widgets/lib/src/container/random_color_container.dart index 4cd47e5..bebc948 100644 --- a/module/architecture_widgets/lib/src/container/random_color_container.dart +++ b/module/architecture_widgets/lib/src/container/random_color_container.dart @@ -3,8 +3,10 @@ import 'dart:math'; import 'package:flutter/material.dart'; class RandomColorContainer extends StatelessWidget { + const RandomColorContainer({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { - return Container(color: Colors.primaries[Random().nextInt(17)]); + return ColoredBox(color: Colors.primaries[Random().nextInt(17)]); } } diff --git a/module/architecture_widgets/lib/src/decoration/circle_decoration.dart b/module/architecture_widgets/lib/src/decoration/circle_decoration.dart index 79a0be9..1794681 100644 --- a/module/architecture_widgets/lib/src/decoration/circle_decoration.dart +++ b/module/architecture_widgets/lib/src/decoration/circle_decoration.dart @@ -1,28 +1,30 @@ import 'package:flutter/material.dart'; class CircleDecoration extends Decoration { - final BoxPainter _painter; - CircleDecoration({required Color color, required double radius}) : _painter = _CirclePainter(color, radius); + final BoxPainter _painter; @override BoxPainter createBoxPainter([VoidCallback? onChanged]) => _painter; } class _CirclePainter extends BoxPainter { - final Paint _paint; - final double radius; - - late Offset circleOffset; - _CirclePainter(Color color, this.radius) : _paint = Paint() ..color = color ..isAntiAlias = true; + final Paint _paint; + final double radius; + + late Offset circleOffset; @override void paint(Canvas canvas, Offset offset, ImageConfiguration cfg) { - circleOffset = offset + Offset(cfg.size!.width / 2, cfg.size!.height - radius - 5); + circleOffset = offset + + Offset( + cfg.size!.width / 2, + cfg.size!.height - radius - 5, + ); canvas.drawCircle(circleOffset, radius, _paint); } } diff --git a/module/architecture_widgets/lib/src/list-view/indicator_list_view.dart b/module/architecture_widgets/lib/src/list-view/indicator_list_view.dart index 8db33b3..e63d917 100644 --- a/module/architecture_widgets/lib/src/list-view/indicator_list_view.dart +++ b/module/architecture_widgets/lib/src/list-view/indicator_list_view.dart @@ -1,28 +1,30 @@ import 'package:flutter/material.dart'; class IndactorListView extends StatelessWidget { + const IndactorListView({ + Key? key, + this.itemCount, + this.onListItem, + this.currentIndex, + }) : super(key: key); final int? itemCount; final int? currentIndex; final Widget Function(int index)? onListItem; - - const IndactorListView( - {Key? key, this.itemCount, this.onListItem, this.currentIndex}) - : super(key: key); @override Widget build(BuildContext context) { return ListView.builder( scrollDirection: Axis.horizontal, itemCount: itemCount, shrinkWrap: true, - itemBuilder: (context, index) => buildPadding(context, index), + itemBuilder: buildPadding, ); } Padding buildPadding(BuildContext context, int index) { return Padding( - padding: EdgeInsets.all(5), + padding: const EdgeInsets.all(5), child: buildCircleAvatar(index, context), ); } @@ -30,12 +32,10 @@ class IndactorListView extends StatelessWidget { CircleAvatar buildCircleAvatar(int index, BuildContext context) { return CircleAvatar( backgroundColor: isCurrentIndex(index) ? Colors.black12 : Colors.blue, - radius: isCurrentIndex(index) - ? _pageWidth(context) * 0.03 - : _pageWidth(context) * 0.015, + radius: isCurrentIndex(index) ? _pageWidth(context) * 0.03 : _pageWidth(context) * 0.015, child: AnimatedOpacity( opacity: opacityValue(index), - duration: Duration(seconds: 1), + duration: const Duration(seconds: 1), child: onListItem!(index), ), ); diff --git a/module/architecture_widgets/lib/src/slider/range_price_slider.dart b/module/architecture_widgets/lib/src/slider/range_price_slider.dart index b16198c..3dff734 100644 --- a/module/architecture_widgets/lib/src/slider/range_price_slider.dart +++ b/module/architecture_widgets/lib/src/slider/range_price_slider.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; class RangePriceSLider extends StatefulWidget { + const RangePriceSLider({Key? key, required this.min, required this.max, required this.onCompleted}) : super(key: key); final double min; final double max; final void Function(RangeValues values) onCompleted; - - const RangePriceSLider({Key? key, required this.min, required this.max, required this.onCompleted}) : super(key: key); @override _RangePriceSLiderState createState() => _RangePriceSLiderState(); } diff --git a/module/architecture_widgets/lib/src/text/auto_locale_text.dart b/module/architecture_widgets/lib/src/text/auto_locale_text.dart index a8c23a1..da7d6b5 100644 --- a/module/architecture_widgets/lib/src/text/auto_locale_text.dart +++ b/module/architecture_widgets/lib/src/text/auto_locale_text.dart @@ -4,13 +4,13 @@ import 'package:flutter/material.dart'; import 'package:fluttermvvmtemplate/core/extension/string_extension.dart'; class AutoLocaleText extends StatelessWidget { + const AutoLocaleText({Key? key, required this.value, this.textAlign, this.style}) + : super( + key: key, + ); final String value; final TextAlign? textAlign; final TextStyle? style; - - const AutoLocaleText( - {Key? key, required this.value, this.textAlign, this.style}) - : super(key: key); @override Widget build(BuildContext context) { return AutoSizeText( diff --git a/module/architecture_widgets/pubspec.lock b/module/architecture_widgets/pubspec.lock index a6f474c..a92ef3a 100644 --- a/module/architecture_widgets/pubspec.lock +++ b/module/architecture_widgets/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.6" all_of_template: dependency: transitive description: @@ -37,21 +44,21 @@ packages: name: args url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.3.1" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: transitive description: name: auto_size_text url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.0" + version: "3.0.0" boolean_selector: dependency: transitive description: @@ -72,7 +79,7 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" charcode: dependency: transitive description: @@ -86,14 +93,70 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "5.8.3" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.3" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" + connectivity_plus: + dependency: transitive + description: + name: connectivity_plus + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.9" + connectivity_plus_linux: + dependency: transitive + description: + name: connectivity_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + connectivity_plus_macos: + dependency: transitive + description: + name: connectivity_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.6" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.3" + connectivity_plus_web: + dependency: transitive + description: + name: connectivity_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.5" + connectivity_plus_windows: + dependency: transitive + description: + name: connectivity_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.2" crypto: dependency: transitive description: @@ -108,6 +171,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.3" + dbus: + dependency: transitive + description: + name: dbus + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.4" device_info: dependency: transitive description: @@ -128,14 +198,14 @@ packages: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.6" easy_localization: dependency: transitive description: name: easy_localization url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" easy_logger: dependency: transitive description: @@ -143,13 +213,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.0.2" + equatable: + dependency: transitive + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" ffi: dependency: transitive description: @@ -170,42 +247,42 @@ packages: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "9.0.5" + version: "10.0.3" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "3.3.11" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.4.0+5" + version: "0.5.1+2" firebase_core: dependency: transitive description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.11.0" + version: "2.1.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.5.2" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.5.3" + version: "2.0.1" flutter: dependency: "direct main" description: flutter @@ -250,7 +327,7 @@ packages: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "0.21.0+1" + version: "1.1.6" flutter_test: dependency: "direct dev" description: flutter @@ -295,7 +372,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" kartal: dependency: transitive description: @@ -316,7 +393,7 @@ packages: name: lottie url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.4.3" mask_text_input_formatter: dependency: transitive description: @@ -330,14 +407,21 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: @@ -359,6 +443,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + nm: + dependency: transitive + description: + name: nm + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0" octo_image: dependency: transitive description: @@ -379,21 +470,21 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "0.5.1" + version: "1.0.1" path_parsing: dependency: transitive description: name: path_parsing url: "https://pub.dartlang.org" source: hosted - version: "0.2.1" + version: "1.0.1" path_provider: dependency: transitive description: @@ -442,7 +533,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "5.1.0" platform: dependency: transitive description: @@ -456,7 +547,7 @@ packages: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.3" process: dependency: transitive description: @@ -470,7 +561,14 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "6.0.4" + retry: + dependency: transitive + description: + name: retry + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" rxdart: dependency: transitive description: @@ -552,7 +650,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" sqflite: dependency: transitive description: @@ -587,7 +685,7 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" synchronized: dependency: transitive description: @@ -601,14 +699,14 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.12" typed_data: dependency: transitive description: @@ -671,21 +769,49 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + very_good_analysis: + dependency: "direct dev" + description: + name: very_good_analysis + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" vexana: dependency: transitive description: name: vexana url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "3.0.1" webview_flutter: dependency: transitive description: name: webview_flutter url: "https://pub.dartlang.org" source: hosted - version: "2.0.9" + version: "3.0.4" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.10.4" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.5" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + url: "https://pub.dartlang.org" + source: hosted + version: "2.9.5" win32: dependency: transitive description: @@ -706,7 +832,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.1.2" + version: "6.1.0" sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" + dart: ">=2.18.0 <3.0.0" + flutter: ">=3.3.0" diff --git a/module/architecture_widgets/pubspec.yaml b/module/architecture_widgets/pubspec.yaml index 61376fb..cabef7b 100644 --- a/module/architecture_widgets/pubspec.yaml +++ b/module/architecture_widgets/pubspec.yaml @@ -1,7 +1,8 @@ name: architecture_widgets description: A new Flutter package project. version: 0.0.1 -homepage: +homepage: home +publish_to: none environment: sdk: ">=2.12.0 <3.0.0" @@ -12,11 +13,13 @@ dependencies: sdk: flutter fluttermvvmtemplate: - path: ../../ + path: ../../ dev_dependencies: flutter_test: sdk: flutter + very_good_analysis: ^3.1.0 + flutter: \ No newline at end of file diff --git a/module/architecture_widgets/test/architecture_widgets_test.dart b/module/architecture_widgets/test/architecture_widgets_test.dart index e47ea77..835f8c7 100644 --- a/module/architecture_widgets/test/architecture_widgets_test.dart +++ b/module/architecture_widgets/test/architecture_widgets_test.dart @@ -1,6 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:architecture_widgets/architecture_widgets.dart'; void main() { test('adds one to input values', () { diff --git a/pubspec.lock b/pubspec.lock index 7be11d6..88b0eb9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,14 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "20.0.0" + version: "47.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.6" all_of_template: dependency: "direct main" description: @@ -21,14 +28,14 @@ packages: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "4.7.0" animations: dependency: "direct main" description: name: animations url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.7" architecture_theme: dependency: "direct main" description: @@ -51,28 +58,28 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.2" + version: "3.3.2" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.3.1" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.2" + version: "2.9.0" auto_size_text: dependency: "direct main" description: name: auto_size_text url: "https://pub.dartlang.org" source: hosted - version: "3.0.0-nullsafety.0" + version: "3.0.0" boolean_selector: dependency: transitive description: @@ -86,77 +93,84 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.3.1" build_config: dependency: transitive description: name: build_config url: "https://pub.dartlang.org" source: hosted - version: "0.4.7" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon url: "https://pub.dartlang.org" source: hosted - version: "2.1.10" + version: "3.1.0" build_resolvers: dependency: transitive description: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.10" build_runner: dependency: "direct dev" description: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.12.2" + version: "2.3.2" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "6.1.12" + version: "7.2.7" built_collection: dependency: transitive description: name: built_collection url: "https://pub.dartlang.org" source: hosted - version: "4.3.2" + version: "5.1.1" built_value: dependency: transitive description: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "7.1.0" + version: "8.4.2" cached_network_image: dependency: "direct main" description: name: cached_network_image url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" - characters: + version: "3.2.2" + cached_network_image_platform_interface: dependency: transitive description: - name: characters + name: cached_network_image_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" - charcode: + version: "2.0.0" + cached_network_image_web: dependency: transitive description: - name: charcode + name: cached_network_image_web url: "https://pub.dartlang.org" source: hosted - version: "1.3.1" + version: "1.0.2" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" checked_yaml: dependency: transitive description: @@ -164,69 +178,125 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" - cli_util: + clock: dependency: transitive description: - name: cli_util + name: clock url: "https://pub.dartlang.org" source: hosted - version: "0.3.0" - clock: + version: "1.1.1" + cloud_firestore_platform_interface: dependency: transitive description: - name: clock + name: cloud_firestore_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "5.8.3" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.3" code_builder: dependency: transitive description: name: code_builder url: "https://pub.dartlang.org" source: hosted - version: "3.7.0" + version: "4.3.0" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" + connectivity_plus: + dependency: transitive + description: + name: connectivity_plus + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.9" + connectivity_plus_linux: + dependency: transitive + description: + name: connectivity_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + connectivity_plus_macos: + dependency: transitive + description: + name: connectivity_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.6" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.3" + connectivity_plus_web: + dependency: transitive + description: + name: connectivity_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.5" + connectivity_plus_windows: + dependency: transitive + description: + name: connectivity_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.2" convert: dependency: transitive description: name: convert url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.1.1" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.5" dart_style: dependency: transitive description: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.2.4" + dbus: + dependency: transitive + description: + name: dbus + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.8" device_info: dependency: transitive description: name: device_info url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.3" device_info_platform_interface: dependency: transitive description: @@ -234,20 +304,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + diacritic: + dependency: transitive + description: + name: diacritic + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" dio: dependency: transitive description: name: dio url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.6" easy_localization: dependency: "direct main" description: name: easy_localization url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" easy_logger: dependency: transitive description: @@ -255,76 +332,83 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.0.2" + equatable: + dependency: "direct main" + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.1" ffi: dependency: transitive description: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "2.0.1" file: dependency: transitive description: name: file url: "https://pub.dartlang.org" source: hosted - version: "6.1.0" + version: "6.1.4" firebase_analytics: dependency: "direct main" description: name: firebase_analytics url: "https://pub.dartlang.org" source: hosted - version: "9.0.5" + version: "10.0.3" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "3.3.11" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web url: "https://pub.dartlang.org" source: hosted - version: "0.4.0+5" + version: "0.5.1+2" firebase_core: dependency: "direct main" description: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.11.0" + version: "2.1.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.5.2" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.5.3" + version: "2.0.1" fixnum: dependency: transitive description: name: fixnum url: "https://pub.dartlang.org" source: hosted - version: "0.10.11" + version: "1.0.1" flutter: dependency: "direct main" description: flutter @@ -336,14 +420,14 @@ packages: name: flutter_blurhash url: "https://pub.dartlang.org" source: hosted - version: "0.6.0" + version: "0.7.0" flutter_cache_manager: dependency: transitive description: name: flutter_cache_manager url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.3.0" flutter_localizations: dependency: transitive description: flutter @@ -355,21 +439,21 @@ packages: name: flutter_mobx url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.6+4" flutter_rating_bar: dependency: "direct main" description: name: flutter_rating_bar url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.1" flutter_svg: dependency: "direct main" description: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "0.21.0+1" + version: "1.1.6" flutter_test: dependency: "direct dev" description: flutter @@ -380,48 +464,48 @@ packages: description: flutter source: sdk version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" glob: dependency: transitive description: name: glob url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.0" graphs: dependency: transitive description: name: graphs url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "2.2.0" http: dependency: transitive description: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.13.1" + version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "3.2.1" http_parser: dependency: transitive description: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" - image: - dependency: transitive - description: - name: image - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" + version: "4.0.2" intl: dependency: transitive description: @@ -435,105 +519,112 @@ packages: name: io url: "https://pub.dartlang.org" source: hosted - version: "0.3.4" + version: "1.0.3" js: dependency: transitive description: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: "direct dev" description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.7.0" json_serializable: dependency: "direct dev" description: name: json_serializable url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "6.5.4" kartal: dependency: "direct main" description: name: kartal url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.5.1" logger: dependency: "direct main" description: name: logger url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0" logging: dependency: transitive description: name: logging url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0" lottie: dependency: "direct main" description: name: lottie url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.4.3" mask_text_input_formatter: dependency: transitive description: name: mask_text_input_formatter url: "https://pub.dartlang.org" source: hosted - version: "2.0.0-nullsafety.2" + version: "2.4.0" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.11" + version: "0.12.12" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0" mime: dependency: transitive description: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" mobx: dependency: "direct main" description: name: mobx url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.1" mobx_codegen: dependency: "direct dev" description: name: mobx_codegen url: "https://pub.dartlang.org" source: hosted - version: "2.0.1+3" + version: "2.0.7+3" mockito: dependency: "direct dev" description: name: mockito url: "https://pub.dartlang.org" source: hosted - version: "5.0.7" + version: "5.3.2" nested: dependency: transitive description: @@ -541,230 +632,300 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + nm: + dependency: transitive + description: + name: nm + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.0" octo_image: dependency: transitive description: name: octo_image url: "https://pub.dartlang.org" source: hosted - version: "1.0.0+1" + version: "1.0.2" package_config: dependency: transitive description: name: package_config url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" - package_info: + version: "2.1.0" + package_info_plus: dependency: transitive description: - name: package_info + name: package_info_plus url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "1.4.3+1" + package_info_plus_linux: + dependency: transitive + description: + name: package_info_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + package_info_plus_macos: + dependency: transitive + description: + name: package_info_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + package_info_plus_web: + dependency: transitive + description: + name: package_info_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.6" + package_info_plus_windows: + dependency: transitive + description: + name: package_info_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing url: "https://pub.dartlang.org" source: hosted - version: "0.5.0" + version: "1.0.1" path_parsing: dependency: transitive description: name: path_parsing url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "1.0.1" path_provider: dependency: transitive description: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.11" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.21" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.7" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.5" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.3" pedantic: - dependency: "direct dev" + dependency: transitive description: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.11.0" + version: "1.11.1" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "5.1.0" platform: dependency: transitive description: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.3" pool: dependency: transitive description: name: pool url: "https://pub.dartlang.org" source: hosted - version: "1.5.0" + version: "1.5.1" process: dependency: transitive description: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.2.1" + version: "4.2.4" provider: dependency: "direct main" description: name: provider url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "6.0.4" pub_semver: dependency: transitive description: name: pub_semver url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.2" pubspec_parse: dependency: transitive description: name: pubspec_parse url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" - quiver: + version: "1.2.1" + retry: dependency: transitive description: - name: quiver + name: retry url: "https://pub.dartlang.org" source: hosted - version: "2.1.5" + version: "3.1.0" rxdart: dependency: transitive description: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.26.0" + version: "0.27.5" sembast: dependency: transitive description: name: sembast url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.3.1" share: dependency: transitive description: name: share url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.4" shared_preferences: dependency: "direct main" description: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.15" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.14" + shared_preferences_ios: + dependency: transitive + description: + name: shared_preferences_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.1" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.4" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.4" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.1" shelf: dependency: transitive description: name: shelf url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" shimmer: dependency: "direct main" description: @@ -783,28 +944,35 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.2.6" + source_helper: + dependency: transitive + description: + name: source_helper + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.3" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.9.0" sqflite: dependency: transitive description: name: sqflite url: "https://pub.dartlang.org" source: hosted - version: "2.0.0+3" + version: "2.2.0+2" sqflite_common: dependency: transitive description: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "2.0.0+2" + version: "2.4.0+2" stack_trace: dependency: transitive description: @@ -825,35 +993,35 @@ packages: name: stream_transform url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" synchronized: dependency: transitive description: name: synchronized url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.0+3" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.12" timing: dependency: transitive description: @@ -867,119 +1035,161 @@ packages: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" url_launcher: dependency: transitive description: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.3" + version: "6.1.6" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.21" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" url_launcher_linux: dependency: transitive description: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.1.1" url_launcher_web: dependency: transitive description: name: url_launcher_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.13" url_launcher_windows: dependency: transitive description: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "3.0.1" uuid: dependency: transitive description: name: uuid url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "3.0.6" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" + very_good_analysis: + dependency: "direct dev" + description: + name: very_good_analysis + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" vexana: dependency: "direct main" description: name: vexana url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "3.0.1" watcher: dependency: transitive description: name: watcher url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.2.0" webview_flutter: dependency: "direct main" description: name: webview_flutter url: "https://pub.dartlang.org" source: hosted - version: "2.0.4" + version: "3.0.4" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.10.4" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.5" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + url: "https://pub.dartlang.org" + source: hosted + version: "2.9.5" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "3.0.1" xdg_directories: dependency: transitive description: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+2" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "6.1.0" yaml: dependency: transitive description: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.1" sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=1.24.0-10.2.pre" + dart: ">=2.18.0 <3.0.0" + flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9c9604e..c5c2434 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,11 +15,12 @@ dependencies: # state management flutter_mobx: ^2.0.0 mobx: ^2.0.1 - provider: ^5.0.0 + provider: ^6.0.4 + # network # dio: ^4.0.0-prev3 - vexana: ^2.2.0 + vexana: ^3.0.1 # database shared_preferences: ^2.0.5 @@ -28,21 +29,22 @@ dependencies: easy_localization: ^3.0.0 # firebase - firebase_core: ^1.11.0 + firebase_core: ^2.1.1 firebase_analytics: any # core utilities kartal: ^2.1.0 logger: ^1.0.0 - webview_flutter: ^2.0.4 + webview_flutter: ^3.0.4 + equatable: ^2.0.5 # ui utilities animations: ^2.0.0 - auto_size_text: ^3.0.0-nullsafety.0 + auto_size_text: ^3.0.0 cached_network_image: ^3.0.0-nullsafety cupertino_icons: ^1.0.2 flutter_rating_bar: ^4.0.0 - flutter_svg: ^0.21.0-nullsafety.0 + flutter_svg: ^1.1.6 lottie: ^1.0.1 shimmer: ^2.0.0-nullsafety.0 @@ -57,12 +59,12 @@ dev_dependencies: flutter_test: sdk: flutter - build_runner: ^1.10.0 + build_runner: ^2.3.2 json_annotation: ^4.0.1 - json_serializable: ^4.1.0 + json_serializable: ^6.5.4 mobx_codegen: ^2.0.1+3 mockito: any - pedantic: ^1.11.0 + very_good_analysis: ^3.1.0 flutter: uses-material-design: true