├── .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 |
--------------------------------------------------------------------------------