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