├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── virtual_try_on │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── Inter-Black.ttf ├── Inter-Bold.ttf ├── Inter-ExtraBold.ttf ├── Inter-ExtraLight.ttf ├── Inter-Light.ttf ├── Inter-Medium.ttf ├── Inter-Regular.ttf ├── Inter-SemiBold.ttf ├── Inter-Thin.ttf ├── logo.jpg ├── shoe1.png ├── shoe2.png └── shoe3.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── checkSizePage.dart ├── formPage.dart ├── main.dart ├── submitPage.dart ├── thankYouPage.dart └── virtualTryOnPage.dart ├── pubspec.lock ├── pubspec.yaml ├── screenshots ├── logo.jpg ├── ss1.jpeg ├── ss2.jpeg ├── ss3.jpeg └── ss4.jpeg ├── server ├── Procfile ├── app.py ├── data.csv ├── data │ └── barefeet1.jpeg ├── encode.bin ├── main.py ├── new.jpeg ├── requirements.txt ├── runtime.txt └── utils.py ├── test └── widget_test.dart └── web ├── favicon.png ├── icons ├── Icon-192.png ├── Icon-512.png ├── Icon-maskable-192.png └── Icon-maskable-512.png ├── index.html └── manifest.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | /unity/ 34 | /android/ 35 | /ios/ 36 | /server/myproject 37 | /server/output 38 | /server/images 39 | 40 | # Web related 41 | lib/generated_plugin_registrant.dart 42 | 43 | # Symbolication related 44 | app.*.symbols 45 | 46 | # Obfuscation related 47 | app.*.map.json 48 | 49 | # Android Studio will place build artifacts here 50 | /android/app/debug 51 | /android/app/profile 52 | /android/app/release 53 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 77d935af4db863f6abd0b9c31c7e6df2a13de57b 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # AR Virtual Footwear Try-on 4 | 5 | An application that mimics a physical shopping experience for the users through the use of Augmented Reality and Computer Vision. 6 | 7 | ## How to Use 8 | 9 | **Step 1:** 10 | 11 | Clone this repo by using the code below: 12 | 13 | ``` 14 | git clone https://github.com/aadilkhalifa/virtual-try-on.git 15 | ``` 16 | 17 | **Step 2:** 18 | 19 | Go to project root and execute the following command in console to get the required dependencies: 20 | 21 | ``` 22 | flutter pub get 23 | ``` 24 | 25 | **Step 2:** 26 | 27 | Run the app using the command: 28 | 29 | ``` 30 | flutter run 31 | ``` 32 | 33 | ## Features 34 | 35 | The app consists of 2 modules, the vitual footware try-on module and the foot size measurement module. 36 | 37 | ### Virtual Footware Try-on 38 | 39 | This module provides the user with an AR experience to try-on the shoe. The AR module is linked to snapchat making user of the AR shoe filters that Snapchat provides. 40 | 41 | ### Foot Size Measurement 42 | 43 | This module provides the user with the ability to measure his/her foot through the app. The user is asked to place the foot on an A4 size paper with the bottom of the foot aligned with the bottom of the sheet and take a picture of the foot along with the paper. A Flask server is hosted online which is where the image captured is sent. The server processes the image and calculates the size which is sent to the app and is displayed to the user. 44 | 45 | ## Tools & Libraries Used 46 | 47 | * [Flutter](https://flutter.dev/) (version 2.8) 48 | * [Flask](https://flask.palletsprojects.com/en/2.1.x/) 49 | * [Dio](https://github.com/flutterchina/dio) 50 | * [http](https://github.com/dart-lang/http) 51 | * [url_launcher](https://github.com/flutter/plugins/tree/main/packages/url_launcher/url_launcher) (to launch snapchat AR filter) 52 | * [camera](https://github.com/flutter/plugins/tree/main/packages/camera/camera) (To make use of mobile camera to capture image) 53 | * [Lens studio](https://lensstudio.snapchat.com/) 54 | 55 | ## To run server locally 56 | The server has been hosted online and the app sends a request to the remote server. To run the server locally for testing purposes the following can be done. 57 | 58 | cd into the server directory 59 | 60 | ``` 61 | cd server 62 | ``` 63 | 64 | Run the Flask server 65 | 66 | ``` 67 | flask run 68 | ``` 69 | This should start the server at localhost. 70 | 71 | ## Screenshots 72 | 73 | 74 | 75 | 76 | 77 | ## References 78 | - https://github.com/wildoctopus/FeetAndShoeMeasurement 79 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion flutter.compileSdkVersion 30 | 31 | compileOptions { 32 | sourceCompatibility JavaVersion.VERSION_1_8 33 | targetCompatibility JavaVersion.VERSION_1_8 34 | } 35 | 36 | kotlinOptions { 37 | jvmTarget = '1.8' 38 | } 39 | 40 | sourceSets { 41 | main.java.srcDirs += 'src/main/kotlin' 42 | } 43 | 44 | defaultConfig { 45 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 46 | applicationId "com.example.virtual_try_on" 47 | minSdkVersion 24 48 | multiDexEnabled true 49 | targetSdkVersion flutter.targetSdkVersion 50 | versionCode flutterVersionCode.toInteger() 51 | versionName flutterVersionName 52 | } 53 | 54 | buildTypes { 55 | release { 56 | // TODO: Add your own signing config for the release build. 57 | // Signing with the debug keys for now, so `flutter run --release` works. 58 | signingConfig signingConfigs.debug 59 | } 60 | } 61 | } 62 | 63 | flutter { 64 | source '../..' 65 | } 66 | 67 | 68 | dependencies { 69 | 70 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 71 | } 72 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/virtual_try_on/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.virtual_try_on 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | 15 | allprojects { 16 | repositories { 17 | // flatDir { 18 | // dirs "${project(':unityLibrary').projectDir}/libs" 19 | // } 20 | 21 | google() 22 | mavenCentral() 23 | } 24 | } 25 | 26 | rootProject.buildDir = '../build' 27 | subprojects { 28 | project.buildDir = "${rootProject.buildDir}/${project.name}" 29 | } 30 | subprojects { 31 | project.evaluationDependsOn(':app') 32 | } 33 | 34 | task clean(type: Delete) { 35 | delete rootProject.buildDir 36 | } 37 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | 13 | -------------------------------------------------------------------------------- /assets/Inter-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-Black.ttf -------------------------------------------------------------------------------- /assets/Inter-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-Bold.ttf -------------------------------------------------------------------------------- /assets/Inter-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-ExtraBold.ttf -------------------------------------------------------------------------------- /assets/Inter-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-ExtraLight.ttf -------------------------------------------------------------------------------- /assets/Inter-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-Light.ttf -------------------------------------------------------------------------------- /assets/Inter-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-Medium.ttf -------------------------------------------------------------------------------- /assets/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-Regular.ttf -------------------------------------------------------------------------------- /assets/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /assets/Inter-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/Inter-Thin.ttf -------------------------------------------------------------------------------- /assets/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/logo.jpg -------------------------------------------------------------------------------- /assets/shoe1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/shoe1.png -------------------------------------------------------------------------------- /assets/shoe2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/shoe2.png -------------------------------------------------------------------------------- /assets/shoe3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/assets/shoe3.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 9.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1300; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = ""; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = ""; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | ENABLE_BITCODE = NO; 292 | INFOPLIST_FILE = Runner/Info.plist; 293 | LD_RUNPATH_SEARCH_PATHS = ( 294 | "$(inherited)", 295 | "@executable_path/Frameworks", 296 | ); 297 | PRODUCT_BUNDLE_IDENTIFIER = com.example.virtualTryOn; 298 | PRODUCT_NAME = "$(TARGET_NAME)"; 299 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 300 | SWIFT_VERSION = 5.0; 301 | VERSIONING_SYSTEM = "apple-generic"; 302 | }; 303 | name = Profile; 304 | }; 305 | 97C147031CF9000F007C117D /* Debug */ = { 306 | isa = XCBuildConfiguration; 307 | buildSettings = { 308 | ALWAYS_SEARCH_USER_PATHS = NO; 309 | CLANG_ANALYZER_NONNULL = YES; 310 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 311 | CLANG_CXX_LIBRARY = "libc++"; 312 | CLANG_ENABLE_MODULES = YES; 313 | CLANG_ENABLE_OBJC_ARC = YES; 314 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 315 | CLANG_WARN_BOOL_CONVERSION = YES; 316 | CLANG_WARN_COMMA = YES; 317 | CLANG_WARN_CONSTANT_CONVERSION = YES; 318 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 319 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 320 | CLANG_WARN_EMPTY_BODY = YES; 321 | CLANG_WARN_ENUM_CONVERSION = YES; 322 | CLANG_WARN_INFINITE_RECURSION = YES; 323 | CLANG_WARN_INT_CONVERSION = YES; 324 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 325 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 326 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 327 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 328 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 329 | CLANG_WARN_STRICT_PROTOTYPES = YES; 330 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 331 | CLANG_WARN_UNREACHABLE_CODE = YES; 332 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 333 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 334 | COPY_PHASE_STRIP = NO; 335 | DEBUG_INFORMATION_FORMAT = dwarf; 336 | ENABLE_STRICT_OBJC_MSGSEND = YES; 337 | ENABLE_TESTABILITY = YES; 338 | GCC_C_LANGUAGE_STANDARD = gnu99; 339 | GCC_DYNAMIC_NO_PIC = NO; 340 | GCC_NO_COMMON_BLOCKS = YES; 341 | GCC_OPTIMIZATION_LEVEL = 0; 342 | GCC_PREPROCESSOR_DEFINITIONS = ( 343 | "DEBUG=1", 344 | "$(inherited)", 345 | ); 346 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 347 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 348 | GCC_WARN_UNDECLARED_SELECTOR = YES; 349 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 350 | GCC_WARN_UNUSED_FUNCTION = YES; 351 | GCC_WARN_UNUSED_VARIABLE = YES; 352 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 353 | MTL_ENABLE_DEBUG_INFO = YES; 354 | ONLY_ACTIVE_ARCH = YES; 355 | SDKROOT = iphoneos; 356 | TARGETED_DEVICE_FAMILY = "1,2"; 357 | }; 358 | name = Debug; 359 | }; 360 | 97C147041CF9000F007C117D /* Release */ = { 361 | isa = XCBuildConfiguration; 362 | buildSettings = { 363 | ALWAYS_SEARCH_USER_PATHS = NO; 364 | CLANG_ANALYZER_NONNULL = YES; 365 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 366 | CLANG_CXX_LIBRARY = "libc++"; 367 | CLANG_ENABLE_MODULES = YES; 368 | CLANG_ENABLE_OBJC_ARC = YES; 369 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 370 | CLANG_WARN_BOOL_CONVERSION = YES; 371 | CLANG_WARN_COMMA = YES; 372 | CLANG_WARN_CONSTANT_CONVERSION = YES; 373 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 374 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 375 | CLANG_WARN_EMPTY_BODY = YES; 376 | CLANG_WARN_ENUM_CONVERSION = YES; 377 | CLANG_WARN_INFINITE_RECURSION = YES; 378 | CLANG_WARN_INT_CONVERSION = YES; 379 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 380 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 381 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 382 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 383 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 384 | CLANG_WARN_STRICT_PROTOTYPES = YES; 385 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 386 | CLANG_WARN_UNREACHABLE_CODE = YES; 387 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 388 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 389 | COPY_PHASE_STRIP = NO; 390 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 391 | ENABLE_NS_ASSERTIONS = NO; 392 | ENABLE_STRICT_OBJC_MSGSEND = YES; 393 | GCC_C_LANGUAGE_STANDARD = gnu99; 394 | GCC_NO_COMMON_BLOCKS = YES; 395 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 396 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 397 | GCC_WARN_UNDECLARED_SELECTOR = YES; 398 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 399 | GCC_WARN_UNUSED_FUNCTION = YES; 400 | GCC_WARN_UNUSED_VARIABLE = YES; 401 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 402 | MTL_ENABLE_DEBUG_INFO = NO; 403 | SDKROOT = iphoneos; 404 | SUPPORTED_PLATFORMS = iphoneos; 405 | SWIFT_COMPILATION_MODE = wholemodule; 406 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 407 | TARGETED_DEVICE_FAMILY = "1,2"; 408 | VALIDATE_PRODUCT = YES; 409 | }; 410 | name = Release; 411 | }; 412 | 97C147061CF9000F007C117D /* Debug */ = { 413 | isa = XCBuildConfiguration; 414 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 415 | buildSettings = { 416 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 417 | CLANG_ENABLE_MODULES = YES; 418 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 419 | ENABLE_BITCODE = NO; 420 | INFOPLIST_FILE = Runner/Info.plist; 421 | LD_RUNPATH_SEARCH_PATHS = ( 422 | "$(inherited)", 423 | "@executable_path/Frameworks", 424 | ); 425 | PRODUCT_BUNDLE_IDENTIFIER = com.example.virtualTryOn; 426 | PRODUCT_NAME = "$(TARGET_NAME)"; 427 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 428 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 429 | SWIFT_VERSION = 5.0; 430 | VERSIONING_SYSTEM = "apple-generic"; 431 | }; 432 | name = Debug; 433 | }; 434 | 97C147071CF9000F007C117D /* Release */ = { 435 | isa = XCBuildConfiguration; 436 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 437 | buildSettings = { 438 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 439 | CLANG_ENABLE_MODULES = YES; 440 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 441 | ENABLE_BITCODE = NO; 442 | INFOPLIST_FILE = Runner/Info.plist; 443 | LD_RUNPATH_SEARCH_PATHS = ( 444 | "$(inherited)", 445 | "@executable_path/Frameworks", 446 | ); 447 | PRODUCT_BUNDLE_IDENTIFIER = com.example.virtualTryOn; 448 | PRODUCT_NAME = "$(TARGET_NAME)"; 449 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 450 | SWIFT_VERSION = 5.0; 451 | VERSIONING_SYSTEM = "apple-generic"; 452 | }; 453 | name = Release; 454 | }; 455 | /* End XCBuildConfiguration section */ 456 | 457 | /* Begin XCConfigurationList section */ 458 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 459 | isa = XCConfigurationList; 460 | buildConfigurations = ( 461 | 97C147031CF9000F007C117D /* Debug */, 462 | 97C147041CF9000F007C117D /* Release */, 463 | 249021D3217E4FDB00AE95B9 /* Profile */, 464 | ); 465 | defaultConfigurationIsVisible = 0; 466 | defaultConfigurationName = Release; 467 | }; 468 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 469 | isa = XCConfigurationList; 470 | buildConfigurations = ( 471 | 97C147061CF9000F007C117D /* Debug */, 472 | 97C147071CF9000F007C117D /* Release */, 473 | 249021D4217E4FDB00AE95B9 /* Profile */, 474 | ); 475 | defaultConfigurationIsVisible = 0; 476 | defaultConfigurationName = Release; 477 | }; 478 | /* End XCConfigurationList section */ 479 | }; 480 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 481 | } 482 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Virtual Try On 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | virtual_try_on 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/formPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart' as dio; 2 | import 'package:flutter/material.dart'; 3 | import 'package:http/http.dart'; 4 | import 'package:virtual_try_on/thankYouPage.dart'; 5 | 6 | class FormPage extends StatefulWidget { 7 | const FormPage({Key? key}) : super(key: key); 8 | 9 | @override 10 | State createState() => _FormPageState(); 11 | } 12 | 13 | class _FormPageState extends State { 14 | double sliderValue1 = 0; 15 | double sliderValue2 = 0; 16 | double sliderValue3 = 0; 17 | double sliderValue4 = 0; 18 | TextEditingController feedback_controller = TextEditingController(); 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return Scaffold( 23 | appBar: AppBar( 24 | title: Text('Survey'), 25 | ), 26 | body: Padding( 27 | padding: const EdgeInsets.all(8.0), 28 | child: Column( 29 | crossAxisAlignment: CrossAxisAlignment.stretch, 30 | children: [ 31 | Expanded( 32 | child: SingleChildScrollView( 33 | child: Column( 34 | mainAxisAlignment: MainAxisAlignment.start, 35 | crossAxisAlignment: CrossAxisAlignment.center, 36 | children: [ 37 | SizedBox(height: 8.0), 38 | Text('How satisfied are you with the experience?'), 39 | SizedBox(height: 8.0), 40 | Slider( 41 | value: sliderValue1, 42 | min: 0, 43 | max: 10, 44 | divisions: 10, 45 | label: sliderValue1.toString(), 46 | onChanged: (n) { 47 | sliderValue1 = n; 48 | setState(() {}); 49 | }, 50 | activeColor: Theme.of(context).colorScheme.secondary, 51 | inactiveColor: 52 | Theme.of(context).colorScheme.secondary.withAlpha(50), 53 | ), 54 | SizedBox(height: 8.0), 55 | Text( 56 | 'How intutive was the experience for a first time user?'), 57 | SizedBox(height: 8.0), 58 | Slider( 59 | value: sliderValue2, 60 | min: 0, 61 | max: 10, 62 | divisions: 10, 63 | label: sliderValue2.toString(), 64 | onChanged: (n) { 65 | sliderValue2 = n; 66 | setState(() {}); 67 | }, 68 | activeColor: Theme.of(context).colorScheme.secondary, 69 | inactiveColor: 70 | Theme.of(context).colorScheme.secondary.withAlpha(50), 71 | ), 72 | SizedBox(height: 8.0), 73 | Text('How likely are you to recommend this to someone?'), 74 | SizedBox(height: 8.0), 75 | Slider( 76 | value: sliderValue3, 77 | min: 0, 78 | max: 10, 79 | divisions: 10, 80 | label: sliderValue3.toString(), 81 | onChanged: (n) { 82 | sliderValue3 = n; 83 | setState(() {}); 84 | }, 85 | activeColor: Theme.of(context).colorScheme.secondary, 86 | inactiveColor: 87 | Theme.of(context).colorScheme.secondary.withAlpha(50), 88 | ), 89 | SizedBox(height: 8.0), 90 | Text( 91 | 'How much do you prefer this over a traditional ecommerce experience?', 92 | textAlign: TextAlign.center, 93 | ), 94 | SizedBox(height: 8.0), 95 | Slider( 96 | value: sliderValue4, 97 | min: 0, 98 | max: 10, 99 | divisions: 10, 100 | label: sliderValue4.toString(), 101 | onChanged: (n) { 102 | sliderValue4 = n; 103 | setState(() {}); 104 | }, 105 | activeColor: Theme.of(context).colorScheme.secondary, 106 | inactiveColor: 107 | Theme.of(context).colorScheme.secondary.withAlpha(50), 108 | ), 109 | Padding( 110 | padding: const EdgeInsets.all(8.0), 111 | child: TextField( 112 | controller: feedback_controller, 113 | maxLines: 5, 114 | decoration: InputDecoration( 115 | border: OutlineInputBorder(), 116 | hintText: 117 | 'Do you have any other feedback? Feel free to add that here.', 118 | ), 119 | ), 120 | ), 121 | ], 122 | ), 123 | ), 124 | ), 125 | ElevatedButton( 126 | child: Text('Submit response'), 127 | onPressed: () async { 128 | // print('start'); 129 | // print(sliderValue1); 130 | // print(sliderValue2); 131 | // print(sliderValue3); 132 | // print(sliderValue4); 133 | // print(feedback_controller.text); 134 | // print('end'); 135 | 136 | Map body = { 137 | 'field1': sliderValue1.toString(), 138 | 'field2': sliderValue2.toString(), 139 | 'field3': sliderValue3.toString(), 140 | 'field4': sliderValue4.toString(), 141 | 'field5': feedback_controller.text, 142 | }; 143 | 144 | Response r = await post( 145 | Uri.parse('http://aadilkhalifa.pythonanywhere.com/form'), 146 | body: body, 147 | ); 148 | // return; 149 | Route route = MaterialPageRoute( 150 | builder: (context) => ThankYouPage(survey: false)); 151 | Navigator.pushReplacement(context, route); 152 | }), 153 | ], 154 | ), 155 | ), 156 | ); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:camera/camera.dart'; 4 | import 'package:virtual_try_on/checkSizePage.dart'; 5 | import 'package:virtual_try_on/virtualTryOnPage.dart'; 6 | 7 | List? cameras; 8 | 9 | Future main() async { 10 | WidgetsFlutterBinding.ensureInitialized(); 11 | 12 | cameras = await availableCameras(); 13 | runApp(CameraApp()); 14 | } 15 | 16 | class CameraApp extends StatefulWidget { 17 | @override 18 | _CameraAppState createState() => _CameraAppState(); 19 | } 20 | 21 | class _CameraAppState extends State { 22 | CameraController? controller; 23 | late Future initializeControllerFuture; 24 | 25 | @override 26 | void initState() { 27 | super.initState(); 28 | controller = CameraController( 29 | cameras![0], 30 | ResolutionPreset.max, 31 | ); 32 | controller!.setFlashMode(FlashMode.off); 33 | initializeControllerFuture = controller!.initialize(); 34 | initializeControllerFuture.then((_) { 35 | if (!mounted) { 36 | return; 37 | } 38 | setState(() {}); 39 | }); 40 | } 41 | 42 | @override 43 | void dispose() { 44 | controller?.dispose(); 45 | super.dispose(); 46 | } 47 | 48 | @override 49 | Widget build(BuildContext context) { 50 | return MaterialApp( 51 | title: 'Flutter Demo', 52 | theme: ThemeData( 53 | // primarySwatch: Colors.grey, 54 | // fontFamily: 'Poppins', 55 | fontFamily: 'Inter', 56 | primaryColor: Color(0xFF001E1D), 57 | canvasColor: Color(0xFFE9E4E5), 58 | appBarTheme: AppBarTheme( 59 | backgroundColor: Color(0xFF001E1D), 60 | ), 61 | buttonTheme: ButtonThemeData( 62 | buttonColor: Color(0xFF001E1D), 63 | ), 64 | elevatedButtonTheme: ElevatedButtonThemeData( 65 | style: ButtonStyle( 66 | backgroundColor: 67 | MaterialStateProperty.all(Color(0xFF001E1D)), 68 | fixedSize: MaterialStateProperty.all(Size(200, 70)), 69 | shape: MaterialStateProperty.all( 70 | RoundedRectangleBorder( 71 | borderRadius: BorderRadius.circular(50))), 72 | ), 73 | ), 74 | outlinedButtonTheme: OutlinedButtonThemeData( 75 | style: ButtonStyle( 76 | backgroundColor: MaterialStateProperty.all(Colors.white), 77 | side: MaterialStateProperty.all(BorderSide( 78 | width: 1, 79 | // color: Color(0xFF001E1D), 80 | color: Colors.transparent, 81 | )), 82 | foregroundColor: 83 | MaterialStateProperty.all(Color(0xFF001E1D)), 84 | fixedSize: MaterialStateProperty.all(Size(200, 70)), 85 | shape: MaterialStateProperty.all( 86 | RoundedRectangleBorder( 87 | borderRadius: BorderRadius.circular(50), 88 | ), 89 | ), 90 | ), 91 | ), 92 | colorScheme: ColorScheme.fromSwatch().copyWith( 93 | secondary: Color(0xFFD96566), 94 | ), 95 | ), 96 | // home: MyHomePage(title: 'Virtual try on', controller: controller), 97 | initialRoute: '/home', 98 | routes: { 99 | // When navigating to the "/" route, build the FirstScreen widget. 100 | '/home': (context) => MyHomePage( 101 | title: 'Virtual try on', 102 | controller: controller, 103 | initializeControllerFuture: initializeControllerFuture), 104 | // When navigating to the "/second" route, build the SecondScreen widget. 105 | // '/second': (context) => const SecondScreen(), 106 | }, 107 | ); 108 | } 109 | } 110 | 111 | class MyHomePage extends StatefulWidget { 112 | MyHomePage({ 113 | Key? key, 114 | required this.title, 115 | required this.controller, 116 | required this.initializeControllerFuture, 117 | }) : super(key: key); 118 | 119 | final String title; 120 | CameraController? controller; 121 | Future initializeControllerFuture; 122 | 123 | @override 124 | State createState() => 125 | _MyHomePageState(controller, initializeControllerFuture); 126 | } 127 | 128 | class _MyHomePageState extends State { 129 | CameraController? controller; 130 | Future initializeControllerFuture; 131 | _MyHomePageState(CameraController? this.controller, 132 | Future this.initializeControllerFuture); 133 | 134 | @override 135 | Widget build(BuildContext context) { 136 | return Scaffold( 137 | appBar: AppBar( 138 | title: Text(widget.title), 139 | ), 140 | body: Center( 141 | child: Padding( 142 | padding: const EdgeInsets.all(8.0), 143 | child: Column( 144 | children: [ 145 | Expanded( 146 | child: Center( 147 | child: Padding( 148 | padding: const EdgeInsets.all(8.0), 149 | child: RichText( 150 | text: TextSpan( 151 | style: TextStyle( 152 | fontSize: 60, 153 | fontWeight: FontWeight.w400, 154 | color: Colors.black, 155 | ), 156 | children: [ 157 | TextSpan(text: 'A new and improved '), 158 | TextSpan( 159 | text: 'shopping ', 160 | style: TextStyle( 161 | fontWeight: FontWeight.bold, 162 | color: Theme.of(context).colorScheme.secondary, 163 | ), 164 | ), 165 | TextSpan(text: 'experience.'), 166 | ], 167 | )) 168 | // child: Text( 169 | // 'A new and improved shopping experience.', 170 | // style: TextStyle( 171 | // fontSize: 60, 172 | // fontWeight: FontWeight.w400, 173 | // ), 174 | // ), 175 | ), 176 | ), 177 | ), 178 | Column( 179 | mainAxisAlignment: MainAxisAlignment.center, 180 | crossAxisAlignment: CrossAxisAlignment.stretch, 181 | children: [ 182 | ElevatedButton( 183 | // style: ElevatedButton.styleFrom( 184 | // minimumSize: Size.fromHeight(40), 185 | // ), 186 | onPressed: () { 187 | Navigator.push( 188 | context, 189 | MaterialPageRoute( 190 | builder: (context) => CheckSizePage( 191 | controller: controller, 192 | initializeControllerFuture: 193 | initializeControllerFuture, 194 | )), 195 | ); 196 | }, 197 | child: const Text("Check size"), 198 | ), 199 | SizedBox( 200 | height: 10, 201 | ), 202 | ElevatedButton( 203 | style: ElevatedButton.styleFrom( 204 | // primary: Theme.of(context).primaryColor, 205 | ), 206 | onPressed: () { 207 | Navigator.push( 208 | context, 209 | MaterialPageRoute( 210 | builder: (context) => VirtualTryOnPage( 211 | controller: controller, 212 | initializeControllerFuture: 213 | initializeControllerFuture, 214 | )), 215 | ); 216 | }, 217 | child: const Text("Shop now"), 218 | ), 219 | ], 220 | ), 221 | ], 222 | ), 223 | ), 224 | ), 225 | ); 226 | } 227 | } 228 | -------------------------------------------------------------------------------- /lib/submitPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:camera/camera.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:virtual_try_on/checkSizePage.dart'; 4 | import 'package:virtual_try_on/formPage.dart'; 5 | import 'package:virtual_try_on/thankYouPage.dart'; 6 | 7 | class SubmitPage extends StatelessWidget { 8 | CameraController? controller; 9 | Future initializeControllerFuture; 10 | SubmitPage({ 11 | Key? key, 12 | required this.controller, 13 | required this.initializeControllerFuture, 14 | }) : super(key: key); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Scaffold( 19 | appBar: AppBar(title: Text('Submit page'), actions: [ 20 | TextButton( 21 | onPressed: () { 22 | Navigator.push( 23 | context, 24 | MaterialPageRoute( 25 | builder: (context) => CheckSizePage( 26 | controller: controller, 27 | initializeControllerFuture: initializeControllerFuture)), 28 | ); 29 | }, 30 | child: Text('Check size'), 31 | style: ButtonStyle( 32 | foregroundColor: MaterialStateProperty.all(Colors.white), 33 | ), 34 | ) 35 | ]), 36 | body: Padding( 37 | padding: const EdgeInsets.all(8.0), 38 | child: Column( 39 | crossAxisAlignment: CrossAxisAlignment.stretch, 40 | children: [ 41 | Expanded( 42 | child: SingleChildScrollView( 43 | child: Column( 44 | mainAxisAlignment: MainAxisAlignment.start, 45 | crossAxisAlignment: CrossAxisAlignment.stretch, 46 | children: [ 47 | SizedBox(height: 8.0), 48 | Text('Order details'), 49 | SizedBox(height: 8.0), 50 | TextField( 51 | keyboardType: TextInputType.number, 52 | decoration: InputDecoration( 53 | border: OutlineInputBorder(), 54 | hintText: 'Enter the quantity', 55 | ), 56 | ), 57 | SizedBox(height: 8.0), 58 | TextField( 59 | keyboardType: TextInputType.number, 60 | decoration: InputDecoration( 61 | border: OutlineInputBorder(), 62 | hintText: 'Enter the size', 63 | ), 64 | ), 65 | SizedBox(height: 16.0), 66 | Text('User details'), 67 | SizedBox(height: 8.0), 68 | TextField( 69 | decoration: InputDecoration( 70 | border: OutlineInputBorder(), 71 | hintText: 'Enter your name', 72 | ), 73 | ), 74 | SizedBox(height: 8.0), 75 | TextField( 76 | maxLines: 5, 77 | decoration: InputDecoration( 78 | border: OutlineInputBorder(), 79 | hintText: 'Enter your address', 80 | ), 81 | ), 82 | ], 83 | ), 84 | ), 85 | ), 86 | ElevatedButton( 87 | child: Text('Place order'), 88 | onPressed: () { 89 | Navigator.push( 90 | context, 91 | MaterialPageRoute( 92 | builder: (context) => ThankYouPage(survey: true)), 93 | ); 94 | }), 95 | ], 96 | ), 97 | ), 98 | ); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /lib/thankYouPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:virtual_try_on/formPage.dart'; 3 | 4 | class ThankYouPage extends StatefulWidget { 5 | final bool survey; 6 | const ThankYouPage({Key? key, required this.survey}) : super(key: key); 7 | 8 | @override 9 | State createState() => _ThankYouPageState(); 10 | } 11 | 12 | class _ThankYouPageState extends State { 13 | @override 14 | Widget build(BuildContext context) { 15 | if (widget.survey) { 16 | return Scaffold( 17 | appBar: AppBar(title: Text('Thank you')), 18 | body: Center( 19 | child: Padding( 20 | padding: const EdgeInsets.all(8.0), 21 | child: Column( 22 | mainAxisAlignment: MainAxisAlignment.center, 23 | crossAxisAlignment: CrossAxisAlignment.stretch, 24 | children: [ 25 | Center( 26 | child: Text( 27 | 'Thank you for shopping with us.', 28 | style: TextStyle( 29 | fontSize: 16.0, 30 | fontWeight: FontWeight.w500, 31 | ), 32 | ), 33 | ), 34 | SizedBox( 35 | height: 16, 36 | ), 37 | ElevatedButton( 38 | onPressed: () { 39 | Navigator.push( 40 | context, 41 | MaterialPageRoute(builder: (context) => FormPage()), 42 | ); 43 | }, 44 | child: Text('Take a survey'), 45 | ), 46 | SizedBox(height: 8.0), 47 | OutlinedButton( 48 | onPressed: () { 49 | Navigator.of(context).pushNamedAndRemoveUntil( 50 | '/home', (Route route) => false); 51 | }, 52 | child: Text('Back to home page'), 53 | ) 54 | ], 55 | ), 56 | ), 57 | ), 58 | ); 59 | } else { 60 | return Scaffold( 61 | appBar: AppBar(title: Text('Thank you')), 62 | body: Padding( 63 | padding: const EdgeInsets.all(8.0), 64 | child: Center( 65 | child: Column( 66 | mainAxisAlignment: MainAxisAlignment.center, 67 | crossAxisAlignment: CrossAxisAlignment.stretch, 68 | children: [ 69 | Center( 70 | child: Text( 71 | 'Thank you for taking the survey.', 72 | style: TextStyle( 73 | fontSize: 16.0, 74 | fontWeight: FontWeight.w500, 75 | ), 76 | ), 77 | ), 78 | SizedBox( 79 | height: 16, 80 | ), 81 | ElevatedButton( 82 | onPressed: () { 83 | Navigator.of(context).pushNamedAndRemoveUntil( 84 | '/home', (Route route) => false); 85 | }, 86 | child: Text('Back to home page'), 87 | ) 88 | ], 89 | ), 90 | ), 91 | ), 92 | ); 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /lib/virtualTryOnPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'dart:async'; 3 | import 'package:camera/camera.dart'; 4 | import 'package:virtual_try_on/submitPage.dart'; 5 | import 'package:url_launcher/url_launcher.dart'; 6 | 7 | import 'formPage.dart'; 8 | 9 | class VirtualTryOnPage extends StatefulWidget { 10 | CameraController? controller; 11 | Future initializeControllerFuture; 12 | VirtualTryOnPage({ 13 | Key? key, 14 | required this.controller, 15 | required this.initializeControllerFuture, 16 | }) : super(key: key); 17 | 18 | @override 19 | State createState() => _VirtualTryOnPageState(); 20 | } 21 | 22 | class _VirtualTryOnPageState extends State { 23 | var selected = 1; 24 | 25 | final snapchat_urls = [ 26 | 'https://lens.snapchat.com/4394187f0b4c428c913656befdfcc633?share_id=BBCCa9fseJ4&locale=en-GB', 27 | 'https://lens.snapchat.com/5f8ef5e0aae94cb08593385483380143?share_id=0A-hipzMDi0&locale=en-GB', 28 | 'https://lens.snapchat.com/35bc001ea386442ea1b7954527950c8e?share_id=N7eWayFqB1c&locale=en-GB', 29 | ]; 30 | 31 | @override 32 | Widget build(BuildContext context) { 33 | Future _showMyDialog() async { 34 | return showDialog( 35 | context: context, 36 | barrierDismissible: false, // user must tap button! 37 | builder: (BuildContext context) { 38 | return AlertDialog( 39 | title: const Text('Guide to using the module'), 40 | content: SingleChildScrollView( 41 | child: ListBody( 42 | children: const [ 43 | Text('Step 1:', 44 | style: TextStyle(fontWeight: FontWeight.bold)), 45 | Text( 46 | 'Use the bottom list to navigate through the available shoe options.'), 47 | SizedBox(height: 8.0), 48 | Text('Step 2:', 49 | style: TextStyle(fontWeight: FontWeight.bold)), 50 | Text( 51 | 'You can make use of the AR virtual try on feature by clicking on the "Try AR filter" button'), 52 | SizedBox(height: 8.0), 53 | Text('Step 3:', 54 | style: TextStyle(fontWeight: FontWeight.bold)), 55 | Text( 56 | 'Once desired shoe is selected, you can proceed by clicking on the button on the app bar.'), 57 | ], 58 | ), 59 | ), 60 | actions: [ 61 | TextButton( 62 | child: const Text('Back'), 63 | onPressed: () { 64 | Navigator.of(context).pop(); 65 | }, 66 | ), 67 | ], 68 | ); 69 | }, 70 | ); 71 | } 72 | 73 | return Scaffold( 74 | appBar: AppBar( 75 | title: Text('Virtual try on'), 76 | actions: [ 77 | Center( 78 | child: Row( 79 | children: [ 80 | TextButton( 81 | child: Text( 82 | 'Help', 83 | style: TextStyle( 84 | color: Colors.white, 85 | ), 86 | ), 87 | onPressed: _showMyDialog, 88 | ), 89 | TextButton( 90 | child: Text( 91 | 'Proceed', 92 | style: TextStyle( 93 | color: Colors.white, 94 | ), 95 | ), 96 | onPressed: () { 97 | Navigator.push( 98 | context, 99 | MaterialPageRoute( 100 | builder: (context) => SubmitPage( 101 | controller: widget.controller, 102 | initializeControllerFuture: 103 | widget.initializeControllerFuture, 104 | )), 105 | ); 106 | }, 107 | ), 108 | ], 109 | ), 110 | ), 111 | SizedBox( 112 | width: 20, 113 | ) 114 | ], 115 | ), 116 | body: Center( 117 | child: Stack(children: [ 118 | // (!widget.controller!.value.isInitialized) 119 | // ? Container() 120 | // : MaterialApp( 121 | // home: CameraPreview(widget.controller!), 122 | // ), 123 | // UnityDemoScreen(), 124 | Center( 125 | child: Column( 126 | mainAxisAlignment: MainAxisAlignment.center, 127 | crossAxisAlignment: CrossAxisAlignment.center, 128 | children: [ 129 | Image( 130 | image: AssetImage( 131 | 'assets/shoe' + (selected).toString() + '.png')), 132 | SizedBox(height: 32.0), 133 | OutlinedButton( 134 | child: Text('Try AR filter'), 135 | onPressed: () { 136 | _launchURL(snapchat_urls[selected - 1]); 137 | }, 138 | ), 139 | ], 140 | ), 141 | ), 142 | Align( 143 | alignment: Alignment.bottomCenter, 144 | child: Container( 145 | height: 120.0, 146 | // color: Colors.red, 147 | child: ListView( 148 | scrollDirection: Axis.horizontal, 149 | children: List.generate(3, (int index) { 150 | return GestureDetector( 151 | onTap: () { 152 | selected = index + 1; 153 | setState(() {}); 154 | }, 155 | child: Card( 156 | // color: Colors.blue[index * 100], 157 | child: Container( 158 | width: 100.0, 159 | height: 100.0, 160 | decoration: BoxDecoration( 161 | // borderRadius: BorderRadius.circular(20), 162 | border: selected == index + 1 163 | ? Border.all( 164 | width: 3.0, 165 | color: 166 | Theme.of(context).colorScheme.secondary) 167 | : null), 168 | // child: Center(child: Text("Shoe ${index + 1}")), 169 | child: Center( 170 | child: Image( 171 | image: AssetImage('assets/shoe' + 172 | (index + 1).toString() + 173 | '.png'))), 174 | ), 175 | ), 176 | ); 177 | return Card( 178 | // color: Colors.blue[index * 100], 179 | child: Container( 180 | width: 100.0, 181 | height: 100.0, 182 | child: Center(child: Text("Shoe ${index + 1}")), 183 | ), 184 | ); 185 | }), 186 | ), 187 | ), 188 | ), 189 | ]), 190 | ), 191 | ); 192 | } 193 | } 194 | 195 | void _launchURL(_url) async { 196 | if (!await launch(_url)) throw 'Could not launch $_url'; 197 | } 198 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.8.2" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.1.0" 18 | camera: 19 | dependency: "direct main" 20 | description: 21 | name: camera 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "0.9.4+11" 25 | camera_platform_interface: 26 | dependency: transitive 27 | description: 28 | name: camera_platform_interface 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.1.5" 32 | camera_web: 33 | dependency: transitive 34 | description: 35 | name: camera_web 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "0.2.1+1" 39 | characters: 40 | dependency: transitive 41 | description: 42 | name: characters 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.2.0" 46 | charcode: 47 | dependency: transitive 48 | description: 49 | name: charcode 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.3.1" 53 | clock: 54 | dependency: transitive 55 | description: 56 | name: clock 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.1.0" 60 | collection: 61 | dependency: transitive 62 | description: 63 | name: collection 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.15.0" 67 | cross_file: 68 | dependency: transitive 69 | description: 70 | name: cross_file 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "0.3.2" 74 | cupertino_icons: 75 | dependency: "direct main" 76 | description: 77 | name: cupertino_icons 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.0.4" 81 | dio: 82 | dependency: "direct main" 83 | description: 84 | name: dio 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "4.0.6" 88 | fake_async: 89 | dependency: transitive 90 | description: 91 | name: fake_async 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "1.2.0" 95 | flutter: 96 | dependency: "direct main" 97 | description: flutter 98 | source: sdk 99 | version: "0.0.0" 100 | flutter_lints: 101 | dependency: "direct dev" 102 | description: 103 | name: flutter_lints 104 | url: "https://pub.dartlang.org" 105 | source: hosted 106 | version: "1.0.4" 107 | flutter_plugin_android_lifecycle: 108 | dependency: transitive 109 | description: 110 | name: flutter_plugin_android_lifecycle 111 | url: "https://pub.dartlang.org" 112 | source: hosted 113 | version: "2.0.5" 114 | flutter_test: 115 | dependency: "direct dev" 116 | description: flutter 117 | source: sdk 118 | version: "0.0.0" 119 | flutter_web_plugins: 120 | dependency: transitive 121 | description: flutter 122 | source: sdk 123 | version: "0.0.0" 124 | http: 125 | dependency: "direct main" 126 | description: 127 | name: http 128 | url: "https://pub.dartlang.org" 129 | source: hosted 130 | version: "0.13.4" 131 | http_parser: 132 | dependency: transitive 133 | description: 134 | name: http_parser 135 | url: "https://pub.dartlang.org" 136 | source: hosted 137 | version: "4.0.0" 138 | js: 139 | dependency: transitive 140 | description: 141 | name: js 142 | url: "https://pub.dartlang.org" 143 | source: hosted 144 | version: "0.6.3" 145 | lints: 146 | dependency: transitive 147 | description: 148 | name: lints 149 | url: "https://pub.dartlang.org" 150 | source: hosted 151 | version: "1.0.1" 152 | matcher: 153 | dependency: transitive 154 | description: 155 | name: matcher 156 | url: "https://pub.dartlang.org" 157 | source: hosted 158 | version: "0.12.11" 159 | meta: 160 | dependency: transitive 161 | description: 162 | name: meta 163 | url: "https://pub.dartlang.org" 164 | source: hosted 165 | version: "1.7.0" 166 | path: 167 | dependency: transitive 168 | description: 169 | name: path 170 | url: "https://pub.dartlang.org" 171 | source: hosted 172 | version: "1.8.0" 173 | pedantic: 174 | dependency: transitive 175 | description: 176 | name: pedantic 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "1.11.1" 180 | plugin_platform_interface: 181 | dependency: transitive 182 | description: 183 | name: plugin_platform_interface 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "2.1.2" 187 | quiver: 188 | dependency: transitive 189 | description: 190 | name: quiver 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "3.0.1+1" 194 | sky_engine: 195 | dependency: transitive 196 | description: flutter 197 | source: sdk 198 | version: "0.0.99" 199 | source_span: 200 | dependency: transitive 201 | description: 202 | name: source_span 203 | url: "https://pub.dartlang.org" 204 | source: hosted 205 | version: "1.8.1" 206 | stack_trace: 207 | dependency: transitive 208 | description: 209 | name: stack_trace 210 | url: "https://pub.dartlang.org" 211 | source: hosted 212 | version: "1.10.0" 213 | stream_channel: 214 | dependency: transitive 215 | description: 216 | name: stream_channel 217 | url: "https://pub.dartlang.org" 218 | source: hosted 219 | version: "2.1.0" 220 | stream_transform: 221 | dependency: transitive 222 | description: 223 | name: stream_transform 224 | url: "https://pub.dartlang.org" 225 | source: hosted 226 | version: "2.0.0" 227 | string_scanner: 228 | dependency: transitive 229 | description: 230 | name: string_scanner 231 | url: "https://pub.dartlang.org" 232 | source: hosted 233 | version: "1.1.0" 234 | term_glyph: 235 | dependency: transitive 236 | description: 237 | name: term_glyph 238 | url: "https://pub.dartlang.org" 239 | source: hosted 240 | version: "1.2.0" 241 | test_api: 242 | dependency: transitive 243 | description: 244 | name: test_api 245 | url: "https://pub.dartlang.org" 246 | source: hosted 247 | version: "0.4.3" 248 | typed_data: 249 | dependency: transitive 250 | description: 251 | name: typed_data 252 | url: "https://pub.dartlang.org" 253 | source: hosted 254 | version: "1.3.0" 255 | url_launcher: 256 | dependency: "direct main" 257 | description: 258 | name: url_launcher 259 | url: "https://pub.dartlang.org" 260 | source: hosted 261 | version: "6.0.20" 262 | url_launcher_android: 263 | dependency: transitive 264 | description: 265 | name: url_launcher_android 266 | url: "https://pub.dartlang.org" 267 | source: hosted 268 | version: "6.0.15" 269 | url_launcher_ios: 270 | dependency: transitive 271 | description: 272 | name: url_launcher_ios 273 | url: "https://pub.dartlang.org" 274 | source: hosted 275 | version: "6.0.15" 276 | url_launcher_linux: 277 | dependency: transitive 278 | description: 279 | name: url_launcher_linux 280 | url: "https://pub.dartlang.org" 281 | source: hosted 282 | version: "3.0.0" 283 | url_launcher_macos: 284 | dependency: transitive 285 | description: 286 | name: url_launcher_macos 287 | url: "https://pub.dartlang.org" 288 | source: hosted 289 | version: "3.0.0" 290 | url_launcher_platform_interface: 291 | dependency: transitive 292 | description: 293 | name: url_launcher_platform_interface 294 | url: "https://pub.dartlang.org" 295 | source: hosted 296 | version: "2.0.5" 297 | url_launcher_web: 298 | dependency: transitive 299 | description: 300 | name: url_launcher_web 301 | url: "https://pub.dartlang.org" 302 | source: hosted 303 | version: "2.0.6" 304 | url_launcher_windows: 305 | dependency: transitive 306 | description: 307 | name: url_launcher_windows 308 | url: "https://pub.dartlang.org" 309 | source: hosted 310 | version: "3.0.0" 311 | vector_math: 312 | dependency: transitive 313 | description: 314 | name: vector_math 315 | url: "https://pub.dartlang.org" 316 | source: hosted 317 | version: "2.1.1" 318 | sdks: 319 | dart: ">=2.15.1 <3.0.0" 320 | flutter: ">=2.8.0" 321 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: virtual_try_on 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `flutter pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.15.1 <3.0.0" 22 | 23 | # Dependencies specify other packages that your package needs in order to work. 24 | # To automatically upgrade your package dependencies to the latest versions 25 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 26 | # dependencies can be manually updated by changing the version numbers below to 27 | # the latest version available on pub.dev. To see which dependencies have newer 28 | # versions available, run `flutter pub outdated`. 29 | dependencies: 30 | flutter: 31 | sdk: flutter 32 | camera: ^0.9.4+2 33 | # flutter_unity_widget: ^2020.3.25 34 | 35 | 36 | # The following adds the Cupertino Icons font to your application. 37 | # Use with the CupertinoIcons class for iOS style icons. 38 | cupertino_icons: ^1.0.2 39 | dio: ^4.0.6 40 | http: ^0.13.4 41 | url_launcher: ^6.0.20 42 | 43 | dev_dependencies: 44 | flutter_test: 45 | sdk: flutter 46 | 47 | # The "flutter_lints" package below contains a set of recommended lints to 48 | # encourage good coding practices. The lint set provided by the package is 49 | # activated in the `analysis_options.yaml` file located at the root of your 50 | # package. See that file for information about deactivating specific lint 51 | # rules and activating additional ones. 52 | flutter_lints: ^1.0.0 53 | 54 | # For information on the generic Dart part of this file, see the 55 | # following page: https://dart.dev/tools/pub/pubspec 56 | 57 | # The following section is specific to Flutter. 58 | flutter: 59 | 60 | # The following line ensures that the Material Icons font is 61 | # included with your application, so that you can use the icons in 62 | # the material Icons class. 63 | uses-material-design: true 64 | 65 | # To add assets to your application, add an assets section, like this: 66 | assets: 67 | - assets/shoe1.png 68 | - assets/shoe2.png 69 | - assets/shoe3.png 70 | 71 | # An image asset can refer to one or more resolution-specific "variants", see 72 | # https://flutter.dev/assets-and-images/#resolution-aware. 73 | 74 | # For details regarding adding assets from package dependencies, see 75 | # https://flutter.dev/assets-and-images/#from-packages 76 | 77 | # To add custom fonts to your application, add a fonts section here, 78 | # in this "flutter" section. Each entry in this list should have a 79 | # "family" key with the font family name, and a "fonts" key with a 80 | # list giving the asset and other descriptors for the font. For 81 | # example: 82 | fonts: 83 | - family: Inter 84 | fonts: 85 | - asset: assets/Inter-Regular.ttf 86 | - asset: assets/Inter-Medium.ttf 87 | weight: 500 88 | - asset: assets/Inter-SemiBold.ttf 89 | weight: 600 90 | - asset: assets/Inter-Bold.ttf 91 | weight: 700 92 | # 93 | # For details regarding fonts from package dependencies, 94 | # see https://flutter.dev/custom-fonts/#from-packages 95 | -------------------------------------------------------------------------------- /screenshots/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/screenshots/logo.jpg -------------------------------------------------------------------------------- /screenshots/ss1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/screenshots/ss1.jpeg -------------------------------------------------------------------------------- /screenshots/ss2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/screenshots/ss2.jpeg -------------------------------------------------------------------------------- /screenshots/ss3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/screenshots/ss3.jpeg -------------------------------------------------------------------------------- /screenshots/ss4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/screenshots/ss4.jpeg -------------------------------------------------------------------------------- /server/Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn app:app 2 | -------------------------------------------------------------------------------- /server/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask import request 3 | from main import * 4 | import os 5 | from csv import writer 6 | 7 | app = Flask(__name__) 8 | 9 | @app.route("/", methods=["GET", "POST"]) 10 | def hello(): 11 | if request.method == 'GET': 12 | return 'GET request' 13 | 14 | if request.method == 'POST': 15 | # return request.form['image'] 16 | return main(request.form['image']) 17 | 18 | @app.route("/image", methods=["POST"]) 19 | def get_image(): 20 | 21 | if request.method == 'POST': 22 | image = request.files["img"] 23 | image.save(os.path.join(os.getcwd(), 'new.jpeg')) 24 | return main(os.path.join(os.getcwd(), 'new.jpeg')) 25 | 26 | @app.route("/form", methods=["POST"]) 27 | def get_form(): 28 | 29 | if request.method == 'POST': 30 | data = [ 31 | request.form.get('field1'), 32 | request.form.get('field2'), 33 | request.form.get('field3'), 34 | request.form.get('field4'), 35 | request.form.get('field5'), 36 | ] 37 | print(data) 38 | # s = '' 39 | # for a in data: 40 | # s += a + ' ' 41 | 42 | with open('data.csv', 'a', newline='') as f_object: 43 | # Pass the CSV file object to the writer() function 44 | writer_object = writer(f_object) 45 | # Result - a writer object 46 | # Pass the data in the list as an argument into the writerow() function 47 | writer_object.writerow(data) 48 | # Close the file object 49 | f_object.close() 50 | return request.form 51 | 52 | if __name__ == "__main__": 53 | app.run() 54 | -------------------------------------------------------------------------------- /server/data.csv: -------------------------------------------------------------------------------- 1 | val1,val2,val3,val4,val5 2 | val1,val2,val3,val4,val5 3 | -------------------------------------------------------------------------------- /server/data/barefeet1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/server/data/barefeet1.jpeg -------------------------------------------------------------------------------- /server/main.py: -------------------------------------------------------------------------------- 1 | import base64 2 | from sklearn.cluster import KMeans 3 | import random as rng 4 | import cv2 5 | # import imutils 6 | import argparse 7 | # from imutils import contours 8 | from skimage.io import imread 9 | import numpy as np 10 | import matplotlib.pyplot as plt 11 | import os 12 | 13 | from utils import * 14 | 15 | 16 | ImgPath = 'data/barefeet1.jpeg' 17 | 18 | # with open(ImgPath, "rb") as image2string: 19 | # converted_string = base64.b64encode(image2string.read()) 20 | # with open('encode.bin', "wb") as file: 21 | # file.write(converted_string) 22 | 23 | # file = open('encode.bin', 'rb') 24 | # byte = file.read() 25 | # file.close() 26 | 27 | # decodeit = open('new.jpeg', 'wb') 28 | # decodeit.write(base64.b64decode((byte))) 29 | # decodeit.close() 30 | 31 | 32 | 33 | # def main(byte): 34 | def main(ImgPath): 35 | 36 | oimg = imread(ImgPath) 37 | 38 | # decodeit = open('new.jpeg', 'wb') 39 | # decodeit.write(base64.b64decode((byte))) 40 | # decodeit.close() 41 | # oimg = oimg = imread('new.jpeg') 42 | 43 | if not os.path.exists('output'): 44 | os.makedirs('output') 45 | 46 | 47 | 48 | preprocessedOimg = preprocess(oimg) 49 | cv2.imwrite('output/preprocessedOimg.jpg', preprocessedOimg) 50 | 51 | clusteredImg = kMeans_cluster(preprocessedOimg) 52 | cv2.imwrite('output/clusteredImg.jpg', clusteredImg) 53 | 54 | edgedImg = edgeDetection(clusteredImg) 55 | cv2.imwrite('output/edgedImg.jpg', edgedImg) 56 | 57 | boundRect, contours, contours_poly, img = getBoundingBox(edgedImg) 58 | pdraw = drawCnt(boundRect[1], contours, contours_poly, img) 59 | cv2.imwrite('output/pdraw.jpg', pdraw) 60 | 61 | 62 | croppedImg, pcropedImg = cropOrig(boundRect[1], clusteredImg) 63 | cv2.imwrite('output/croppedImg.jpg', croppedImg) 64 | 65 | 66 | newImg = overlayImage(croppedImg, pcropedImg) 67 | cv2.imwrite('output/newImg.jpg', newImg) 68 | 69 | fedged = edgeDetection(newImg) 70 | fboundRect, fcnt, fcntpoly, fimg = getBoundingBox(fedged) 71 | fdraw = drawCnt(fboundRect[2], fcnt, fcntpoly, fimg) 72 | cv2.imwrite('output/fdraw.jpg', fdraw) 73 | 74 | res = ("feet size (cm): " + str(calcFeetSize(pcropedImg, fboundRect)/10)) 75 | return res 76 | 77 | 78 | # if __name__ == '__main__': 79 | # main() -------------------------------------------------------------------------------- /server/new.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/server/new.jpeg -------------------------------------------------------------------------------- /server/requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/server/requirements.txt -------------------------------------------------------------------------------- /server/runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.7.13 -------------------------------------------------------------------------------- /server/utils.py: -------------------------------------------------------------------------------- 1 | from sklearn.cluster import KMeans 2 | import random as rng 3 | import cv2 4 | # import imutils 5 | import argparse 6 | from skimage.io import imread 7 | import numpy as np 8 | import matplotlib.pyplot as plt 9 | 10 | 11 | 12 | def preprocess(img): 13 | 14 | img = cv2.cvtColor(img, cv2.COLOR_RGB2HSV) 15 | 16 | img = cv2.GaussianBlur(img, (9, 9), 0) 17 | img = img/255 18 | 19 | return img 20 | 21 | def plotImage(img): 22 | 23 | plt.imshow(img) 24 | #plt.title('Clustered Image') 25 | plt.show() 26 | 27 | def cropOrig(bRect, oimg): 28 | # x (Horizontal), y (Vertical Downwards) are start coordinates 29 | # img.shape[0] = height of image 30 | # img.shape[1] = width of image 31 | 32 | x,y,w,h = bRect 33 | 34 | print(x,y,w,h) 35 | pcropedImg = oimg[y:y+h,x:x+w] 36 | 37 | x1, y1, w1, h1 = 0, 0, pcropedImg.shape[1], pcropedImg.shape[0] 38 | 39 | y2 = int(h1/10) 40 | 41 | x2 = int(w1/10) 42 | 43 | crop1 = pcropedImg[y1+y2:h1-y2,x1+x2:w1-x2] 44 | 45 | #cv2_imshow(crop1) 46 | 47 | ix, iy, iw, ih = x+x2, y+y2, crop1.shape[1], crop1.shape[0] 48 | 49 | croppedImg = oimg[iy:iy+ih,ix:ix+iw] 50 | 51 | return croppedImg, pcropedImg 52 | 53 | 54 | 55 | def overlayImage(croppedImg, pcropedImg): 56 | 57 | 58 | x1, y1, w1, h1 = 0, 0, pcropedImg.shape[1], pcropedImg.shape[0] 59 | 60 | y2 = int(h1/10) 61 | 62 | x2 = int(w1/10) 63 | 64 | new_image = np.zeros((pcropedImg.shape[0], pcropedImg.shape[1], 3), np.uint8) 65 | new_image[:, 0:pcropedImg.shape[1]] = (255, 0, 0) # (B, G, R) 66 | 67 | new_image[ y1+y2:y1+y2+croppedImg.shape[0], x1+x2:x1+x2+croppedImg.shape[1]] = croppedImg 68 | 69 | return new_image 70 | 71 | 72 | 73 | def kMeans_cluster(img): 74 | 75 | # For clustering the image using k-means, we first need to convert it into a 2-dimensional array 76 | # (H*W, N) N is channel = 3 77 | image_2D = img.reshape(img.shape[0]*img.shape[1], img.shape[2]) 78 | 79 | # tweak the cluster size and see what happens to the Output 80 | kmeans = KMeans(n_clusters=2, random_state=0).fit(image_2D) 81 | clustOut = kmeans.cluster_centers_[kmeans.labels_] 82 | 83 | # Reshape back the image from 2D to 3D image 84 | clustered_3D = clustOut.reshape(img.shape[0], img.shape[1], img.shape[2]) 85 | 86 | clusteredImg = np.uint8(clustered_3D*255) 87 | 88 | return clusteredImg 89 | 90 | 91 | def edgeDetection(clusteredImage): 92 | #gray = cv2.cvtColor(hsvImage, cv2.COLOR_BGR2GRAY) 93 | edged1 = cv2.Canny(clusteredImage, 0, 255) 94 | edged = cv2.dilate(edged1, None, iterations=1) 95 | edged = cv2.erode(edged, None, iterations=1) 96 | return edged 97 | 98 | def getBoundingBox(img): 99 | 100 | contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 101 | 102 | #print(len(contours)) 103 | contours = sorted(contours, key=lambda x: cv2.contourArea(x), reverse=True) 104 | 105 | 106 | 107 | contours_poly = [None]*len(contours) 108 | boundRect = [None]*len(contours) 109 | 110 | for i, c in enumerate(contours): 111 | contours_poly[i] = cv2.approxPolyDP(c, 3, True) 112 | boundRect[i] = cv2.boundingRect(contours_poly[i]) 113 | 114 | 115 | return boundRect, contours, contours_poly, img 116 | 117 | 118 | def drawCnt(bRect, contours, cntPoly, img): 119 | 120 | drawing = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8) 121 | 122 | 123 | paperbb = bRect 124 | 125 | for i in range(len(contours)): 126 | color = (rng.randint(0,256), rng.randint(0,256), rng.randint(0,256)) 127 | cv2.drawContours(drawing, cntPoly, i, color) 128 | #cv2.rectangle(drawing, (int(boundRect[i][0]), int(boundRect[i][1])), \ 129 | #(int(boundRect[i][0]+boundRect[i][2]), int(boundRect[i][1]+boundRect[i][3])), color, 2) 130 | cv2.rectangle(drawing, (int(paperbb[0]), int(paperbb[1])), \ 131 | (int(paperbb[0]+paperbb[2]), int(paperbb[1]+paperbb[3])), color, 2) 132 | 133 | return drawing 134 | 135 | 136 | def calcFeetSize(pcropedImg, fboundRect): 137 | x1, y1, w1, h1 = 0, 0, pcropedImg.shape[1], pcropedImg.shape[0] 138 | 139 | y2 = int(h1/10) 140 | 141 | x2 = int(w1/10) 142 | 143 | fh = y2 + fboundRect[2][3] 144 | fw = x2 + fboundRect[2][2] 145 | ph = pcropedImg.shape[0] 146 | pw = pcropedImg.shape[1] 147 | 148 | opw = 210 149 | oph = 297 150 | 151 | ofs = 0.0 152 | 153 | if fw>fh: 154 | ofs = (opw/pw)*fw 155 | else : 156 | ofs = (oph/ph)*fh 157 | 158 | 159 | 160 | return ofs -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:virtual_try_on/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(const MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aadilkhalifa/virtual-try-on/0270283c0ba8c6be28325016979d47c0a498b335/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | virtual_try_on 33 | 34 | 35 | 36 | 39 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "virtual_try_on", 3 | "short_name": "virtual_try_on", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | --------------------------------------------------------------------------------