├── .github
└── FUNDING.yml
├── .gitignore
├── README.md
├── ecommerce_perfume_app
├── .metadata
├── README.md
├── android
│ ├── .gitignore
│ ├── app
│ │ ├── build.gradle
│ │ └── src
│ │ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── flutterando_perfume_ecommerce_challenge
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res
│ │ │ │ ├── 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
│ │ │ │ └── styles.xml
│ │ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ └── gradle-wrapper.properties
│ └── settings.gradle
├── assets
│ ├── fonts
│ │ ├── truenobd.otf
│ │ └── truenorg.otf
│ └── images
│ │ └── coco-noir.png
├── ios
│ ├── .gitignore
│ ├── Flutter
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Runner.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── Runner
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ └── README.md
│ │ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
├── lib
│ ├── main.dart
│ ├── models
│ │ └── product.dart
│ ├── pages
│ │ ├── home
│ │ │ ├── home_page.dart
│ │ │ └── widgets
│ │ │ │ ├── best_deals.dart
│ │ │ │ ├── best_deals_product.dart
│ │ │ │ ├── categories.dart
│ │ │ │ ├── dot.dart
│ │ │ │ ├── filters.dart
│ │ │ │ ├── products.dart
│ │ │ │ └── topbar.dart
│ │ └── product
│ │ │ ├── product_page.dart
│ │ │ └── widgets
│ │ │ ├── add_to_cart.dart
│ │ │ ├── indicators.dart
│ │ │ ├── info.dart
│ │ │ └── topbar.dart
│ └── utils
│ │ └── constants.dart
├── pubspec.lock
├── pubspec.yaml
├── screenshots
│ ├── android_1.png
│ ├── android_2.png
│ ├── ios_1.png
│ └── ios_2.png
└── test
│ └── widget_test.dart
├── email_client
├── .github
│ ├── android_1.png
│ ├── android_2.png
│ ├── demo.gif
│ ├── ios_1.png
│ └── ios_2.png
├── .gitignore
├── .metadata
├── README.md
├── android
│ ├── .gitignore
│ ├── app
│ │ ├── build.gradle
│ │ └── src
│ │ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── email_client
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res
│ │ │ │ ├── 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
│ │ │ │ └── styles.xml
│ │ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ └── gradle-wrapper.properties
│ └── settings.gradle
├── assets
│ └── images
│ │ ├── gmail.png
│ │ ├── outlook.png
│ │ └── pdf.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
│ ├── constants.dart
│ ├── main.dart
│ ├── models
│ │ └── message.dart
│ ├── pages
│ │ ├── details_page
│ │ │ ├── details_page.dart
│ │ │ └── widgets
│ │ │ │ ├── attachments.dart
│ │ │ │ ├── input.dart
│ │ │ │ └── options.dart
│ │ └── home_page
│ │ │ ├── home_page.dart
│ │ │ └── widgets
│ │ │ ├── app_bar.dart
│ │ │ ├── bottom_bar.dart
│ │ │ ├── header_app_bar.dart
│ │ │ ├── message_details.dart
│ │ │ ├── message_list.dart
│ │ │ ├── message_list_tile.dart
│ │ │ └── services_app_bar.dart
│ └── widgets
│ │ └── dot.dart
├── pubspec.lock
├── pubspec.yaml
└── test
│ └── widget_test.dart
├── nike_app
├── .gitignore
├── .metadata
├── README.md
├── android
│ ├── .gitignore
│ ├── app
│ │ ├── build.gradle
│ │ └── src
│ │ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── nike_app
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res
│ │ │ │ ├── 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
│ │ │ │ └── styles.xml
│ │ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ └── gradle-wrapper.properties
│ └── settings.gradle
├── assets
│ ├── fonts
│ │ ├── BebasNeue Bold.otf
│ │ └── BebasNeue Regular.otf
│ └── images
│ │ ├── back-jacket.png
│ │ ├── front-jacket.png
│ │ └── nike-logo.png
├── ios
│ ├── .gitignore
│ ├── Flutter
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Runner.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── Runner
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ └── README.md
│ │ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
├── lib
│ ├── main.dart
│ ├── pages
│ │ └── product_page
│ │ │ ├── product_page.dart
│ │ │ └── widgets
│ │ │ ├── add_to_cart.dart
│ │ │ ├── app_bar.dart
│ │ │ ├── card.dart
│ │ │ ├── images.dart
│ │ │ ├── info.dart
│ │ │ └── sizes.dart
│ └── utils
│ │ └── constants.dart
├── pubspec.lock
├── pubspec.yaml
├── results
│ ├── android.png
│ ├── demo.gif
│ └── ios.png
├── test
│ └── widget_test.dart
└── web
│ ├── icons
│ ├── Icon-192.png
│ └── Icon-512.png
│ ├── index.html
│ └── manifest.json
├── portfolio
├── .github
│ └── demo.gif
├── .gitignore
├── .metadata
├── README.md
├── android
│ ├── .gitignore
│ ├── app
│ │ ├── build.gradle
│ │ └── src
│ │ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── portfolio
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res
│ │ │ │ ├── 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
│ │ │ │ └── styles.xml
│ │ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ └── gradle-wrapper.properties
│ └── settings.gradle
├── assets
│ └── img
│ │ ├── art_1.jpg
│ │ ├── art_2.jpg
│ │ ├── art_3.jpg
│ │ ├── art_4.jpg
│ │ ├── art_5.png
│ │ └── logo.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
│ ├── main.dart
│ ├── src
│ │ ├── models
│ │ │ └── project.dart
│ │ ├── pages
│ │ │ └── home_page
│ │ │ │ ├── home_page.dart
│ │ │ │ └── widgets
│ │ │ │ ├── body.dart
│ │ │ │ ├── dark_mode_toggle.dart
│ │ │ │ ├── header.dart
│ │ │ │ ├── hero.dart
│ │ │ │ ├── project_card.dart
│ │ │ │ ├── projects_view.dart
│ │ │ │ └── selected_projects.dart
│ │ └── utils
│ │ │ └── constants.dart
│ └── theme_controller.dart
├── pubspec.lock
├── pubspec.yaml
├── test
│ └── widget_test.dart
└── web
│ ├── favicon.png
│ ├── icons
│ ├── Icon-192.png
│ └── Icon-512.png
│ ├── index.html
│ └── manifest.json
├── smart_home_app
├── .github
│ ├── android_1.png
│ ├── android_2.png
│ ├── demo.gif
│ ├── ios_1.png
│ └── ios_2.png
├── .gitignore
├── .metadata
├── README.md
├── android
│ ├── .gitignore
│ ├── app
│ │ ├── build.gradle
│ │ └── src
│ │ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── smart_home_app
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res
│ │ │ │ ├── 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
│ │ │ │ └── styles.xml
│ │ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ └── gradle-wrapper.properties
│ └── settings.gradle
├── ios
│ ├── .gitignore
│ ├── Flutter
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Runner.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── Runner
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ └── README.md
│ │ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
├── lib
│ ├── main.dart
│ ├── mocks
│ │ └── products.dart
│ ├── models
│ │ └── product.dart
│ ├── pages
│ │ └── home_page
│ │ │ ├── home_page.dart
│ │ │ └── widgets
│ │ │ ├── add_device.dart
│ │ │ ├── app_header.dart
│ │ │ ├── character_animation.dart
│ │ │ ├── product_card.dart
│ │ │ ├── product_indicator.dart
│ │ │ ├── product_info.dart
│ │ │ ├── product_list.dart
│ │ │ ├── product_list_tile.dart
│ │ │ └── product_page_view.dart
│ └── utils
│ │ └── constants.dart
├── pubspec.lock
├── pubspec.yaml
├── test
│ └── widget_test.dart
└── web
│ ├── icons
│ ├── Icon-192.png
│ └── Icon-512.png
│ ├── index.html
│ └── manifest.json
└── weather_calendar_app
├── .gitignore
├── .metadata
├── README.md
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── weather_calendar_app
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── 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
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
└── icons
│ ├── drop.png
│ ├── quote.png
│ ├── rain.png
│ └── wind.png
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ └── contents.xcworkspacedata
└── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ └── Runner-Bridging-Header.h
├── lib
├── main.dart
└── src
│ ├── models
│ └── weather_data.dart
│ ├── pages
│ ├── home.dart
│ └── widgets
│ │ ├── animated_value.dart
│ │ ├── conditions.dart
│ │ ├── details.dart
│ │ ├── header.dart
│ │ ├── hour_slider.dart
│ │ ├── quote.dart
│ │ ├── sidebar.dart
│ │ └── temperature.dart
│ └── utils
│ ├── constants.dart
│ ├── debouncer.dart
│ ├── format.dart
│ └── media_query.dart
├── pubspec.lock
├── pubspec.yaml
├── screenshots
├── android_1.png
├── android_2.png
├── android_3.png
├── ios_1.png
├── ios_2.png
└── ios_3.png
├── test
└── widget_test.dart
├── video.mp4
└── web
├── icons
├── Icon-192.png
└── Icon-512.png
├── index.html
└── manifest.json
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: arthurdenner
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.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 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Exceptions to above rules.
37 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
38 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Flutter UI Practice
2 |
3 | Repository to projects built with Flutter while practicing, e.g. during challenges, studying, etc.
4 |
5 | UI of the below apps are covered in this repository
6 |
7 | 1. ecommerce_perfume_app
8 |
9 | 2. email_client
10 |
11 | 3. nike_app
12 |
13 | 4. portfolio
14 |
15 | 5. smart_home_app
16 |
17 | 6. weather_calendar_app
18 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/.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: fabeb2a16f1d008ab8230f450c49141d35669798
8 | channel: beta
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/README.md:
--------------------------------------------------------------------------------
1 | # flutterando_perfume_ecommerce_challenge
2 |
3 | Challenge from [Flutterando](https://github.com/Flutterando).
4 |
5 | ## Mockup
6 |
7 | [Link on Dribble](https://dribbble.com/shots/8226522-Perfume-e-commerce-Mobile-App/attachments/596233?mode=media).
8 |
9 | ## Screenshots
10 |
11 | ### Android
12 |
13 | - [Home Page](./screenshots/android_1.png)
14 | - [Product Page](./screenshots/android_2.png)
15 |
16 | ### iOS
17 |
18 | - [Home Page](./screenshots/ios_1.png)
19 | - [Product Page](./screenshots/ios_2.png)
20 |
21 | ## Getting Started
22 |
23 | A few resources to get you started if this is your first Flutter project:
24 |
25 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
26 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
27 |
28 | For help getting started with Flutter, view our
29 | [online documentation](https://flutter.dev/docs), which offers tutorials,
30 | samples, guidance on mobile development, and a full API reference.
31 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/main/kotlin/com/example/flutterando_perfume_ecommerce_challenge/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.flutterando_perfume_ecommerce_challenge
2 |
3 | import androidx.annotation.NonNull;
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugins.GeneratedPluginRegistrant
7 |
8 | class MainActivity: FlutterActivity() {
9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
10 | GeneratedPluginRegistrant.registerWith(flutterEngine);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/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-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/assets/fonts/truenobd.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/assets/fonts/truenobd.otf
--------------------------------------------------------------------------------
/ecommerce_perfume_app/assets/fonts/truenorg.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/assets/fonts/truenorg.otf
--------------------------------------------------------------------------------
/ecommerce_perfume_app/assets/images/coco-noir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/assets/images/coco-noir.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
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 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/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 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/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 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/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.
--------------------------------------------------------------------------------
/ecommerce_perfume_app/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutterando_perfume_ecommerce_challenge/pages/home/home_page.dart';
3 |
4 | void main() => runApp(MyApp());
5 |
6 | class MyApp extends StatelessWidget {
7 | @override
8 | Widget build(BuildContext context) {
9 | return MaterialApp(
10 | debugShowCheckedModeBanner: false,
11 | title: 'Flutter Demo',
12 | theme: ThemeData(
13 | fontFamily: 'Trueno',
14 | scaffoldBackgroundColor: Colors.white,
15 | ),
16 | home: HomePage(),
17 | );
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/models/product.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/foundation.dart';
2 |
3 | class Product {
4 | const Product({
5 | @required this.brand,
6 | @required this.image,
7 | @required this.description,
8 | @required this.price,
9 | }) : assert(brand != null),
10 | assert(image != null),
11 | assert(description != null),
12 | assert(price != null);
13 |
14 | final String brand;
15 | final String description;
16 | final String image;
17 | final String price;
18 | }
19 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/pages/home/widgets/best_deals.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class BestDeals extends StatelessWidget {
4 | const BestDeals({Key key}) : super(key: key);
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return Container(
9 | padding: EdgeInsets.symmetric(horizontal: 30),
10 | child: Column(
11 | children: [
12 | Row(
13 | crossAxisAlignment: CrossAxisAlignment.center,
14 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
15 | children: [
16 | Text(
17 | 'Best deals',
18 | style: TextStyle(
19 | fontWeight: FontWeight.bold,
20 | fontSize: 28,
21 | ),
22 | ),
23 | Row(
24 | crossAxisAlignment: CrossAxisAlignment.center,
25 | children: [
26 | Text(
27 | 'All'.toUpperCase(),
28 | style: TextStyle(
29 | color: Colors.black26,
30 | fontSize: 16,
31 | ),
32 | ),
33 | Icon(
34 | Icons.chevron_right,
35 | color: Colors.black26,
36 | size: 28,
37 | ),
38 | ],
39 | ),
40 | ],
41 | )
42 | ],
43 | ),
44 | );
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/pages/home/widgets/dot.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class Dot extends StatelessWidget {
4 | const Dot({
5 | Key key,
6 | this.color: const Color(0xFF59a463),
7 | this.size: 6,
8 | }) : super(key: key);
9 |
10 | final Color color;
11 | final double size;
12 |
13 | @override
14 | Widget build(BuildContext context) {
15 | return Container(
16 | decoration: BoxDecoration(
17 | color: color,
18 | borderRadius: BorderRadius.circular(size),
19 | ),
20 | width: size,
21 | height: size,
22 | );
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/pages/home/widgets/topbar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutterando_perfume_ecommerce_challenge/pages/home/widgets/dot.dart';
3 |
4 | class Topbar extends StatelessWidget {
5 | const Topbar({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Padding(
10 | padding: EdgeInsets.symmetric(horizontal: 30),
11 | child: Row(
12 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
13 | children: [
14 | Icon(
15 | Icons.short_text,
16 | size: 40,
17 | ),
18 | _buildShoppingIcon(),
19 | ],
20 | ),
21 | );
22 | }
23 |
24 | Widget _buildShoppingIcon() {
25 | return Stack(
26 | children: [
27 | Padding(
28 | padding: EdgeInsets.symmetric(horizontal: 8),
29 | child: Icon(
30 | Icons.shopping_basket,
31 | size: 30,
32 | ),
33 | ),
34 | Positioned(
35 | top: 0,
36 | right: 0,
37 | child: Dot(),
38 | ),
39 | ],
40 | );
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/pages/product/widgets/add_to_cart.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AddToCart extends StatelessWidget {
4 | const AddToCart({Key key}) : super(key: key);
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return Positioned(
9 | bottom: 0,
10 | child: Container(
11 | width: MediaQuery.of(context).size.width,
12 | height: 80,
13 | decoration: BoxDecoration(
14 | color: Colors.black,
15 | borderRadius: BorderRadius.only(
16 | topLeft: Radius.circular(32),
17 | topRight: Radius.circular(32),
18 | ),
19 | ),
20 | child: FlatButton(
21 | child: Row(
22 | mainAxisAlignment: MainAxisAlignment.center,
23 | children: [
24 | Padding(
25 | padding: EdgeInsets.only(right: 16),
26 | child: Text(
27 | 'Add to cart',
28 | style: TextStyle(
29 | color: Colors.white,
30 | fontSize: 18,
31 | ),
32 | ),
33 | ),
34 | Icon(
35 | Icons.shopping_basket,
36 | color: Colors.white,
37 | size: 30,
38 | ),
39 | ],
40 | ),
41 | onPressed: () {},
42 | ),
43 | ),
44 | );
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/pages/product/widgets/indicators.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutterando_perfume_ecommerce_challenge/pages/home/widgets/dot.dart';
3 |
4 | class DotsIndicator extends StatelessWidget {
5 | const DotsIndicator({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Row(
10 | mainAxisAlignment: MainAxisAlignment.center,
11 | children: [
12 | Padding(
13 | padding: const EdgeInsets.symmetric(horizontal: 8),
14 | child: Container(
15 | decoration: BoxDecoration(
16 | color: Colors.white,
17 | borderRadius: BorderRadius.circular(32),
18 | ),
19 | width: 20,
20 | height: 6,
21 | ),
22 | ),
23 | Padding(
24 | padding: const EdgeInsets.symmetric(horizontal: 8),
25 | child: Dot(
26 | color: Color(0xFFaddcb6),
27 | ),
28 | ),
29 | Padding(
30 | padding: const EdgeInsets.symmetric(horizontal: 8),
31 | child: Dot(
32 | color: Color(0xFFaddcb6),
33 | ),
34 | ),
35 | Padding(
36 | padding: const EdgeInsets.symmetric(horizontal: 8),
37 | child: Dot(
38 | color: Color(0xFFaddcb6),
39 | ),
40 | ),
41 | ],
42 | );
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/pages/product/widgets/topbar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class ProductTopbar extends StatelessWidget {
4 | const ProductTopbar({Key key}) : super(key: key);
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | return Padding(
9 | padding: EdgeInsets.symmetric(horizontal: 30),
10 | child: Row(
11 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
12 | children: [
13 | GestureDetector(
14 | onTap: () => Navigator.of(context).pop(),
15 | child: Icon(
16 | Icons.chevron_left,
17 | size: 40,
18 | ),
19 | ),
20 | Icon(
21 | Icons.favorite_border,
22 | size: 30,
23 | ),
24 | ],
25 | ),
26 | );
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/lib/utils/constants.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AppColors {
4 | static const Color green = Color(0xFF58a05e);
5 | }
6 |
--------------------------------------------------------------------------------
/ecommerce_perfume_app/screenshots/android_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/screenshots/android_1.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/screenshots/android_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/screenshots/android_2.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/screenshots/ios_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/screenshots/ios_1.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/screenshots/ios_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/ecommerce_perfume_app/screenshots/ios_2.png
--------------------------------------------------------------------------------
/ecommerce_perfume_app/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:flutterando_perfume_ecommerce_challenge/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(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 |
--------------------------------------------------------------------------------
/email_client/.github/android_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/.github/android_1.png
--------------------------------------------------------------------------------
/email_client/.github/android_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/.github/android_2.png
--------------------------------------------------------------------------------
/email_client/.github/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/.github/demo.gif
--------------------------------------------------------------------------------
/email_client/.github/ios_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/.github/ios_1.png
--------------------------------------------------------------------------------
/email_client/.github/ios_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/.github/ios_2.png
--------------------------------------------------------------------------------
/email_client/.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 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Symbolication related
37 | app.*.symbols
38 |
39 | # Obfuscation related
40 | app.*.map.json
41 |
42 | # Exceptions to above rules.
43 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
44 |
--------------------------------------------------------------------------------
/email_client/.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: e6b34c2b5c96bb95325269a29a84e83ed8909b5f
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/email_client/README.md:
--------------------------------------------------------------------------------
1 | # email_client
2 |
3 | Challenge from [Flutterando](https://github.com/Flutterando).
4 |
5 | ## Mockup
6 |
7 | [Link on Dribble](https://dribbble.com/shots/11012468-Nike-Store).
8 |
9 | ## Screenshots
10 |
11 | ### Android
12 |
13 | - [Demo](.github/demo.gif)
14 | - [Home Page - Inbox](.github/android_1.png)
15 | - [Home Page - Details](.github/android_2.png)
16 |
17 | ### iOS
18 |
19 | - [Home Page - Inbox](.github/ios_1.png)
20 | - [Home Page - Details](.github/ios_2.png)
21 |
22 | ## Getting Started
23 |
24 | A few resources to get you started if this is your first Flutter project:
25 |
26 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
27 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
28 |
29 | For help getting started with Flutter, view our
30 | [online documentation](https://flutter.dev/docs), which offers tutorials,
31 | samples, guidance on mobile development, and a full API reference.
32 |
--------------------------------------------------------------------------------
/email_client/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/email_client/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/email_client/android/app/src/main/kotlin/com/example/email_client/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.email_client
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/email_client/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/email_client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/email_client/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/email_client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/email_client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/email_client/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/email_client/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/email_client/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/email_client/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/email_client/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/email_client/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-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/email_client/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/email_client/assets/images/gmail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/assets/images/gmail.png
--------------------------------------------------------------------------------
/email_client/assets/images/outlook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/assets/images/outlook.png
--------------------------------------------------------------------------------
/email_client/assets/images/pdf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/assets/images/pdf.png
--------------------------------------------------------------------------------
/email_client/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/email_client/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
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 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/email_client/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/email_client/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/email_client/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/email_client/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/email_client/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/email_client/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/email_client/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/email_client/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/email_client/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 |
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/email_client/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 |
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/email_client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/email_client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/email_client/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.
--------------------------------------------------------------------------------
/email_client/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/email_client/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter/services.dart';
3 |
4 | import 'constants.dart';
5 | import 'pages/home_page/home_page.dart';
6 |
7 | void main() {
8 | runApp(MyApp());
9 | }
10 |
11 | class MyApp extends StatelessWidget {
12 | @override
13 | Widget build(BuildContext context) {
14 | return AnnotatedRegion(
15 | value: SystemUiOverlayStyle(
16 | statusBarColor: Colors.transparent,
17 | ),
18 | child: MaterialApp(
19 | themeMode: ThemeMode.dark,
20 | darkTheme: ThemeData(
21 | scaffoldBackgroundColor: AppColors.darkBlue,
22 | textTheme: TextTheme(
23 | headline5: TextStyle(
24 | color: AppColors.white,
25 | fontWeight: FontWeight.bold,
26 | ),
27 | ),
28 | ),
29 | title: 'Email Client',
30 | home: HomePage(),
31 | debugShowCheckedModeBanner: false,
32 | theme: ThemeData(
33 | primarySwatch: Colors.blue,
34 | visualDensity: VisualDensity.adaptivePlatformDensity,
35 | ),
36 | ),
37 | );
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/email_client/lib/models/message.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/foundation.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | class Message {
5 | const Message({
6 | @required this.userName,
7 | @required this.userPhoto,
8 | @required this.subject,
9 | @required this.message,
10 | @required this.timestamp,
11 | this.attachments = const [],
12 | this.color,
13 | });
14 |
15 | final String userName;
16 | final String userPhoto;
17 | final String subject;
18 | final String message;
19 | final String timestamp;
20 | final Color color;
21 | final List attachments;
22 |
23 | @override
24 | String toString() {
25 | return '{userName: $userName, subject: $subject}';
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/email_client/lib/pages/home_page/home_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_icons/flutter_icons.dart';
3 |
4 | import '../../constants.dart';
5 | import '../../models/message.dart';
6 | import '../details_page/details_page.dart';
7 | import 'widgets/app_bar.dart';
8 | import 'widgets/bottom_bar.dart';
9 | import 'widgets/message_list.dart';
10 |
11 | class HomePage extends StatelessWidget {
12 | const HomePage({Key key}) : super(key: key);
13 |
14 | @override
15 | Widget build(BuildContext context) {
16 | return Scaffold(
17 | body: Column(
18 | children: [
19 | InboxAppBar(),
20 | MessageList(
21 | onSelectMessage: (message) =>
22 | _handleSelectMessage(context, message),
23 | ),
24 | ],
25 | ),
26 | bottomNavigationBar: BottomBar(),
27 | floatingActionButton: FloatingActionButton(
28 | onPressed: () {},
29 | backgroundColor: AppColors.white,
30 | child: Icon(
31 | Feather.edit,
32 | color: AppColors.black,
33 | ),
34 | ),
35 | );
36 | }
37 |
38 | void _handleSelectMessage(BuildContext context, Message message) {
39 | showModalBottomSheet(
40 | context: context,
41 | backgroundColor: Colors.transparent,
42 | barrierColor: AppColors.darkBlue,
43 | isScrollControlled: true,
44 | builder: (_) => DetailsPage(
45 | message: message,
46 | ),
47 | );
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/email_client/lib/pages/home_page/widgets/app_bar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import '../../../constants.dart';
4 | import 'header_app_bar.dart';
5 |
6 | class InboxAppBar extends StatelessWidget {
7 | const InboxAppBar({Key key}) : super(key: key);
8 |
9 | @override
10 | Widget build(BuildContext context) {
11 | return Container(
12 | height: MediaQuery.of(context).size.height / 4,
13 | decoration: BoxDecoration(
14 | color: AppColors.blue,
15 | borderRadius: BorderRadius.only(
16 | bottomLeft: Radius.circular(50),
17 | ),
18 | ),
19 | child: Padding(
20 | padding: const EdgeInsets.symmetric(
21 | horizontal: 40,
22 | vertical: 20,
23 | ),
24 | child: HeaderAppBar(),
25 | ),
26 | );
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/email_client/lib/pages/home_page/widgets/bottom_bar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_icons/flutter_icons.dart';
3 |
4 | import '../../../constants.dart';
5 |
6 | class BottomBar extends StatelessWidget {
7 | const BottomBar({Key key}) : super(key: key);
8 |
9 | @override
10 | Widget build(BuildContext context) {
11 | final _height = MediaQuery.of(context).size.height * 0.15;
12 |
13 | return Container(
14 | height: _height,
15 | padding: EdgeInsets.symmetric(horizontal: 50),
16 | decoration: BoxDecoration(
17 | color: AppColors.blue,
18 | borderRadius: BorderRadius.only(
19 | topRight: Radius.circular(60),
20 | ),
21 | ),
22 | child: SafeArea(
23 | child: Row(
24 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
25 | children: [
26 | _buildIcon(icon: FontAwesome.star),
27 | _buildIcon(
28 | icon: FontAwesome.users,
29 | selected: true,
30 | ),
31 | _buildIcon(icon: FontAwesome.inbox),
32 | ],
33 | ),
34 | ),
35 | );
36 | }
37 |
38 | Widget _buildIcon({IconData icon, bool selected = false}) {
39 | return Icon(
40 | icon,
41 | color: selected ? AppColors.white : AppColors.lightBlue,
42 | size: 30,
43 | );
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/email_client/lib/pages/home_page/widgets/header_app_bar.dart:
--------------------------------------------------------------------------------
1 | import 'package:email_client/pages/home_page/widgets/services_app_bar.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter_icons/flutter_icons.dart';
4 |
5 | import '../../../constants.dart';
6 |
7 | class HeaderAppBar extends StatelessWidget {
8 | const HeaderAppBar({Key key}) : super(key: key);
9 |
10 | @override
11 | Widget build(BuildContext context) {
12 | return Column(
13 | mainAxisAlignment: MainAxisAlignment.end,
14 | crossAxisAlignment: CrossAxisAlignment.start,
15 | children: [
16 | Row(
17 | children: [
18 | Expanded(
19 | child: Text(
20 | 'Inbox',
21 | style: TextStyle(
22 | color: AppColors.white,
23 | fontSize: 40,
24 | fontWeight: FontWeight.bold,
25 | ),
26 | ),
27 | ),
28 | Icon(
29 | Feather.search,
30 | color: AppColors.lightBlue,
31 | size: 35,
32 | ),
33 | ],
34 | ),
35 | SizedBox(height: 20),
36 | ServicesAppBar()
37 | ],
38 | );
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/email_client/lib/pages/home_page/widgets/message_list.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import '../../../constants.dart';
4 | import '../../../models/message.dart';
5 | import 'message_list_tile.dart';
6 |
7 | class MessageList extends StatelessWidget {
8 | const MessageList({
9 | Key key,
10 | this.onSelectMessage,
11 | }) : super(key: key);
12 |
13 | final void Function(Message message) onSelectMessage;
14 |
15 | @override
16 | Widget build(BuildContext context) {
17 | return Expanded(
18 | child: ListView.builder(
19 | padding: EdgeInsets.symmetric(vertical: 10),
20 | itemCount: messages.length,
21 | physics: BouncingScrollPhysics(),
22 | itemBuilder: (BuildContext context, int index) {
23 | return MessageListTile(
24 | message: messages[index],
25 | onTap: () => onSelectMessage(messages[index]),
26 | );
27 | },
28 | ),
29 | );
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/email_client/lib/pages/home_page/widgets/message_list_tile.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import '../../../constants.dart';
4 | import '../../../models/message.dart';
5 | import 'message_details.dart';
6 |
7 | class MessageListTile extends StatelessWidget {
8 | const MessageListTile({
9 | Key key,
10 | @required this.message,
11 | this.onTap,
12 | }) : super(key: key);
13 |
14 | final Message message;
15 | final VoidCallback onTap;
16 |
17 | @override
18 | Widget build(BuildContext context) {
19 | return GestureDetector(
20 | onTap: onTap,
21 | behavior: HitTestBehavior.opaque,
22 | child: Padding(
23 | padding: const EdgeInsets.fromLTRB(16, 16, 16, 24),
24 | child: Column(
25 | crossAxisAlignment: CrossAxisAlignment.start,
26 | children: [
27 | MessageDetails(
28 | message: message,
29 | ),
30 | SizedBox(height: 12),
31 | Padding(
32 | padding: const EdgeInsets.only(left: 95),
33 | child: Text(
34 | message.message.replaceAll(RegExp('\n\n'), ' '),
35 | maxLines: 1,
36 | style: AppTextStyles.timestamp,
37 | overflow: TextOverflow.ellipsis,
38 | ),
39 | ),
40 | ],
41 | ),
42 | ),
43 | );
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/email_client/lib/widgets/dot.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class Dot extends StatelessWidget {
4 | const Dot({
5 | Key key,
6 | this.color,
7 | }) : super(key: key);
8 |
9 | final Color color;
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | return Container(
14 | width: 10,
15 | height: 10,
16 | decoration: BoxDecoration(
17 | color: color,
18 | shape: BoxShape.circle,
19 | ),
20 | );
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/email_client/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:email_client/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(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 |
--------------------------------------------------------------------------------
/nike_app/.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 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Exceptions to above rules.
37 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
38 |
--------------------------------------------------------------------------------
/nike_app/.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: fabeb2a16f1d008ab8230f450c49141d35669798
8 | channel: beta
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/nike_app/README.md:
--------------------------------------------------------------------------------
1 | # nike_app
2 |
3 | Challenge from [Flutterando](https://github.com/Flutterando).
4 |
5 | ## Mockup
6 |
7 | [Link on Dribble](https://dribbble.com/shots/11012468-Nike-Store).
8 |
9 | ## Screenshots
10 |
11 | ### Android
12 |
13 | - [Demo](./results/demo.gif)
14 | - [Product Page](./results/android.png)
15 |
16 | ### iOS
17 |
18 | - [Product Page](./results/ios.png)
19 |
20 | ## Helpful links
21 |
22 | https://alligator.io/flutter/flutter-gradient/
23 | https://medium.com/fluttervn/how-to-make-blur-effect-in-flutter-using-backdropfilter-imagefilter-559ffd8ab73
24 |
25 | ## Getting Started
26 |
27 | A few resources to get you started if this is your first Flutter project:
28 |
29 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
30 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
31 |
32 | For help getting started with Flutter, view our
33 | [online documentation](https://flutter.dev/docs), which offers tutorials,
34 | samples, guidance on mobile development, and a full API reference.
35 |
--------------------------------------------------------------------------------
/nike_app/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/nike_app/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/nike_app/android/app/src/main/kotlin/com/example/nike_app/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.nike_app
2 |
3 | import androidx.annotation.NonNull;
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugins.GeneratedPluginRegistrant
7 |
8 | class MainActivity: FlutterActivity() {
9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
10 | GeneratedPluginRegistrant.registerWith(flutterEngine);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/nike_app/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/nike_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/nike_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/nike_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/nike_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/nike_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/nike_app/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/nike_app/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/nike_app/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/nike_app/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/nike_app/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-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/nike_app/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/nike_app/assets/fonts/BebasNeue Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/assets/fonts/BebasNeue Bold.otf
--------------------------------------------------------------------------------
/nike_app/assets/fonts/BebasNeue Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/assets/fonts/BebasNeue Regular.otf
--------------------------------------------------------------------------------
/nike_app/assets/images/back-jacket.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/assets/images/back-jacket.png
--------------------------------------------------------------------------------
/nike_app/assets/images/front-jacket.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/assets/images/front-jacket.png
--------------------------------------------------------------------------------
/nike_app/assets/images/nike-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/assets/images/nike-logo.png
--------------------------------------------------------------------------------
/nike_app/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/nike_app/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
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 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/nike_app/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/nike_app/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/nike_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/nike_app/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/nike_app/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 |
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/nike_app/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 |
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/nike_app/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.
--------------------------------------------------------------------------------
/nike_app/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/nike_app/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:nike_app/pages/product_page/product_page.dart';
3 |
4 | void main() => runApp(MyApp());
5 |
6 | class MyApp extends StatelessWidget {
7 | @override
8 | Widget build(BuildContext context) {
9 | return MaterialApp(
10 | debugShowCheckedModeBanner: false,
11 | title: 'Nike Store',
12 | theme: ThemeData(
13 | fontFamily: 'BebasNeue',
14 | ),
15 | home: ProductPage(),
16 | );
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/nike_app/lib/pages/product_page/product_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:nike_app/pages/product_page/widgets/add_to_cart.dart';
3 | import 'package:nike_app/pages/product_page/widgets/app_bar.dart';
4 | import 'package:nike_app/pages/product_page/widgets/card.dart';
5 | import 'package:nike_app/pages/product_page/widgets/images.dart';
6 | import 'package:nike_app/utils/constants.dart';
7 |
8 | class ProductPage extends StatefulWidget {
9 | ProductPage({Key key}) : super(key: key);
10 |
11 | @override
12 | _ProductPageState createState() => _ProductPageState();
13 | }
14 |
15 | class _ProductPageState extends State {
16 | @override
17 | Widget build(BuildContext context) {
18 | return Scaffold(
19 | backgroundColor: AppColors.main,
20 | body: SafeArea(
21 | child: Column(
22 | children: [
23 | NikeAppBar(),
24 | Expanded(
25 | child: Stack(
26 | children: [
27 | ProductImages(),
28 | ProductCart(),
29 | AddToCartButton(),
30 | ],
31 | ),
32 | ),
33 | ],
34 | ),
35 | ),
36 | );
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/nike_app/lib/pages/product_page/widgets/app_bar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:nike_app/utils/constants.dart';
3 |
4 | class NikeAppBar extends StatelessWidget {
5 | const NikeAppBar({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Container(
10 | height: 75,
11 | padding: EdgeInsets.symmetric(
12 | horizontal: 25,
13 | vertical: 16,
14 | ),
15 | decoration: BoxDecoration(
16 | color: AppColors.white,
17 | borderRadius: BorderRadius.circular(20),
18 | ),
19 | child: Row(
20 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
21 | children: [
22 | Icon(Icons.short_text, size: 40),
23 | Image.asset(
24 | 'assets/images/nike-logo.png',
25 | height: 25,
26 | ),
27 | Container(
28 | decoration: BoxDecoration(
29 | color: AppColors.main,
30 | borderRadius: BorderRadius.circular(100),
31 | ),
32 | height: 75,
33 | width: 40,
34 | ),
35 | ],
36 | ),
37 | );
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/nike_app/lib/pages/product_page/widgets/info.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:nike_app/utils/constants.dart';
3 |
4 | class ProductInfo extends StatelessWidget {
5 | const ProductInfo({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Container(
10 | padding: EdgeInsets.only(bottom: 60),
11 | child: Column(
12 | children: [
13 | Text(
14 | "Men's Running Jacket".toUpperCase(),
15 | style: TextStyle(
16 | color: AppColors.darkGrey,
17 | fontWeight: FontWeight.bold,
18 | ),
19 | ),
20 | SizedBox(height: 10),
21 | Container(
22 | width: 200,
23 | child: Text(
24 | "Nike Windrunner Wild Run".toUpperCase(),
25 | textAlign: TextAlign.center,
26 | style: TextStyle(
27 | color: AppColors.black,
28 | fontWeight: FontWeight.bold,
29 | fontSize: 30,
30 | height: 1.1,
31 | ),
32 | ),
33 | ),
34 | SizedBox(height: 10),
35 | Text(
36 | "\$120",
37 | style: TextStyle(
38 | color: AppColors.black,
39 | fontWeight: FontWeight.bold,
40 | fontSize: 24,
41 | ),
42 | ),
43 | ],
44 | ),
45 | );
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/nike_app/lib/utils/constants.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AppColors {
4 | static const main = Color(0xFFDCEFF8);
5 | static const black = Colors.black;
6 | static const white = Colors.white;
7 | static const grey = Color(0xFFC7C7C7);
8 | static const darkGrey = Color(0xFF868686);
9 | }
10 |
11 | class AppDurations {
12 | static const short = Duration(milliseconds: 300);
13 | }
14 |
--------------------------------------------------------------------------------
/nike_app/results/android.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/results/android.png
--------------------------------------------------------------------------------
/nike_app/results/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/results/demo.gif
--------------------------------------------------------------------------------
/nike_app/results/ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/results/ios.png
--------------------------------------------------------------------------------
/nike_app/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:nike_app/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(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 |
--------------------------------------------------------------------------------
/nike_app/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/nike_app/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/nike_app/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/nike_app/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | nike_app
15 |
16 |
17 |
18 |
21 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/nike_app/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nike_app",
3 | "short_name": "nike_app",
4 | "start_url": ".",
5 | "display": "minimal-ui",
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 | }
24 |
--------------------------------------------------------------------------------
/portfolio/.github/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/.github/demo.gif
--------------------------------------------------------------------------------
/portfolio/.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 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Symbolication related
37 | app.*.symbols
38 |
39 | # Obfuscation related
40 | app.*.map.json
41 |
42 | # Exceptions to above rules.
43 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
44 |
--------------------------------------------------------------------------------
/portfolio/.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: 2a7bc389f28d83c581f7ddd4601588a22e12512e
8 | channel: beta
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/portfolio/README.md:
--------------------------------------------------------------------------------
1 | # portfolio
2 |
3 | Challenge from [Flutterando](https://github.com/Flutterando).
4 |
5 | ## Mockup
6 |
7 | [Link on Dribble](https://dribbble.com/shots/5694008-Photography-Portfolio-Concept-Dark-Mode).
8 |
9 | ## Screenshots
10 |
11 | ### Web
12 |
13 | - [Demo](.github/demo.gif)
14 |
15 | ## Getting Started
16 |
17 | A few resources to get you started if this is your first Flutter project:
18 |
19 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
20 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
21 | - [Building a web application with Flutter](https://flutter.dev/docs/get-started/web)
22 |
23 | For help getting started with Flutter, view our
24 | [online documentation](https://flutter.dev/docs), which offers tutorials,
25 | samples, guidance on mobile development, and a full API reference.
26 |
--------------------------------------------------------------------------------
/portfolio/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/portfolio/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/portfolio/android/app/src/main/kotlin/com/example/portfolio/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.portfolio
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/portfolio/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/portfolio/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/portfolio/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/portfolio/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/portfolio/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/portfolio/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/portfolio/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/portfolio/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/portfolio/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/portfolio/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/portfolio/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-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/portfolio/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/portfolio/assets/img/art_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/assets/img/art_1.jpg
--------------------------------------------------------------------------------
/portfolio/assets/img/art_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/assets/img/art_2.jpg
--------------------------------------------------------------------------------
/portfolio/assets/img/art_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/assets/img/art_3.jpg
--------------------------------------------------------------------------------
/portfolio/assets/img/art_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/assets/img/art_4.jpg
--------------------------------------------------------------------------------
/portfolio/assets/img/art_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/assets/img/art_5.png
--------------------------------------------------------------------------------
/portfolio/assets/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/assets/img/logo.png
--------------------------------------------------------------------------------
/portfolio/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/portfolio/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
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 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/portfolio/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/portfolio/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/portfolio/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/portfolio/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/portfolio/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/portfolio/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/portfolio/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/portfolio/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/portfolio/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 |
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/portfolio/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 |
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/portfolio/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.
--------------------------------------------------------------------------------
/portfolio/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/portfolio/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:portfolio/src/pages/home_page/home_page.dart';
3 | import 'package:provider/provider.dart';
4 |
5 | import 'theme_controller.dart';
6 |
7 | void main() {
8 | runApp(
9 | ChangeNotifierProvider(
10 | create: (_) => ThemeController(),
11 | child: MyApp(),
12 | ),
13 | );
14 | }
15 |
16 | class MyApp extends StatelessWidget {
17 | @override
18 | Widget build(BuildContext context) {
19 | final _useDarkMode = Provider.of(context).isDarkTheme;
20 |
21 | return MaterialApp(
22 | title: 'Portfolio',
23 | debugShowCheckedModeBanner: false,
24 | theme: _useDarkMode ? ThemeData.dark() : ThemeData.light(),
25 | home: HomePage(),
26 | );
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/portfolio/lib/src/models/project.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/foundation.dart';
2 |
3 | class Project {
4 | final String image;
5 | final String title;
6 | final String location;
7 | final int numPhotos;
8 |
9 | const Project({
10 | @required this.image,
11 | @required this.title,
12 | @required this.location,
13 | @required this.numPhotos,
14 | });
15 | }
16 |
--------------------------------------------------------------------------------
/portfolio/lib/src/pages/home_page/home_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:portfolio/src/pages/home_page/widgets/header.dart';
3 | import 'package:portfolio/src/pages/home_page/widgets/body.dart';
4 |
5 | class HomePage extends StatelessWidget {
6 | const HomePage({Key key}) : super(key: key);
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return SafeArea(
11 | child: Scaffold(
12 | body: Column(
13 | children: [
14 | PortfolioHeader(),
15 | Divider(height: 0),
16 | PortfolioBody(),
17 | ],
18 | ),
19 | ),
20 | );
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/portfolio/lib/src/pages/home_page/widgets/dark_mode_toggle.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 |
4 | import '../../../../theme_controller.dart';
5 |
6 | class DarkModeToggle extends StatelessWidget {
7 | const DarkModeToggle({
8 | Key key,
9 | }) : super(key: key);
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | final _provider = Provider.of(context);
14 |
15 | return Row(
16 | children: [
17 | GestureDetector(
18 | onTap: _provider.toggleDarkTheme,
19 | child: Container(
20 | decoration: BoxDecoration(
21 | color: _provider.isDarkTheme ? Colors.grey[800] : Colors.black,
22 | shape: BoxShape.circle,
23 | ),
24 | padding: EdgeInsets.all(6),
25 | child: Icon(
26 | _provider.isDarkTheme ? Icons.wb_sunny : Icons.brightness_2,
27 | color: Color(0xFFf23a6a),
28 | size: 16,
29 | ),
30 | ),
31 | ),
32 | SizedBox(width: 10),
33 | Text(
34 | _provider.isDarkTheme ? 'Enable light mode' : 'Enable dark mode',
35 | style: TextStyle(
36 | color: Color(0xFFf23a6a),
37 | fontWeight: FontWeight.bold,
38 | ),
39 | ),
40 | ],
41 | );
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/portfolio/lib/src/pages/home_page/widgets/header.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class PortfolioHeader extends StatelessWidget {
4 | const PortfolioHeader({Key key}) : super(key: key);
5 |
6 | @override
7 | Widget build(BuildContext context) {
8 | final _height = MediaQuery.of(context).size.height;
9 | final _width = MediaQuery.of(context).size.width;
10 |
11 | return Container(
12 | width: _width * .8,
13 | height: _height * .08,
14 | padding: const EdgeInsets.symmetric(vertical: 10),
15 | child: Row(
16 | children: [
17 | Expanded(
18 | child: Text(
19 | 'John Decon',
20 | style: TextStyle(
21 | fontWeight: FontWeight.bold,
22 | ),
23 | ),
24 | ),
25 | Row(
26 | children: [
27 | _buildMenuOption('Work'),
28 | _buildMenuOption('About'),
29 | _buildMenuOption('Products'),
30 | _buildMenuOption('Contact'),
31 | ],
32 | ),
33 | ],
34 | ),
35 | );
36 | }
37 |
38 | Widget _buildMenuOption(String label) {
39 | return Padding(
40 | padding: const EdgeInsets.symmetric(horizontal: 30),
41 | child: Text(label),
42 | );
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/portfolio/lib/src/pages/home_page/widgets/selected_projects.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:portfolio/src/pages/home_page/widgets/dark_mode_toggle.dart';
3 |
4 | class SelectedProjects extends StatelessWidget {
5 | const SelectedProjects({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Column(
10 | crossAxisAlignment: CrossAxisAlignment.start,
11 | children: [
12 | Text(
13 | 'Selected Projects',
14 | style: TextStyle(
15 | fontSize: 26,
16 | fontWeight: FontWeight.bold,
17 | ),
18 | ),
19 | Text(
20 | 'Hover over the cards to learn more about projects',
21 | style: TextStyle(
22 | color: Colors.grey[600],
23 | ),
24 | ),
25 | SizedBox(height: 10),
26 | DarkModeToggle(),
27 | ],
28 | );
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/portfolio/lib/src/utils/constants.dart:
--------------------------------------------------------------------------------
1 | import 'package:portfolio/src/models/project.dart';
2 |
3 | const projects = [
4 | Project(
5 | image: 'assets/img/art_1.jpg',
6 | title: 'Under the sea world',
7 | location: 'Los Angeles',
8 | numPhotos: 14,
9 | ),
10 | Project(
11 | image: 'assets/img/art_2.jpg',
12 | title: 'Inspiration flow',
13 | location: 'Las Vegas',
14 | numPhotos: 8,
15 | ),
16 | Project(
17 | image: 'assets/img/art_3.jpg',
18 | title: 'Under the sea world',
19 | location: 'Los Angeles',
20 | numPhotos: 14,
21 | ),
22 | Project(
23 | image: 'assets/img/art_4.jpg',
24 | title: 'Inspiration flow',
25 | location: 'Las Vegas',
26 | numPhotos: 8,
27 | ),
28 | Project(
29 | image: 'assets/img/art_5.png',
30 | title: 'Under the sea world',
31 | location: 'Los Angeles',
32 | numPhotos: 14,
33 | ),
34 | ];
35 |
36 | class AppDurations {
37 | static const short = Duration(milliseconds: 500);
38 | static const long = Duration(milliseconds: 2000);
39 | static const veryLong = Duration(milliseconds: 3000);
40 | }
41 |
--------------------------------------------------------------------------------
/portfolio/lib/theme_controller.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class ThemeController extends ChangeNotifier {
4 | bool isDarkTheme = false;
5 |
6 | void toggleDarkTheme() {
7 | isDarkTheme = !isDarkTheme;
8 |
9 | notifyListeners();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/portfolio/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:portfolio/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(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 |
--------------------------------------------------------------------------------
/portfolio/web/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/web/favicon.png
--------------------------------------------------------------------------------
/portfolio/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/portfolio/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/portfolio/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/portfolio/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | portfolio
18 |
19 |
20 |
21 |
24 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/portfolio/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "portfolio",
3 | "short_name": "portfolio",
4 | "start_url": ".",
5 | "display": "minimal-ui",
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 | }
24 |
--------------------------------------------------------------------------------
/smart_home_app/.github/android_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/.github/android_1.png
--------------------------------------------------------------------------------
/smart_home_app/.github/android_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/.github/android_2.png
--------------------------------------------------------------------------------
/smart_home_app/.github/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/.github/demo.gif
--------------------------------------------------------------------------------
/smart_home_app/.github/ios_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/.github/ios_1.png
--------------------------------------------------------------------------------
/smart_home_app/.github/ios_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/.github/ios_2.png
--------------------------------------------------------------------------------
/smart_home_app/.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 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Exceptions to above rules.
37 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
38 |
--------------------------------------------------------------------------------
/smart_home_app/.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: fabeb2a16f1d008ab8230f450c49141d35669798
8 | channel: beta
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/smart_home_app/README.md:
--------------------------------------------------------------------------------
1 | # smart_home_app
2 |
3 | Challenge from [Flutterando](https://github.com/Flutterando).
4 |
5 | ## Mockup
6 |
7 | [Link on Dribble](https://dribbble.com/shots/5137383--Mi-Smart-Home-Outside-view-1).
8 |
9 | ## Screenshots
10 |
11 | ### Android
12 |
13 | - [Demo](.github/demo.gif)
14 | - [Home Page - Not Toggled](.github/android_1.png)
15 | - [Home Page - Toggled](.github/android_2.png)
16 |
17 | ### iOS
18 |
19 | - [Home Page - Not Toggled](.github/ios_1.png)
20 | - [Home Page - Toggled](.github/ios_2.png)
21 |
22 | ## Getting Started
23 |
24 | A few resources to get you started if this is your first Flutter project:
25 |
26 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
27 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
28 |
29 | For help getting started with Flutter, view our
30 | [online documentation](https://flutter.dev/docs), which offers tutorials,
31 | samples, guidance on mobile development, and a full API reference.
32 |
--------------------------------------------------------------------------------
/smart_home_app/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/main/kotlin/com/example/smart_home_app/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.smart_home_app
2 |
3 | import androidx.annotation.NonNull;
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugins.GeneratedPluginRegistrant
7 |
8 | class MainActivity: FlutterActivity() {
9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
10 | GeneratedPluginRegistrant.registerWith(flutterEngine);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/smart_home_app/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/smart_home_app/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/smart_home_app/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/smart_home_app/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-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/smart_home_app/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/smart_home_app/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/smart_home_app/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
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 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/smart_home_app/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/smart_home_app/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/smart_home_app/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 |
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/smart_home_app/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 |
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/smart_home_app/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.
--------------------------------------------------------------------------------
/smart_home_app/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/smart_home_app/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:smart_home_app/pages/home_page/home_page.dart';
3 |
4 | void main() => runApp(MyApp());
5 |
6 | class MyApp extends StatelessWidget {
7 | @override
8 | Widget build(BuildContext context) {
9 | return MaterialApp(
10 | debugShowCheckedModeBanner: false,
11 | title: 'Smart Home',
12 | theme: ThemeData(
13 | appBarTheme: AppBarTheme(
14 | color: Colors.transparent,
15 | ),
16 | ),
17 | home: HomePage(),
18 | );
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/smart_home_app/lib/mocks/products.dart:
--------------------------------------------------------------------------------
1 | import 'package:smart_home_app/models/product.dart';
2 | import 'package:smart_home_app/utils/constants.dart';
3 |
4 | const PRODUCTS = [
5 | Product(
6 | image: AppImages.lampada,
7 | name: 'My Lamp',
8 | status: 'Online',
9 | ),
10 | Product(
11 | image: AppImages.lampadaPhilips,
12 | name: 'Philips Lamp',
13 | status: 'Online',
14 | ),
15 | Product(
16 | image: AppImages.camera,
17 | name: 'Camera',
18 | status: 'Sleeping',
19 | ),
20 | Product(
21 | image: AppImages.ventilador,
22 | name: 'mi Fan',
23 | status: 'Online',
24 | ),
25 | ];
26 |
--------------------------------------------------------------------------------
/smart_home_app/lib/models/product.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/foundation.dart';
2 |
3 | class Product {
4 | const Product({
5 | @required this.image,
6 | @required this.name,
7 | @required this.status,
8 | });
9 |
10 | final String image;
11 | final String name;
12 | final String status;
13 | }
14 |
--------------------------------------------------------------------------------
/smart_home_app/lib/pages/home_page/widgets/add_device.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:smart_home_app/utils/constants.dart';
3 |
4 | class AddDevice extends StatelessWidget {
5 | const AddDevice({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Container(
10 | color: AppColors.white,
11 | padding: EdgeInsets.symmetric(vertical: 20),
12 | child: Center(
13 | child: Column(
14 | children: [
15 | Icon(
16 | Icons.add_circle_outline,
17 | color: AppColors.darkGrey,
18 | size: 60,
19 | ),
20 | SizedBox(height: 10),
21 | Text(
22 | 'Add New Device',
23 | style: TextStyle(
24 | color: AppColors.darkGrey,
25 | fontSize: 20,
26 | ),
27 | ),
28 | ],
29 | ),
30 | ),
31 | );
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/smart_home_app/lib/pages/home_page/widgets/app_header.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:smart_home_app/utils/constants.dart';
3 |
4 | class AppHeader extends StatelessWidget {
5 | const AppHeader({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | final _statusBarHeight = MediaQuery.of(context).padding.top;
10 |
11 | return Positioned(
12 | top: _statusBarHeight,
13 | left: 0,
14 | right: 0,
15 | child: Padding(
16 | padding: const EdgeInsets.symmetric(
17 | horizontal: 25,
18 | vertical: 15,
19 | ),
20 | child: Row(
21 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
22 | children: [
23 | Image.network(
24 | AppImages.logo,
25 | width: 25,
26 | ),
27 | Icon(
28 | Icons.menu,
29 | size: 40,
30 | color: AppColors.white,
31 | ),
32 | ],
33 | ),
34 | ),
35 | );
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/smart_home_app/lib/pages/home_page/widgets/product_indicator.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:smart_home_app/utils/constants.dart';
3 |
4 | const double DOT_SIZE = 8;
5 |
6 | class ProductIndicator extends StatelessWidget {
7 | const ProductIndicator({
8 | Key key,
9 | this.activeIndex,
10 | this.count,
11 | }) : super(key: key);
12 |
13 | final int activeIndex;
14 | final int count;
15 |
16 | @override
17 | Widget build(BuildContext context) {
18 | return Row(
19 | mainAxisAlignment: MainAxisAlignment.center,
20 | children: List.generate(
21 | count,
22 | (index) => AnimatedContainer(
23 | duration: AppDurations.short,
24 | margin: EdgeInsets.symmetric(horizontal: 10),
25 | decoration: BoxDecoration(
26 | color: activeIndex == index ? AppColors.blue : AppColors.darkGrey,
27 | shape: BoxShape.circle,
28 | ),
29 | width: DOT_SIZE,
30 | height: DOT_SIZE,
31 | ),
32 | ),
33 | );
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/smart_home_app/lib/pages/home_page/widgets/product_list.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:smart_home_app/mocks/products.dart';
4 | import 'package:smart_home_app/pages/home_page/widgets/product_list_tile.dart';
5 | import 'package:smart_home_app/utils/constants.dart';
6 |
7 | class ProductList extends StatelessWidget {
8 | const ProductList({Key key}) : super(key: key);
9 |
10 | @override
11 | Widget build(BuildContext context) {
12 | return Container(
13 | margin: EdgeInsets.symmetric(
14 | horizontal: 15,
15 | ),
16 | decoration: BoxDecoration(
17 | border: Border(
18 | top: BorderSide(
19 | color: AppColors.grey,
20 | width: 2,
21 | ),
22 | bottom: BorderSide(
23 | color: AppColors.grey,
24 | width: 2,
25 | ),
26 | ),
27 | ),
28 | child: ListView.separated(
29 | shrinkWrap: true,
30 | itemCount: PRODUCTS.length,
31 | padding: EdgeInsets.zero,
32 | physics: NeverScrollableScrollPhysics(),
33 | separatorBuilder: (_, index) => Divider(
34 | height: 0,
35 | color: AppColors.grey,
36 | thickness: 2,
37 | ),
38 | itemBuilder: (_, index) {
39 | return ProductListTile(
40 | product: PRODUCTS[index],
41 | );
42 | },
43 | ),
44 | );
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/smart_home_app/lib/utils/constants.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AppImages {
4 | static const nuvem = "https://i.imgur.com/H39Tu0Y.png";
5 | static const raio = "https://i.imgur.com/GNbX7xe.png";
6 | static const boneco = "https://i.imgur.com/qm7w4Ls.png";
7 | static const luminaria = "https://i.imgur.com/IaSgryg.png";
8 | static const logo = "https://i.imgur.com/2cJwK3f.png";
9 | static const lampada =
10 | "http://images.madeiramadeira.com.br/product/images/80580445-luminaria-smart-xiaomi-mi-mijia-led-exclusivo317-2578-1-600x600.jpg";
11 | static const lampadaPhilips =
12 | "https://ae01.alicdn.com/kf/HTB1XZ3TahrvK1RjSszeq6yObFXaW/Xiaomi-originais-PHILIPS-Candeeiro-de-Mesa-de-Controle-Inteligente-LED-Desk-Lamp-Light-Reading-Eyecare-Mijia.jpg";
13 | static const camera =
14 | "https://images-na.ssl-images-amazon.com/images/I/518Ngm46uuL._AC_SL1500_.jpg";
15 | static const ventilador =
16 | "https://ae01.alicdn.com/kf/HTB1l0ezQVXXXXchXXXXq6xXFXXXF/Original-xiao-mi-mi-inteligente-dc-freq-ncia-suporte-ventilador-wi-fi-telefone-app-controle-remoto.jpg";
17 | }
18 |
19 | class AppColors {
20 | static const blue = Color(0xFF3f4fa4);
21 | static const white = Colors.white;
22 | static const grey = Color(0xFFe3e9f5);
23 | static const darkGrey = Color(0xFFa6aeda);
24 | static const red = Color(0xFFfd6592);
25 | }
26 |
27 | class AppDurations {
28 | static const short = Duration(milliseconds: 300);
29 | static const medium = Duration(milliseconds: 400);
30 | }
31 |
--------------------------------------------------------------------------------
/smart_home_app/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:smart_home_app/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(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 |
--------------------------------------------------------------------------------
/smart_home_app/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/smart_home_app/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/smart_home_app/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/smart_home_app/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | smart_home_app
15 |
16 |
17 |
18 |
21 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/smart_home_app/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "smart_home_app",
3 | "short_name": "smart_home_app",
4 | "start_url": ".",
5 | "display": "minimal-ui",
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 | }
24 |
--------------------------------------------------------------------------------
/weather_calendar_app/.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 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Exceptions to above rules.
37 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
38 |
--------------------------------------------------------------------------------
/weather_calendar_app/.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: fabeb2a16f1d008ab8230f450c49141d35669798
8 | channel: beta
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/weather_calendar_app/README.md:
--------------------------------------------------------------------------------
1 | # weather_calendar_app
2 |
3 | Challenge from [Flutterando](https://github.com/Flutterando).
4 |
5 | ## Mockup
6 |
7 | [Link on Dribble](https://dribbble.com/shots/10879558-App-concept-to-know-Weather).
8 |
9 | ## Screenshots
10 |
11 | ### Android
12 |
13 | - [Main Page - Demo](./video.mp4)
14 | - [Main Page - Portrait](./screenshots/android_1.png)
15 | - [Main Page - Landscape](./screenshots/android_2.png)
16 | - [Main Page - Tablet](./screenshots/android_3.png)
17 |
18 | ### iOS
19 |
20 | - [Main Page - Portrait](./screenshots/ios_1.png)
21 | - [Main Page - Landscape](./screenshots/ios_2.png)
22 | - [Main Page - Tablet](./screenshots/ios_3.png)
23 |
24 | ## Helpful links
25 |
26 | https://medium.com/flutter-community/flutter-sliders-demystified-4b3ea65879c
27 | https://stackoverflow.com/questions/51078707/flutter-container-height-same-as-parent-height
28 |
29 | ## Getting Started
30 |
31 | A few resources to get you started if this is your first Flutter project:
32 |
33 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
34 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
35 |
36 | For help getting started with Flutter, view our
37 | [online documentation](https://flutter.dev/docs), which offers tutorials,
38 | samples, guidance on mobile development, and a full API reference.
39 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/main/kotlin/com/example/weather_calendar_app/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.weather_calendar_app
2 |
3 | import androidx.annotation.NonNull;
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugins.GeneratedPluginRegistrant
7 |
8 | class MainActivity: FlutterActivity() {
9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
10 | GeneratedPluginRegistrant.registerWith(flutterEngine);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/weather_calendar_app/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-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/weather_calendar_app/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/weather_calendar_app/assets/icons/drop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/assets/icons/drop.png
--------------------------------------------------------------------------------
/weather_calendar_app/assets/icons/quote.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/assets/icons/quote.png
--------------------------------------------------------------------------------
/weather_calendar_app/assets/icons/rain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/assets/icons/rain.png
--------------------------------------------------------------------------------
/weather_calendar_app/assets/icons/wind.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/assets/icons/wind.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
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 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/weather_calendar_app/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 |
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/weather_calendar_app/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 |
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/weather_calendar_app/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.
--------------------------------------------------------------------------------
/weather_calendar_app/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:weather_calendar_app/src/pages/home.dart';
3 |
4 | void main() => runApp(MyApp());
5 |
6 | class MyApp extends StatelessWidget {
7 | @override
8 | Widget build(BuildContext context) {
9 | return MaterialApp(
10 | debugShowCheckedModeBanner: false,
11 | title: 'Flutter Demo',
12 | theme: ThemeData(
13 | scaffoldBackgroundColor: Colors.white,
14 | ),
15 | home: HomePage(),
16 | );
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/src/models/weather_data.dart:
--------------------------------------------------------------------------------
1 | import 'package:faker/faker.dart';
2 |
3 | class WeatherData {
4 | WeatherData(this.hour) {
5 | humidity = faker.randomGenerator.integer(80, min: 10);
6 | precipitation = faker.randomGenerator.integer(100);
7 | sentence = faker.lorem.sentence();
8 | wind = faker.randomGenerator.integer(60);
9 | }
10 |
11 | final num hour;
12 |
13 | num humidity;
14 | num precipitation;
15 | String sentence;
16 | num wind;
17 | }
18 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/src/pages/widgets/hour_slider.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:weather_calendar_app/src/utils/constants.dart';
3 | import 'package:weather_calendar_app/src/utils/format.dart';
4 |
5 | class HourSlider extends StatelessWidget {
6 | const HourSlider({
7 | Key key,
8 | @required this.onChange,
9 | @required this.value,
10 | }) : super(key: key);
11 |
12 | final ValueChanged onChange;
13 | final double value;
14 |
15 | @override
16 | Widget build(BuildContext context) {
17 | return Container(
18 | padding: EdgeInsets.symmetric(horizontal: 15),
19 | child: SliderTheme(
20 | data: SliderTheme.of(context).copyWith(
21 | activeTrackColor: AppColors.cyan,
22 | inactiveTrackColor: AppColors.lightPurple,
23 | trackHeight: 4,
24 | thumbColor: AppColors.cyan,
25 | trackShape: RectangularSliderTrackShape(),
26 | overlayColor: AppColors.lightPurple.withOpacity(0.5),
27 | overlayShape: RoundSliderOverlayShape(overlayRadius: 28),
28 | activeTickMarkColor: Colors.transparent,
29 | inactiveTickMarkColor: Colors.transparent,
30 | valueIndicatorColor: AppColors.cyan,
31 | valueIndicatorTextStyle: TextStyle(color: AppColors.purple),
32 | ),
33 | child: Slider(
34 | min: 8,
35 | max: 23,
36 | divisions: 5,
37 | onChanged: onChange,
38 | value: value,
39 | label: formatHour(value),
40 | ),
41 | ),
42 | );
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/src/pages/widgets/quote.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:weather_calendar_app/src/utils/constants.dart';
3 |
4 | class Quote extends StatelessWidget {
5 | const Quote({
6 | Key key,
7 | @required this.quote,
8 | }) : super(key: key);
9 |
10 | final String quote;
11 |
12 | @override
13 | Widget build(BuildContext context) {
14 | return Row(
15 | crossAxisAlignment: CrossAxisAlignment.start,
16 | mainAxisAlignment: MainAxisAlignment.end,
17 | children: [
18 | Image.asset('assets/icons/quote.png', height: 25),
19 | _buildQuote(context),
20 | ],
21 | );
22 | }
23 |
24 | Widget _buildQuote(BuildContext context) {
25 | final child = Padding(
26 | padding: EdgeInsets.fromLTRB(10, 20, 0, 0),
27 | child: Text(
28 | quote,
29 | softWrap: true,
30 | style: TextStyle(
31 | color: AppColors.white,
32 | fontStyle: FontStyle.italic,
33 | fontSize: 16,
34 | ),
35 | ),
36 | );
37 |
38 | return Expanded(child: child);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/src/pages/widgets/temperature.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:weather_calendar_app/src/pages/widgets/animated_value.dart';
3 | import 'package:weather_calendar_app/src/utils/constants.dart';
4 |
5 | class Temperature extends StatelessWidget {
6 | const Temperature({
7 | Key key,
8 | @required this.value,
9 | }) : assert(value != null),
10 | super(key: key);
11 |
12 | final num value;
13 |
14 | @override
15 | Widget build(BuildContext context) {
16 | return Row(
17 | crossAxisAlignment: CrossAxisAlignment.start,
18 | mainAxisAlignment: MainAxisAlignment.center,
19 | children: [
20 | Padding(
21 | padding: EdgeInsets.only(right: 10),
22 | child: AnimatedValue(value: value),
23 | ),
24 | Padding(
25 | padding: EdgeInsets.only(top: 5),
26 | child: Text(
27 | '°C',
28 | style: TextStyle(
29 | color: AppColors.lightPurple,
30 | fontSize: 60,
31 | height: 1,
32 | ),
33 | ),
34 | ),
35 | ],
36 | );
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/src/utils/constants.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | const double AVATAR_SIZE = 30;
4 |
5 | class AppColors {
6 | static const purple = const Color(0xFF470390);
7 | static const lightPurple = const Color(0xFF9E72C6);
8 | static const lightBlue = const Color(0xFFDDD4FF);
9 | static const white = const Color(0xFFFEFDFC);
10 | static const cyan = const Color(0xFF67EDFF);
11 | }
12 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/src/utils/debouncer.dart:
--------------------------------------------------------------------------------
1 | // Extracted from https://medium.com/fantageek/how-to-debounce-action-in-flutter-ed7177843407
2 |
3 | import 'package:flutter/foundation.dart';
4 | import 'dart:async';
5 |
6 | class Debouncer {
7 | Debouncer({this.milliseconds = 500});
8 |
9 | final int milliseconds;
10 |
11 | VoidCallback action;
12 | Timer _timer;
13 |
14 | run(VoidCallback action) {
15 | if (_timer != null) {
16 | _timer.cancel();
17 | }
18 |
19 | _timer = Timer(Duration(milliseconds: milliseconds), action);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/src/utils/format.dart:
--------------------------------------------------------------------------------
1 | String formatHour(num value) {
2 | final hour = value.toInt();
3 |
4 | return hour > 12 ? '${hour - 12}:00 PM' : '$hour:00 AM';
5 | }
6 |
--------------------------------------------------------------------------------
/weather_calendar_app/lib/src/utils/media_query.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | bool isSmBreakpoint(BuildContext context) {
4 | return MediaQuery.of(context).size.width > 480;
5 | }
6 |
--------------------------------------------------------------------------------
/weather_calendar_app/screenshots/android_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/screenshots/android_1.png
--------------------------------------------------------------------------------
/weather_calendar_app/screenshots/android_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/screenshots/android_2.png
--------------------------------------------------------------------------------
/weather_calendar_app/screenshots/android_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/screenshots/android_3.png
--------------------------------------------------------------------------------
/weather_calendar_app/screenshots/ios_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/screenshots/ios_1.png
--------------------------------------------------------------------------------
/weather_calendar_app/screenshots/ios_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/screenshots/ios_2.png
--------------------------------------------------------------------------------
/weather_calendar_app/screenshots/ios_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/screenshots/ios_3.png
--------------------------------------------------------------------------------
/weather_calendar_app/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:weather_calendar_app/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(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 |
--------------------------------------------------------------------------------
/weather_calendar_app/video.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/video.mp4
--------------------------------------------------------------------------------
/weather_calendar_app/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/weather_calendar_app/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arthurdenner/flutter-ui-practice/af536712c9a5763034c2c74ed21fd8bb9873bb07/weather_calendar_app/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/weather_calendar_app/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | weather_calendar_app
15 |
16 |
17 |
18 |
21 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/weather_calendar_app/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "weather_calendar_app",
3 | "short_name": "weather_calendar_app",
4 | "start_url": ".",
5 | "display": "minimal-ui",
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 | }
24 |
--------------------------------------------------------------------------------