├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── moisessc │ │ │ │ └── flutter_samples │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── common │ ├── fonts │ │ ├── Lexend │ │ │ ├── Lexend-Bold.ttf │ │ │ ├── Lexend-ExtraBold.ttf │ │ │ ├── Lexend-Light.ttf │ │ │ ├── Lexend-Medium.ttf │ │ │ ├── Lexend-Regular.ttf │ │ │ ├── Lexend-SemiBold.ttf │ │ │ ├── Lexend-Thin.ttf │ │ │ └── OFL.txt │ │ └── Mulish │ │ │ ├── Mulish-Black.ttf │ │ │ ├── Mulish-BlackItalic.ttf │ │ │ ├── Mulish-Bold.ttf │ │ │ ├── Mulish-BoldItalic.ttf │ │ │ ├── Mulish-ExtraBold.ttf │ │ │ ├── Mulish-ExtraBoldItalic.ttf │ │ │ ├── Mulish-ExtraLight.ttf │ │ │ ├── Mulish-ExtraLightItalic.ttf │ │ │ ├── Mulish-Italic.ttf │ │ │ ├── Mulish-Light.ttf │ │ │ ├── Mulish-LightItalic.ttf │ │ │ ├── Mulish-Medium.ttf │ │ │ ├── Mulish-MediumItalic.ttf │ │ │ ├── Mulish-Regular.ttf │ │ │ ├── Mulish-SemiBold.ttf │ │ │ └── Mulish-SemiBoldItalic.ttf │ └── images │ │ └── profile_image.jpg ├── delivery_app │ ├── icons │ │ ├── hamburger.svg │ │ ├── menu.svg │ │ ├── pizza.svg │ │ ├── shrimp.svg │ │ ├── soda.svg │ │ └── spaghetti.svg │ └── images │ │ ├── cheese.png │ │ ├── onion.png │ │ ├── peperoni.png │ │ ├── pizza_primavera.png │ │ ├── pizza_uno.png │ │ └── tomatos.png └── facebook_ui │ ├── icons │ ├── back-arrow.svg │ ├── comment_icon.svg │ ├── dark_mode_icon.png │ ├── friends_icon.svg │ ├── games_icon.svg │ ├── globe.svg │ ├── heart_icon.svg │ ├── home_icon.svg │ ├── jobs_icon.svg │ ├── like_icon.svg │ ├── menu_icon.svg │ ├── saved_icon.svg │ ├── search_icon.svg │ ├── share_icon.svg │ ├── shopping_color_icon.svg │ ├── shopping_icon.svg │ ├── smile_icon.png │ ├── smile_icon.svg │ ├── watch_color_icon.svg │ └── watch_icon.svg │ └── images │ ├── collections │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ └── 5.jpg │ ├── covid_background.svg │ ├── people │ ├── cloe_thompson.jpeg │ ├── daniela_fernandez(2).png │ ├── daniela_fernandez.png │ ├── fernanda.png │ ├── james.png │ ├── james_paul.jpeg │ ├── kate_rob.jpeg │ ├── mao_lop.png │ ├── marcus_dail.jpeg │ ├── michael_bruno.png │ ├── michael_gais.png │ ├── samanta_smith.jpeg │ ├── sarai_perez.png │ └── wilber_garcia.png │ ├── profile │ └── coverage.jpeg │ ├── settings_ago.png │ └── stories │ ├── cloe_preview.png │ ├── fernanda_preview.png │ ├── james_preview.png │ ├── marcus_preview.png │ └── samanta_preview.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── 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 └── build │ └── XCBuildData │ ├── 2d58c78e9522e6781a13a2d79bfd2ac1-desc.xcbuild │ ├── 2d58c78e9522e6781a13a2d79bfd2ac1-manifest.xcbuild │ ├── 8851e2e3e2baab7498e5f61a8689cde6-desc.xcbuild │ ├── 8851e2e3e2baab7498e5f61a8689cde6-manifest.xcbuild │ ├── BuildDescriptionCacheIndex-fdab6e6564df4e9b3f0fbc1015579bf1 │ └── build.db ├── lib ├── delivery_app │ ├── core │ │ ├── colors.dart │ │ └── text_styles.dart │ ├── data │ │ ├── categories.dart │ │ ├── category_state.dart │ │ └── product_details.dart │ ├── screens │ │ ├── detail_screen.dart │ │ └── main_screen_delivery_food.dart │ └── widgets │ │ ├── custom_app_bar.dart │ │ ├── detail_screen │ │ ├── details_header.dart │ │ ├── details_product.dart │ │ └── list_view_ingredients.dart │ │ └── main_screen │ │ ├── custom_circle.dart │ │ ├── list_view_categories.dart │ │ ├── list_view_popular_food.dart │ │ ├── main_header.dart │ │ └── section_text.dart ├── facebook_ui │ ├── data │ │ ├── collections.dart │ │ ├── friends.dart │ │ ├── local_providers.dart │ │ ├── post.dart │ │ └── storie.dart │ ├── screens │ │ ├── home_screen.dart │ │ ├── profile_screen.dart │ │ ├── screen_controller.dart │ │ └── settings_screen.dart │ ├── theme │ │ └── theme_state.dart │ └── widgets │ │ ├── avatar_icon.dart │ │ ├── circle_button.dart │ │ ├── header_app.dart │ │ ├── home_screen │ │ ├── posts.dart │ │ └── stories.dart │ │ ├── large_button.dart │ │ ├── navigation_bar.dart │ │ ├── notification_icon.dart │ │ └── reaction_icons.dart ├── main.dart └── utils │ └── responsive.dart ├── pubspec.lock ├── pubspec.yaml └── test └── widget_test.dart /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /.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: 8962f6dc68ec8e2206ac2fa874da4a453856c7d3 8 | channel: unknown 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Project Banner](https://i.ibb.co/dj2QR6D/project-banner.png "Project Banner") 2 | 3 | [![style: very good analysis](https://img.shields.io/badge/style-very_good_analysis-B22C89.svg)](https://pub.dev/packages/very_good_analysis) 4 | ![Dart version](https://img.shields.io/badge/Dart-2.12.0-blue "Dart version") 5 | ![Project status](https://img.shields.io/badge/status-in%20progress-green "Project status") 6 | ![Project License](https://img.shields.io/badge/License-MIT-orange "Project License") 7 | 8 | If you like it the content please show me your support :heart: with a star :star: 9 | 10 | ## **Description** 11 | This project contains some sample applications created with Flutter, mainly clones of designs obtained from **dribbble and behance.** 12 | 13 | --- 14 | 15 | ## :rocket: **Getting Started** 16 | 1. If you don't have Flutter, you can find information for install it here! **[Install Flutter](https://flutter.dev/docs/get-started/install)** 👈 👈 17 | 2. Open your terminal and clone this repository in your computer with this command: ```git clone https://github.com/moisessc/flutter_samples.git``` 18 | 3. Now go to the cloned repository folder with: ```cd flutter_samples``` 19 | 20 | 4. It's time to get all the dependencies, you can do it typing in your terminal: ```flutter pub get``` 21 | 5. Make sure your device or emulator is initialized and execute this command: ```flutter run``` and enjoy the samples 🙌 22 | 23 | --- 24 | 25 | ## :iphone: **Flutter clone designs** 26 | 27 | ### **Delivery App :pizza:** 28 | | **Principal screen** | **Details Screen** | 29 | | --- | --- | 30 | | ![Delivery App](https://i.ibb.co/7pSMcYY/deliberyapp1.gif) | ![Delivery App Details](https://i.ibb.co/LkXw3CZ/deliveryapp2.gif) | 31 | 32 | | **Package in the project** | **Design** | 33 | | --- | --- | 34 | | delivery_app | [Food Delivery service - Mobile App](https://dribbble.com/shots/14601764-Food-Delivery-service-Mobile-App) | 35 | 36 | --- 37 | 38 | ### **Facebook Redesign by Mao Lop :eyes:** 39 | ### Light Mode :sunny: 40 | | **Home screen** | **Profile screen** | **Settings screen** | 41 | | --- | --- | --- | 42 | |![Home](https://i.ibb.co/jLPMwv4/home.gif)|![Profile](https://i.ibb.co/J2Tr3w0/profile.gif)|![Settings](https://i.ibb.co/3rtK5tt/settings.gif)| 43 | 44 | ### Dark mode :new_moon: 45 | | **Home screen** | **Profile screen** | **Settings screen** | 46 | | --- | --- | --- | 47 | |![Home Dark](https://i.ibb.co/sJ6bx46/homedarkmode.gif)|![Profile Dark](https://i.ibb.co/tKsT35R/profiledarkmode.gif)|![Settings Dark](https://i.ibb.co/b2VJPJ1/settingsdarkmode.gif)| 48 | 49 | 50 | | **Package in the project** | **Design** | 51 | | --- | --- | 52 | | facebook_ui | [Facebook Redesign Dark Mode](https://dribbble.com/shots/15484818-Facebook-Redesign-Dark-Mode)| -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:very_good_analysis/analysis_options.2.0.0.yaml 2 | 3 | linter: 4 | rules: 5 | public_member_api_docs: false -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 30 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | defaultConfig { 36 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 37 | applicationId "com.moisessc.flutter_samples" 38 | minSdkVersion 16 39 | targetSdkVersion 30 40 | versionCode flutterVersionCode.toInteger() 41 | versionName flutterVersionName 42 | } 43 | 44 | buildTypes { 45 | release { 46 | // TODO: Add your own signing config for the release build. 47 | // Signing with the debug keys for now, so `flutter run --release` works. 48 | signingConfig signingConfigs.debug 49 | } 50 | } 51 | } 52 | 53 | flutter { 54 | source '../..' 55 | } 56 | 57 | dependencies { 58 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 59 | } 60 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 13 | 17 | 21 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/moisessc/flutter_samples/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.moisessc.flutter_samples 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | 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 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/common/fonts/Lexend/Lexend-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Lexend/Lexend-Bold.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Lexend/Lexend-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Lexend/Lexend-ExtraBold.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Lexend/Lexend-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Lexend/Lexend-Light.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Lexend/Lexend-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Lexend/Lexend-Medium.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Lexend/Lexend-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Lexend/Lexend-Regular.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Lexend/Lexend-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Lexend/Lexend-SemiBold.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Lexend/Lexend-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Lexend/Lexend-Thin.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Lexend/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2018 The Lexend Project Authors (https://github.com/thomasjockin/lexend), with Reserved Font Name “RevReading Lexend”. 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-Black.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-BlackItalic.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-Bold.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-BoldItalic.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-ExtraBold.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-ExtraLight.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-Italic.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-Light.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-LightItalic.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-Medium.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-MediumItalic.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-Regular.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-SemiBold.ttf -------------------------------------------------------------------------------- /assets/common/fonts/Mulish/Mulish-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/fonts/Mulish/Mulish-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /assets/common/images/profile_image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/common/images/profile_image.jpg -------------------------------------------------------------------------------- /assets/delivery_app/icons/hamburger.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/delivery_app/icons/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /assets/delivery_app/icons/pizza.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/delivery_app/icons/shrimp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 11 | 12 | 13 | 15 | 17 | 18 | 20 | 22 | 23 | 25 | 26 | 29 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /assets/delivery_app/images/cheese.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/delivery_app/images/cheese.png -------------------------------------------------------------------------------- /assets/delivery_app/images/onion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/delivery_app/images/onion.png -------------------------------------------------------------------------------- /assets/delivery_app/images/peperoni.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/delivery_app/images/peperoni.png -------------------------------------------------------------------------------- /assets/delivery_app/images/pizza_primavera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/delivery_app/images/pizza_primavera.png -------------------------------------------------------------------------------- /assets/delivery_app/images/pizza_uno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/delivery_app/images/pizza_uno.png -------------------------------------------------------------------------------- /assets/delivery_app/images/tomatos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/delivery_app/images/tomatos.png -------------------------------------------------------------------------------- /assets/facebook_ui/icons/back-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/comment_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/dark_mode_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/icons/dark_mode_icon.png -------------------------------------------------------------------------------- /assets/facebook_ui/icons/friends_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/games_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/globe.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/heart_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/home_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/jobs_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/like_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/menu_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/saved_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/search_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/share_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/shopping_color_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/shopping_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/smile_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/icons/smile_icon.png -------------------------------------------------------------------------------- /assets/facebook_ui/icons/smile_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/watch_color_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /assets/facebook_ui/icons/watch_icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/facebook_ui/images/collections/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/collections/1.jpg -------------------------------------------------------------------------------- /assets/facebook_ui/images/collections/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/collections/2.jpg -------------------------------------------------------------------------------- /assets/facebook_ui/images/collections/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/collections/3.jpg -------------------------------------------------------------------------------- /assets/facebook_ui/images/collections/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/collections/4.jpg -------------------------------------------------------------------------------- /assets/facebook_ui/images/collections/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/collections/5.jpg -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/cloe_thompson.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/cloe_thompson.jpeg -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/daniela_fernandez(2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/daniela_fernandez(2).png -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/daniela_fernandez.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/daniela_fernandez.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/fernanda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/fernanda.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/james.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/james.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/james_paul.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/james_paul.jpeg -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/kate_rob.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/kate_rob.jpeg -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/mao_lop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/mao_lop.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/marcus_dail.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/marcus_dail.jpeg -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/michael_bruno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/michael_bruno.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/michael_gais.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/michael_gais.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/samanta_smith.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/samanta_smith.jpeg -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/sarai_perez.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/sarai_perez.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/people/wilber_garcia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/people/wilber_garcia.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/profile/coverage.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/profile/coverage.jpeg -------------------------------------------------------------------------------- /assets/facebook_ui/images/settings_ago.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/settings_ago.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/stories/cloe_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/stories/cloe_preview.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/stories/fernanda_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/stories/fernanda_preview.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/stories/james_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/stories/james_preview.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/stories/marcus_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/stories/marcus_preview.png -------------------------------------------------------------------------------- /assets/facebook_ui/images/stories/samanta_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/assets/facebook_ui/images/stories/samanta_preview.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - Flutter (from `Flutter`) 6 | 7 | EXTERNAL SOURCES: 8 | Flutter: 9 | :path: Flutter 10 | 11 | SPEC CHECKSUMS: 12 | Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c 13 | 14 | PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c 15 | 16 | COCOAPODS: 1.10.1 17 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | flutter_samples 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /ios/build/XCBuildData/2d58c78e9522e6781a13a2d79bfd2ac1-desc.xcbuild: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/build/XCBuildData/2d58c78e9522e6781a13a2d79bfd2ac1-desc.xcbuild -------------------------------------------------------------------------------- /ios/build/XCBuildData/8851e2e3e2baab7498e5f61a8689cde6-desc.xcbuild: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/build/XCBuildData/8851e2e3e2baab7498e5f61a8689cde6-desc.xcbuild -------------------------------------------------------------------------------- /ios/build/XCBuildData/BuildDescriptionCacheIndex-fdab6e6564df4e9b3f0fbc1015579bf1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/build/XCBuildData/BuildDescriptionCacheIndex-fdab6e6564df4e9b3f0fbc1015579bf1 -------------------------------------------------------------------------------- /ios/build/XCBuildData/build.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/moisessc/flutter_samples/9461ce9ceebe06abdc3481a9f8cfc4112a7e7b32/ios/build/XCBuildData/build.db -------------------------------------------------------------------------------- /lib/delivery_app/core/colors.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | import 'package:flutter/material.dart'; 3 | 4 | const kYellow = Color(0xFFFFC91B); 5 | const kYellowCrown = Color(0xFFFFC820); 6 | const kWhite = Color(0xFFFFFFFF); 7 | const kRed = Color(0xFFFA666D); 8 | const kLightGray = Color(0xFFF9F9F9); 9 | const kMiddleBlack = Color(0xFFE6EBE8); 10 | const kLightBlack = Color(0xFFC2C2C2); 11 | const kBlack = Color(0xFF000000); 12 | const kOrange = Color(0xFFFB6428); 13 | -------------------------------------------------------------------------------- /lib/delivery_app/core/text_styles.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import './colors.dart'; 4 | 5 | const kHeader = TextStyle( 6 | fontWeight: FontWeight.w700, 7 | fontSize: 50, 8 | fontFamily: 'Mulish', 9 | ); 10 | 11 | const kSubHeader = TextStyle( 12 | fontWeight: FontWeight.w500, 13 | fontSize: 18, 14 | fontFamily: 'Mulish', 15 | ); 16 | 17 | const kSection = TextStyle( 18 | fontWeight: FontWeight.w700, 19 | fontSize: 20, 20 | fontFamily: 'Mulish', 21 | ); 22 | 23 | const kCategory = TextStyle( 24 | fontWeight: FontWeight.w600, 25 | fontSize: 16, 26 | fontFamily: 'Mulish', 27 | ); 28 | 29 | const kTopPopularCard = TextStyle( 30 | fontWeight: FontWeight.w400, 31 | fontSize: 15, 32 | fontFamily: 'Mulish', 33 | ); 34 | 35 | const kHeaderPopularCard = TextStyle( 36 | fontWeight: FontWeight.w700, 37 | fontSize: 25, 38 | fontFamily: 'Mulish', 39 | ); 40 | 41 | const kSubHeaderPopularCard = TextStyle( 42 | fontWeight: FontWeight.w600, 43 | fontSize: 15, 44 | fontFamily: 'Mulish', 45 | color: kLightBlack, 46 | ); 47 | 48 | const kPuntuationPopularCard = TextStyle( 49 | fontWeight: FontWeight.w500, 50 | fontSize: 20, 51 | fontFamily: 'Mulish', 52 | ); 53 | 54 | const kPrice = TextStyle( 55 | fontWeight: FontWeight.w600, 56 | fontSize: 47, 57 | fontFamily: 'Lexend', 58 | color: kOrange, 59 | ); 60 | 61 | const kPriceSymbol = TextStyle( 62 | fontWeight: FontWeight.w600, 63 | fontSize: 20, 64 | fontFamily: 'Lexend', 65 | color: kOrange, 66 | ); 67 | 68 | const kDetailsTitleDescription = TextStyle( 69 | fontWeight: FontWeight.w400, 70 | fontSize: 18, 71 | fontFamily: 'Mulish', 72 | color: kLightBlack, 73 | ); 74 | 75 | const kDetailsDescription = TextStyle( 76 | fontWeight: FontWeight.w500, 77 | fontSize: 20, 78 | fontFamily: 'Mulish', 79 | color: kBlack, 80 | ); 81 | -------------------------------------------------------------------------------- /lib/delivery_app/data/categories.dart: -------------------------------------------------------------------------------- 1 | class Category { 2 | Category({ 3 | required this.categoryName, 4 | required this.categoryImage, 5 | required this.semanticLabel, 6 | }); 7 | 8 | final String categoryName; 9 | final String categoryImage; 10 | final String semanticLabel; 11 | } 12 | 13 | List categories = List.of({ 14 | Category( 15 | categoryName: 'Pizza', 16 | categoryImage: 'assets/delivery_app/icons/pizza.svg', 17 | semanticLabel: 'Pizza Label', 18 | ), 19 | Category( 20 | categoryName: 'Seafood', 21 | categoryImage: 'assets/delivery_app/icons/shrimp.svg', 22 | semanticLabel: 'Seafood Label', 23 | ), 24 | Category( 25 | categoryName: 'Soft Drinks', 26 | categoryImage: 'assets/delivery_app/icons/soda.svg', 27 | semanticLabel: 'Soft Drinks Label', 28 | ), 29 | Category( 30 | categoryName: 'Hamburger', 31 | categoryImage: 'assets/delivery_app/icons/hamburger.svg', 32 | semanticLabel: 'Hamburger Label', 33 | ), 34 | Category( 35 | categoryName: 'Italian Food', 36 | categoryImage: 'assets/delivery_app/icons/spaghetti.svg', 37 | semanticLabel: 'Spaghetti Label', 38 | ), 39 | }); 40 | -------------------------------------------------------------------------------- /lib/delivery_app/data/category_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CategoryState with ChangeNotifier { 4 | int _categorySelected = 0; 5 | 6 | int get categorySelected => _categorySelected; 7 | 8 | set categorySelected(int category) { 9 | _categorySelected = category; 10 | notifyListeners(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/delivery_app/data/product_details.dart: -------------------------------------------------------------------------------- 1 | class ProductDetails { 2 | ProductDetails({ 3 | required this.top, 4 | required this.productName, 5 | required this.weight, 6 | required this.stars, 7 | required this.price, 8 | required this.size, 9 | required this.crust, 10 | required this.deliveryTime, 11 | required this.image, 12 | required this.ingredients, 13 | }); 14 | 15 | final String top; 16 | final String productName; 17 | final String weight; 18 | final double stars; 19 | final double price; 20 | final String size; 21 | final String crust; 22 | final String deliveryTime; 23 | final String image; 24 | final List ingredients; 25 | } 26 | 27 | List detailsProducts = List.of({ 28 | ProductDetails( 29 | top: 'top of the week', 30 | productName: 'Primavera Pizza', 31 | weight: 'Weight 540 gr', 32 | stars: 5.0, 33 | price: 5.99, 34 | size: 'Medium 14"', 35 | crust: 'Thin Crust', 36 | deliveryTime: '30 min', 37 | image: 'assets/delivery_app/images/pizza_primavera.png', 38 | ingredients: List.of({ 39 | 'assets/delivery_app/images/peperoni.png', 40 | 'assets/delivery_app/images/tomatos.png', 41 | 'assets/delivery_app/images/onion.png', 42 | 'assets/delivery_app/images/cheese.png', 43 | }), 44 | ), 45 | ProductDetails( 46 | top: 'top of the day', 47 | productName: 'Sausage Pizza', 48 | weight: 'Weight 240 gr', 49 | stars: 4.5, 50 | price: 3.99, 51 | size: 'Medium 14"', 52 | crust: 'Thin Crust', 53 | deliveryTime: '20 min', 54 | image: 'assets/delivery_app/images/pizza_uno.png', 55 | ingredients: List.of({ 56 | 'assets/delivery_app/images/peperoni.png', 57 | 'assets/delivery_app/images/tomatos.png', 58 | 'assets/delivery_app/images/onion.png', 59 | 'assets/delivery_app/images/cheese.png', 60 | }), 61 | ), 62 | }); 63 | -------------------------------------------------------------------------------- /lib/delivery_app/screens/main_screen_delivery_food.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_samples/utils/responsive.dart'; 3 | import 'package:flutter_svg/svg.dart'; 4 | 5 | import '../core/colors.dart'; 6 | import '../widgets/custom_app_bar.dart'; 7 | import '../widgets/main_screen/custom_circle.dart'; 8 | import '../widgets/main_screen/list_view_categories.dart'; 9 | import '../widgets/main_screen/list_view_popular_food.dart'; 10 | import '../widgets/main_screen/main_header.dart'; 11 | import '../widgets/main_screen/section_text.dart'; 12 | 13 | class MainScreenDeliveryFood extends StatelessWidget { 14 | const MainScreenDeliveryFood({Key? key}) : super(key: key); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return MaterialApp( 19 | debugShowCheckedModeBanner: false, 20 | theme: ThemeData( 21 | brightness: Brightness.light, 22 | primaryColor: Colors.black, 23 | ), 24 | home: const _HomeScreen(), 25 | ); 26 | } 27 | } 28 | 29 | class _HomeScreen extends StatefulWidget { 30 | const _HomeScreen({Key? key}) : super(key: key); 31 | 32 | @override 33 | __HomeScreenState createState() => __HomeScreenState(); 34 | } 35 | 36 | class __HomeScreenState extends State<_HomeScreen> 37 | with SingleTickerProviderStateMixin { 38 | late AnimationController _animationController; 39 | late Animation _animationAvatar; 40 | late Animation _animationCircle; 41 | late Animation _animationMenuAndText; 42 | late Animation _animationPopularText; 43 | 44 | void _setupAnimations() { 45 | _animationController = AnimationController( 46 | vsync: this, 47 | duration: const Duration(seconds: 4), 48 | ); 49 | _animationAvatar = CurvedAnimation( 50 | parent: _animationController, 51 | curve: const Interval( 52 | 0.20, 53 | 0.50, 54 | curve: Curves.elasticOut, 55 | ), 56 | ); 57 | _animationCircle = CurvedAnimation( 58 | parent: _animationController, 59 | curve: const Interval( 60 | 0.10, 61 | 0.50, 62 | curve: Curves.elasticOut, 63 | ), 64 | ); 65 | _animationMenuAndText = CurvedAnimation( 66 | parent: _animationController, 67 | curve: const Interval( 68 | 0.20, 69 | 0.50, 70 | curve: Curves.elasticOut, 71 | ), 72 | ); 73 | _animationPopularText = CurvedAnimation( 74 | parent: _animationController, 75 | curve: const Interval( 76 | 0.45, 77 | 0.80, 78 | curve: Curves.elasticOut, 79 | ), 80 | ); 81 | _animationController.forward(); 82 | } 83 | 84 | @override 85 | void initState() { 86 | _setupAnimations(); 87 | super.initState(); 88 | } 89 | 90 | @override 91 | void dispose() { 92 | _animationController.dispose(); 93 | super.dispose(); 94 | } 95 | 96 | @override 97 | Widget build(BuildContext context) { 98 | const profileImage = 'assets/common/images/profile_image.jpg'; 99 | const menuIcon = 'assets/delivery_app/icons/menu.svg'; 100 | final responsive = Responsive.of(context); 101 | 102 | return Scaffold( 103 | backgroundColor: kWhite, 104 | resizeToAvoidBottomInset: false, 105 | body: SafeArea( 106 | bottom: false, 107 | child: AnimatedBuilder( 108 | animation: _animationController, 109 | builder: (_, __) { 110 | return Stack( 111 | children: [ 112 | Transform.scale( 113 | alignment: Alignment.center, 114 | scale: _animationCircle.value, 115 | origin: Offset( 116 | -responsive.width * 0.3, 117 | -responsive.height * 0.3, 118 | ), 119 | child: const CustomCircle(), 120 | ), 121 | Column( 122 | crossAxisAlignment: CrossAxisAlignment.start, 123 | children: [ 124 | CustomAppBar( 125 | itemLeft: Transform.scale( 126 | scale: _animationAvatar.value, 127 | child: IconButtonTabBar( 128 | icon: const CircleAvatar( 129 | backgroundColor: kWhite, 130 | backgroundImage: AssetImage(profileImage), 131 | radius: 25, 132 | ), 133 | backgroundColor: Colors.transparent, 134 | callback: () => debugPrint('Avatar'), 135 | ), 136 | ), 137 | itemRight: Transform.scale( 138 | scale: _animationMenuAndText.value, 139 | child: IconButtonTabBar( 140 | icon: SvgPicture.asset( 141 | menuIcon, 142 | alignment: Alignment.center, 143 | height: responsive.heightPercent(3.5), 144 | width: responsive.heightPercent(3.5), 145 | ), 146 | backgroundColor: Colors.transparent, 147 | callback: () => debugPrint('menu'), 148 | ), 149 | ), 150 | ), 151 | const SizedBox(height: 15), 152 | GestureDetector( 153 | onTap: () => _animationController.forward(from: 0.0), 154 | child: MainHeader( 155 | animationMenuAndText: _animationMenuAndText, 156 | ), 157 | ), 158 | const SizedBox(height: 20), 159 | Transform.scale( 160 | scale: _animationMenuAndText.value, 161 | child: const SectionText(text: 'Categories'), 162 | ), 163 | ListViewCategories(animationHandler: _animationController), 164 | const SizedBox(height: 10.0), 165 | Transform.scale( 166 | scale: _animationPopularText.value, 167 | child: const SectionText(text: 'Popular'), 168 | ), 169 | ListViewPopularFood( 170 | animationController: _animationController, 171 | ), 172 | ], 173 | ), 174 | ], 175 | ); 176 | }, 177 | ), 178 | ), 179 | ); 180 | } 181 | } 182 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/custom_app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_samples/delivery_app/core/colors.dart'; 3 | 4 | import '../../utils/responsive.dart'; 5 | 6 | class CustomAppBar extends StatelessWidget { 7 | const CustomAppBar({ 8 | required this.itemLeft, 9 | required this.itemRight, 10 | this.margin = const EdgeInsets.symmetric(horizontal: 20), 11 | Key? key, 12 | }) : super(key: key); 13 | 14 | final Widget itemLeft; 15 | final Widget itemRight; 16 | final EdgeInsets margin; 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return Container( 21 | margin: margin, 22 | height: kToolbarHeight, 23 | child: Row( 24 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 25 | crossAxisAlignment: CrossAxisAlignment.center, 26 | children: [itemLeft, itemRight], 27 | ), 28 | ); 29 | } 30 | } 31 | 32 | class IconButtonTabBar extends StatelessWidget { 33 | const IconButtonTabBar({ 34 | required this.icon, 35 | required this.backgroundColor, 36 | required this.callback, 37 | this.border = false, 38 | Key? key, 39 | }) : super(key: key); 40 | 41 | final Widget icon; 42 | final Color backgroundColor; 43 | final bool border; 44 | final VoidCallback callback; 45 | 46 | @override 47 | Widget build(BuildContext context) { 48 | final responsive = Responsive.of(context); 49 | 50 | return Material( 51 | color: backgroundColor, 52 | borderRadius: BorderRadius.circular(12), 53 | child: InkWell( 54 | onTap: callback, 55 | borderRadius: BorderRadius.circular(12), 56 | child: Container( 57 | height: responsive.heightPercent(6), 58 | width: responsive.heightPercent(6), 59 | decoration: BoxDecoration( 60 | borderRadius: BorderRadius.circular(12), 61 | border: (border) 62 | ? Border.all( 63 | width: 1.0, 64 | color: kLightBlack, 65 | style: BorderStyle.solid, 66 | ) 67 | : null, 68 | ), 69 | child: Center(child: icon), 70 | ), 71 | ), 72 | ); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/detail_screen/details_header.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_size_text/auto_size_text.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_samples/utils/responsive.dart'; 4 | 5 | import '../../core/text_styles.dart'; 6 | 7 | class DetailsHeader extends StatelessWidget { 8 | const DetailsHeader({ 9 | Key? key, 10 | required Animation animationAIngredientsAndHeader, 11 | required this.productName, 12 | required this.productNameLength, 13 | required this.productPrice, 14 | this.margin = 20, 15 | }) : _animationAIngredientsAndHeader = animationAIngredientsAndHeader, 16 | super(key: key); 17 | 18 | final Animation _animationAIngredientsAndHeader; 19 | final String productName; 20 | final int productNameLength; 21 | final double productPrice; 22 | final double margin; 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | final responsive = Responsive.of(context); 27 | 28 | return Column( 29 | crossAxisAlignment: CrossAxisAlignment.start, 30 | children: [ 31 | Transform.scale( 32 | alignment: Alignment.centerLeft, 33 | scale: _animationAIngredientsAndHeader.value, 34 | child: Container( 35 | width: responsive.widthPercent(60), 36 | height: responsive.heightPercent(12.5), 37 | child: AutoSizeText( 38 | '$productName', 39 | style: kHeader, 40 | maxLines: 2, 41 | ), 42 | ), 43 | ), 44 | const SizedBox(height: 10), 45 | PriceText( 46 | animationAIngredientsAndHeader: _animationAIngredientsAndHeader, 47 | productPrice: productPrice, 48 | ), 49 | ], 50 | ); 51 | } 52 | } 53 | 54 | class PriceText extends StatelessWidget { 55 | const PriceText({ 56 | Key? key, 57 | required Animation animationAIngredientsAndHeader, 58 | required this.productPrice, 59 | }) : _animationAIngredientsAndHeader = animationAIngredientsAndHeader, 60 | super(key: key); 61 | 62 | final Animation _animationAIngredientsAndHeader; 63 | final double productPrice; 64 | 65 | @override 66 | Widget build(BuildContext context) { 67 | final responsive = Responsive.of(context); 68 | 69 | return Container( 70 | height: responsive.heightPercent(7.5), 71 | child: IntrinsicHeight( 72 | child: Row( 73 | crossAxisAlignment: CrossAxisAlignment.stretch, 74 | children: [ 75 | Padding( 76 | padding: const EdgeInsets.only(top: 5.0), 77 | child: Transform.scale( 78 | scale: _animationAIngredientsAndHeader.value, 79 | child: const Text( 80 | '\$', 81 | style: kPriceSymbol, 82 | ), 83 | ), 84 | ), 85 | Transform.scale( 86 | scale: _animationAIngredientsAndHeader.value, 87 | alignment: Alignment.centerLeft, 88 | child: Text( 89 | '$productPrice', 90 | style: kPrice, 91 | ), 92 | ), 93 | ], 94 | ), 95 | ), 96 | ); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/detail_screen/details_product.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_size_text/auto_size_text.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_samples/utils/responsive.dart'; 4 | 5 | import '../../core/text_styles.dart'; 6 | 7 | class DetailsProduct extends StatelessWidget { 8 | const DetailsProduct({ 9 | Key? key, 10 | required Animation animationSize, 11 | required this.productSize, 12 | required Animation animationCrust, 13 | required this.productCrust, 14 | required Animation animationDelivery, 15 | required this.productDeliveryTime, 16 | }) : _animationSize = animationSize, 17 | _animationCrust = animationCrust, 18 | _animationDelivery = animationDelivery, 19 | super(key: key); 20 | 21 | final Animation _animationSize; 22 | final Animation _animationDelivery; 23 | final Animation _animationCrust; 24 | final String productSize; 25 | final String productCrust; 26 | final String productDeliveryTime; 27 | 28 | @override 29 | Widget build(BuildContext context) { 30 | return Column( 31 | crossAxisAlignment: CrossAxisAlignment.start, 32 | children: [ 33 | Transform.translate( 34 | offset: Offset( 35 | _animationSize.value, 36 | 0.0, 37 | ), 38 | child: DescriptionProductElement( 39 | tittle: 'Size', 40 | value: '$productSize', 41 | ), 42 | ), 43 | Transform.translate( 44 | offset: Offset( 45 | _animationCrust.value, 46 | 0.0, 47 | ), 48 | child: DescriptionProductElement( 49 | tittle: 'Crust', 50 | value: '$productCrust', 51 | ), 52 | ), 53 | Transform.translate( 54 | offset: Offset( 55 | _animationDelivery.value, 56 | 0.0, 57 | ), 58 | child: DescriptionProductElement( 59 | tittle: 'Delivery in', 60 | value: '$productDeliveryTime', 61 | ), 62 | ), 63 | ], 64 | ); 65 | } 66 | } 67 | 68 | class DescriptionProductElement extends StatelessWidget { 69 | const DescriptionProductElement({ 70 | required this.tittle, 71 | required this.value, 72 | Key? key, 73 | }) : super(key: key); 74 | 75 | final String tittle; 76 | final String value; 77 | 78 | @override 79 | Widget build(BuildContext context) { 80 | final responsive = Responsive.of(context); 81 | 82 | return Container( 83 | margin: EdgeInsets.only(top: responsive.heightPercent(2.5)), 84 | child: Column( 85 | crossAxisAlignment: CrossAxisAlignment.start, 86 | children: [ 87 | Container( 88 | height: responsive.heightPercent(3), 89 | child: AutoSizeText( 90 | '$tittle', 91 | style: kDetailsTitleDescription, 92 | maxLines: 1, 93 | ), 94 | ), 95 | const SizedBox(height: 5), 96 | Container( 97 | height: responsive.heightPercent(3), 98 | child: AutoSizeText('$value', style: kDetailsDescription), 99 | ), 100 | ], 101 | ), 102 | ); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/detail_screen/list_view_ingredients.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_samples/utils/responsive.dart'; 3 | 4 | import '../../core/colors.dart'; 5 | 6 | class IngredientsBuilder extends StatelessWidget { 7 | const IngredientsBuilder({ 8 | required this.ingredients, 9 | required Animation animationAIngredientsAndHeader, 10 | Key? key, 11 | }) : _animationAIngredientsAndHeader = animationAIngredientsAndHeader, 12 | super(key: key); 13 | 14 | final List ingredients; 15 | final Animation _animationAIngredientsAndHeader; 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | final responsive = Responsive.of(context); 20 | 21 | return ListView.separated( 22 | itemCount: ingredients.length, 23 | scrollDirection: Axis.horizontal, 24 | physics: const BouncingScrollPhysics(), 25 | padding: EdgeInsets.symmetric( 26 | horizontal: responsive.widthPercent(5), 27 | vertical: responsive.heightPercent(2), 28 | ), 29 | itemBuilder: (_, index) { 30 | return Transform.scale( 31 | alignment: Alignment.topCenter, 32 | scale: _animationAIngredientsAndHeader.value, 33 | child: Container( 34 | width: responsive.widthPercent(25), 35 | padding: EdgeInsets.all(responsive.heightPercent(1)), 36 | decoration: BoxDecoration( 37 | color: kWhite, 38 | borderRadius: BorderRadius.circular(10), 39 | boxShadow: [ 40 | BoxShadow( 41 | color: Colors.grey.withOpacity(0.3), 42 | blurRadius: 5.0, 43 | offset: const Offset(0, 5), 44 | ), 45 | ], 46 | ), 47 | child: Transform.scale( 48 | scale: _animationAIngredientsAndHeader.value, 49 | alignment: Alignment.topCenter, 50 | child: Image.asset(ingredients[index]), 51 | ), 52 | ), 53 | ); 54 | }, 55 | separatorBuilder: (_, __) => const SizedBox(width: 30), 56 | ); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/main_screen/custom_circle.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../utils/responsive.dart'; 4 | import '../../core/colors.dart'; 5 | 6 | class CustomCircle extends StatelessWidget { 7 | const CustomCircle({ 8 | Key? key, 9 | }) : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | final responsive = Responsive.of(context); 14 | return Container( 15 | height: responsive.height, 16 | width: responsive.width, 17 | child: CustomPaint( 18 | painter: CircleWidget(), 19 | ), 20 | ); 21 | } 22 | } 23 | 24 | class CircleWidget extends CustomPainter { 25 | @override 26 | void paint(Canvas canvas, Size size) { 27 | final paint = Paint() 28 | ..color = kLightGray 29 | ..style = PaintingStyle.fill 30 | ..strokeWidth = 20; 31 | final offsetDraw = Offset(size.width * 0.2, size.height * 0.1); 32 | canvas.drawCircle(offsetDraw, size.width * 0.6, paint); 33 | } 34 | 35 | @override 36 | bool shouldRepaint(covariant CustomPainter oldDelegate) => false; 37 | } 38 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/main_screen/list_view_categories.dart: -------------------------------------------------------------------------------- 1 | import 'package:auto_size_text/auto_size_text.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 4 | import 'package:flutter_svg/flutter_svg.dart'; 5 | import 'package:provider/provider.dart'; 6 | 7 | import '../../../utils/responsive.dart'; 8 | import '../../core/colors.dart'; 9 | import '../../core/text_styles.dart'; 10 | import '../../data/categories.dart'; 11 | import '../../data/category_state.dart'; 12 | 13 | class ListViewCategories extends StatelessWidget { 14 | const ListViewCategories({ 15 | Key? key, 16 | required AnimationController animationHandler, 17 | }) : _animationHandler = animationHandler, 18 | super(key: key); 19 | 20 | final AnimationController _animationHandler; 21 | 22 | @override 23 | Widget build(BuildContext context) { 24 | final responsive = Responsive.of(context); 25 | 26 | return Container( 27 | height: responsive.heightPercent(25), 28 | child: ListView.separated( 29 | scrollDirection: Axis.horizontal, 30 | physics: const BouncingScrollPhysics(), 31 | itemCount: categories.length, 32 | itemBuilder: (_, index) => _CardCategory( 33 | animationController: _animationHandler, 34 | category: categories[index], 35 | index: index, 36 | ), 37 | separatorBuilder: (_, __) => const SizedBox(width: 25), 38 | padding: EdgeInsets.only( 39 | left: 20, 40 | right: 20, 41 | top: responsive.heightPercent(2.5), 42 | bottom: responsive.heightPercent(4.5), 43 | ), 44 | ), 45 | ); 46 | } 47 | } 48 | 49 | class _CardCategory extends StatelessWidget { 50 | const _CardCategory({ 51 | required this.animationController, 52 | required this.index, 53 | required this.category, 54 | Key? key, 55 | }) : super(key: key); 56 | 57 | final AnimationController animationController; 58 | final Category category; 59 | final int index; 60 | 61 | @override 62 | Widget build(BuildContext context) { 63 | final responsive = Responsive.of(context); 64 | 65 | final categoryState = Provider.of(context); 66 | final categorySelected = categoryState.categorySelected; 67 | final isCategorySelected = categorySelected == index; 68 | 69 | Animation _animationCardCategories; 70 | Animation _animationContentCard; 71 | 72 | _animationCardCategories = CurvedAnimation( 73 | parent: animationController, 74 | curve: Interval( 75 | 0.30 + (0.05 * index), 76 | 0.75, 77 | curve: Curves.elasticOut, 78 | ), 79 | ); 80 | _animationContentCard = CurvedAnimation( 81 | parent: animationController, 82 | curve: Interval( 83 | 0.40 + (0.05 * index), 84 | 0.75, 85 | curve: Curves.elasticOut, 86 | ), 87 | ); 88 | 89 | return Transform.scale( 90 | scale: _animationCardCategories.value, 91 | child: InkWell( 92 | onTap: () => categoryState.categorySelected = index, 93 | borderRadius: BorderRadius.circular(20), 94 | splashColor: Colors.white.withOpacity(0.3), 95 | child: AnimatedContainer( 96 | duration: const Duration(milliseconds: 300), 97 | width: responsive.widthPercent(25), 98 | decoration: BoxDecoration( 99 | color: (isCategorySelected) ? kYellow : kWhite, 100 | borderRadius: BorderRadius.circular(20), 101 | boxShadow: [ 102 | const BoxShadow( 103 | color: kMiddleBlack, 104 | blurRadius: 5.0, 105 | offset: Offset(0, 5), 106 | ), 107 | ], 108 | ), 109 | child: Column( 110 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 111 | children: [ 112 | Transform.scale( 113 | scale: _animationContentCard.value, 114 | child: SvgPicture.asset( 115 | '${category.categoryImage}', 116 | semanticsLabel: '${category.semanticLabel}', 117 | alignment: Alignment.center, 118 | height: responsive.heightPercent(5.5), 119 | width: responsive.heightPercent(5.5), 120 | ), 121 | ), 122 | Container( 123 | width: responsive.widthPercent(25), 124 | height: responsive.heightPercent(3), 125 | child: Transform.scale( 126 | scale: _animationContentCard.value, 127 | child: AutoSizeText( 128 | '${category.categoryName}', 129 | style: kCategory, 130 | textAlign: TextAlign.center, 131 | maxLines: 1, 132 | ), 133 | ), 134 | ), 135 | Transform.scale( 136 | scale: _animationContentCard.value, 137 | child: _DotCategories( 138 | background: (isCategorySelected) ? kWhite : kRed, 139 | iconColor: (isCategorySelected) ? Colors.black : kWhite, 140 | ), 141 | ) 142 | ], 143 | ), 144 | ), 145 | ), 146 | ); 147 | } 148 | } 149 | 150 | class _DotCategories extends StatelessWidget { 151 | const _DotCategories({ 152 | required this.background, 153 | required this.iconColor, 154 | Key? key, 155 | }) : super(key: key); 156 | 157 | final Color background; 158 | final Color iconColor; 159 | 160 | @override 161 | Widget build(BuildContext context) { 162 | final responsive = Responsive.of(context); 163 | 164 | return AnimatedContainer( 165 | duration: const Duration(milliseconds: 500), 166 | width: responsive.heightPercent(3.5), 167 | height: responsive.heightPercent(3.5), 168 | decoration: BoxDecoration( 169 | color: background, 170 | shape: BoxShape.circle, 171 | ), 172 | child: Center( 173 | child: FaIcon( 174 | FontAwesomeIcons.angleRight, 175 | size: 10, 176 | color: iconColor, 177 | ), 178 | ), 179 | ); 180 | } 181 | } 182 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/main_screen/list_view_popular_food.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math' as math; 2 | import 'package:auto_size_text/auto_size_text.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 5 | 6 | import '../../../utils/responsive.dart'; 7 | import '../../core/colors.dart'; 8 | import '../../core/text_styles.dart'; 9 | import '../../data/product_details.dart'; 10 | import '../../screens/detail_screen.dart'; 11 | 12 | class ListViewPopularFood extends StatelessWidget { 13 | const ListViewPopularFood({ 14 | Key? key, 15 | required AnimationController animationController, 16 | }) : _animationController = animationController, 17 | super(key: key); 18 | 19 | final AnimationController _animationController; 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return Expanded( 24 | child: ListView.separated( 25 | itemCount: detailsProducts.length, 26 | physics: const BouncingScrollPhysics(), 27 | padding: const EdgeInsets.symmetric(horizontal: 15.0), 28 | itemBuilder: (_, index) => _CardPopularFood( 29 | animationController: _animationController, 30 | product: detailsProducts[index], 31 | index: index, 32 | ), 33 | separatorBuilder: (_, __) => const SizedBox(height: 25.0), 34 | ), 35 | ); 36 | } 37 | } 38 | 39 | class _CardPopularFood extends StatelessWidget { 40 | const _CardPopularFood({ 41 | required this.animationController, 42 | required this.product, 43 | required this.index, 44 | Key? key, 45 | }) : super(key: key); 46 | 47 | final AnimationController animationController; 48 | final ProductDetails product; 49 | final int index; 50 | 51 | @override 52 | Widget build(BuildContext context) { 53 | final responsive = Responsive.of(context); 54 | 55 | final _animationSlide = Tween(begin: 200.0, end: 0.0).animate( 56 | CurvedAnimation( 57 | parent: animationController, 58 | curve: Interval( 59 | 0.59 + (0.05 * index), 60 | 1.0, 61 | curve: Curves.decelerate, 62 | ), 63 | ), 64 | ); 65 | final _animationRotate = Tween(begin: math.pi, end: 0.0).animate( 66 | CurvedAnimation( 67 | parent: animationController, 68 | curve: Interval( 69 | 0.59 + (0.1 * index), 70 | 1.0, 71 | curve: Curves.decelerate, 72 | ), 73 | ), 74 | ); 75 | 76 | return GestureDetector( 77 | onTap: () => Navigator.of(context).push( 78 | PageRouteBuilder( 79 | transitionDuration: const Duration(milliseconds: 750), 80 | reverseTransitionDuration: const Duration(milliseconds: 750), 81 | transitionsBuilder: (_, animation, __, child) => FadeTransition( 82 | opacity: animation, 83 | child: child, 84 | ), 85 | pageBuilder: (_, __, ___) => DetailScreen( 86 | product: product, 87 | ), 88 | ), 89 | ), 90 | child: Stack( 91 | children: [ 92 | Container( 93 | height: responsive.heightPercent(22), 94 | padding: const EdgeInsets.only( 95 | right: 20.0, 96 | bottom: 5.0, 97 | top: 5.0, 98 | ), 99 | child: _CardPopularProduct( 100 | product: product, 101 | index: index, 102 | animationController: animationController, 103 | ), 104 | ), 105 | Positioned( 106 | right: 0, 107 | top: responsive.heightPercent(1.5), 108 | bottom: responsive.heightPercent(2.5), 109 | child: Hero( 110 | tag: product.image, 111 | flightShuttleBuilder: ( 112 | flightContext, 113 | animation, 114 | flightDirection, 115 | fromHeroContext, 116 | toHeroContext, 117 | ) { 118 | final toHero = toHeroContext.widget; 119 | return RotationTransition( 120 | turns: animation, 121 | child: toHero, 122 | ); 123 | }, 124 | child: Transform.translate( 125 | offset: Offset(_animationSlide.value, 0.0), 126 | child: Transform.rotate( 127 | angle: _animationRotate.value, 128 | child: Image.asset('${product.image}'), 129 | ), 130 | ), 131 | ), 132 | ), 133 | ], 134 | ), 135 | ); 136 | } 137 | } 138 | 139 | class _CardPopularProduct extends StatelessWidget { 140 | const _CardPopularProduct({ 141 | Key? key, 142 | required this.product, 143 | required this.index, 144 | required AnimationController animationController, 145 | }) : _animationController = animationController, 146 | super(key: key); 147 | 148 | final int index; 149 | final ProductDetails product; 150 | final AnimationController _animationController; 151 | 152 | @override 153 | Widget build(BuildContext context) { 154 | final _animationCardPopularFood = CurvedAnimation( 155 | parent: _animationController, 156 | curve: Interval( 157 | 0.50 + (0.05 * index), 158 | 1.0, 159 | curve: Curves.elasticOut, 160 | ), 161 | ); 162 | final _animationCrown = CurvedAnimation( 163 | parent: _animationController, 164 | curve: Interval( 165 | 0.57 + (0.05 * index), 166 | .85, 167 | curve: Curves.elasticOut, 168 | ), 169 | ); 170 | 171 | return Transform.scale( 172 | scale: _animationCardPopularFood.value, 173 | child: Hero( 174 | tag: product.productName, 175 | child: Material( 176 | color: kWhite, 177 | child: Container( 178 | decoration: BoxDecoration( 179 | color: kWhite, 180 | borderRadius: BorderRadius.circular(20.0), 181 | boxShadow: [ 182 | const BoxShadow( 183 | color: kMiddleBlack, 184 | blurRadius: 10.0, 185 | offset: Offset(10, 5), 186 | ), 187 | ], 188 | ), 189 | child: Column( 190 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 191 | children: [ 192 | _ProductInformation( 193 | product: product, 194 | index: index, 195 | animationCrown: _animationCrown, 196 | ), 197 | _BottomCard( 198 | product: product, 199 | animationCrown: _animationCrown, 200 | ) 201 | ], 202 | ), 203 | ), 204 | ), 205 | ), 206 | ); 207 | } 208 | } 209 | 210 | class _ProductInformation extends StatelessWidget { 211 | const _ProductInformation({ 212 | Key? key, 213 | required this.product, 214 | required this.index, 215 | required Animation animationCrown, 216 | }) : _animationCrown = animationCrown, 217 | super(key: key); 218 | 219 | final ProductDetails product; 220 | final int index; 221 | final Animation _animationCrown; 222 | 223 | @override 224 | Widget build(BuildContext context) { 225 | final responsive = Responsive.of(context); 226 | 227 | return Padding( 228 | padding: EdgeInsets.only( 229 | top: responsive.heightPercent(1.5), 230 | left: responsive.heightPercent(1.5), 231 | ), 232 | child: Column( 233 | crossAxisAlignment: CrossAxisAlignment.start, 234 | children: [ 235 | Row( 236 | crossAxisAlignment: CrossAxisAlignment.center, 237 | children: [ 238 | Transform.scale( 239 | scale: _animationCrown.value, 240 | child: const FaIcon( 241 | FontAwesomeIcons.crown, 242 | size: 10, 243 | color: kYellowCrown, 244 | ), 245 | ), 246 | const SizedBox(width: 5), 247 | Text( 248 | '${product.top}', 249 | style: kTopPopularCard, 250 | ), 251 | ], 252 | ), 253 | SizedBox(height: responsive.heightPercent(3)), 254 | Column( 255 | mainAxisSize: MainAxisSize.min, 256 | crossAxisAlignment: CrossAxisAlignment.start, 257 | children: [ 258 | Container( 259 | height: responsive.heightPercent(3), 260 | child: AutoSizeText( 261 | '${product.productName}', 262 | style: kHeaderPopularCard, 263 | maxLines: 1, 264 | ), 265 | ), 266 | SizedBox(height: responsive.heightPercent(.5)), 267 | Container( 268 | height: responsive.heightPercent(2.5), 269 | child: AutoSizeText( 270 | '${product.weight}', 271 | style: kSubHeaderPopularCard, 272 | maxLines: 1, 273 | ), 274 | ), 275 | ], 276 | ), 277 | ], 278 | ), 279 | ); 280 | } 281 | } 282 | 283 | class _BottomCard extends StatelessWidget { 284 | const _BottomCard({ 285 | Key? key, 286 | required Animation animationCrown, 287 | required this.product, 288 | }) : _animationCrown = animationCrown, 289 | super(key: key); 290 | 291 | final Animation _animationCrown; 292 | final ProductDetails product; 293 | 294 | @override 295 | Widget build(BuildContext context) { 296 | final responsive = Responsive.of(context); 297 | 298 | return Row( 299 | children: [ 300 | Container( 301 | height: responsive.heightPercent(6), 302 | width: responsive.widthPercent(25), 303 | decoration: const BoxDecoration( 304 | borderRadius: BorderRadius.only( 305 | topRight: Radius.circular(20), 306 | bottomLeft: Radius.circular(20), 307 | ), 308 | color: kYellow, 309 | ), 310 | child: Center( 311 | child: Transform.scale( 312 | scale: _animationCrown.value, 313 | child: const FaIcon( 314 | FontAwesomeIcons.plus, 315 | size: 12, 316 | ), 317 | ), 318 | ), 319 | ), 320 | const SizedBox(width: 20.0), 321 | Row( 322 | crossAxisAlignment: CrossAxisAlignment.center, 323 | children: [ 324 | const FaIcon( 325 | FontAwesomeIcons.solidStar, 326 | size: 10, 327 | ), 328 | const SizedBox(width: 5), 329 | Container( 330 | height: responsive.heightPercent(3), 331 | child: Center( 332 | child: AutoSizeText( 333 | '${product.stars}', 334 | style: kPuntuationPopularCard, 335 | maxLines: 1, 336 | ), 337 | ), 338 | ), 339 | ], 340 | ) 341 | ], 342 | ); 343 | } 344 | } 345 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/main_screen/main_header.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:auto_size_text/auto_size_text.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_samples/delivery_app/core/colors.dart'; 6 | import 'package:flutter_samples/utils/responsive.dart'; 7 | 8 | import '../../core/text_styles.dart'; 9 | 10 | class MainHeader extends StatelessWidget { 11 | const MainHeader({ 12 | Key? key, 13 | required Animation animationMenuAndText, 14 | }) : _animationMenuAndText = animationMenuAndText, 15 | super(key: key); 16 | 17 | final Animation _animationMenuAndText; 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | final responsive = Responsive.of(context); 22 | 23 | return Container( 24 | margin: const EdgeInsets.symmetric(horizontal: 25), 25 | child: Column( 26 | crossAxisAlignment: CrossAxisAlignment.start, 27 | children: [ 28 | Column( 29 | crossAxisAlignment: CrossAxisAlignment.start, 30 | children: [ 31 | Container( 32 | height: responsive.heightPercent(3), 33 | child: Transform.scale( 34 | scale: _animationMenuAndText.value, 35 | child: const AutoSizeText( 36 | 'Food', 37 | style: kSubHeader, 38 | maxLines: 1, 39 | ), 40 | ), 41 | ), 42 | Container( 43 | width: responsive.widthPercent(50), 44 | height: responsive.heightPercent(8), 45 | child: Transform.scale( 46 | scale: _animationMenuAndText.value, 47 | child: const AutoSizeText( 48 | 'Delivery', 49 | style: kHeader, 50 | maxLines: 1, 51 | ), 52 | ), 53 | ), 54 | ], 55 | ), 56 | Transform.scale( 57 | scale: _animationMenuAndText.value, 58 | child: const TextField( 59 | decoration: InputDecoration( 60 | hintText: 'Search...', 61 | hintStyle: TextStyle(color: kLightBlack), 62 | icon: Icon( 63 | Icons.search, 64 | size: 25, 65 | ), 66 | ), 67 | ), 68 | ), 69 | ], 70 | ), 71 | ); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /lib/delivery_app/widgets/main_screen/section_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../core/text_styles.dart'; 4 | 5 | class SectionText extends StatelessWidget { 6 | const SectionText({ 7 | required this.text, 8 | Key? key, 9 | }) : super(key: key); 10 | 11 | final String text; 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return Padding( 16 | padding: const EdgeInsets.symmetric(horizontal: 30.0), 17 | child: Text('$text', style: kSection), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/facebook_ui/data/collections.dart: -------------------------------------------------------------------------------- 1 | class Collection { 2 | Collection({ 3 | required this.collectionImage, 4 | required this.collectionName, 5 | }); 6 | 7 | final String collectionImage; 8 | final String collectionName; 9 | } 10 | 11 | List collections = List.of({ 12 | Collection( 13 | collectionImage: 'assets/common/images/profile_image.jpg', 14 | collectionName: 'Colección', 15 | ), 16 | Collection( 17 | collectionImage: 'assets/facebook_ui/images/profile/coverage.jpeg', 18 | collectionName: 'Colección', 19 | ), 20 | Collection( 21 | collectionImage: 'assets/facebook_ui/images/collections/1.jpg', 22 | collectionName: 'Colección', 23 | ), 24 | Collection( 25 | collectionImage: 'assets/facebook_ui/images/collections/2.jpg', 26 | collectionName: 'Colección', 27 | ), 28 | Collection( 29 | collectionImage: 'assets/facebook_ui/images/collections/3.jpg', 30 | collectionName: 'Colección', 31 | ), 32 | Collection( 33 | collectionImage: 'assets/facebook_ui/images/collections/4.jpg', 34 | collectionName: 'Colección', 35 | ), 36 | Collection( 37 | collectionImage: 'assets/facebook_ui/images/collections/5.jpg', 38 | collectionName: 'Colección', 39 | ), 40 | }); 41 | -------------------------------------------------------------------------------- /lib/facebook_ui/data/friends.dart: -------------------------------------------------------------------------------- 1 | class Friend { 2 | Friend({ 3 | required this.friendImage, 4 | required this.friendName, 5 | }); 6 | 7 | final String friendImage; 8 | final String friendName; 9 | } 10 | 11 | List friends = List.of({ 12 | Friend( 13 | friendImage: 'assets/facebook_ui/images/people/wilber_garcia.png', 14 | friendName: 'Wilber Garcia', 15 | ), 16 | Friend( 17 | friendImage: 'assets/facebook_ui/images/people/michael_gais.png', 18 | friendName: 'Michael Gais', 19 | ), 20 | Friend( 21 | friendImage: 'assets/facebook_ui/images/people/daniela_fernandez.png', 22 | friendName: 'Daniela Fernández', 23 | ), 24 | Friend( 25 | friendImage: 'assets/facebook_ui/images/people/sarai_perez.png', 26 | friendName: 'Saraí Pérez', 27 | ), 28 | Friend( 29 | friendImage: 'assets/facebook_ui/images/people/samanta_smith.jpeg', 30 | friendName: 'Samanta Smith', 31 | ), 32 | Friend( 33 | friendImage: 'assets/facebook_ui/images/people/marcus_dail.jpeg', 34 | friendName: 'Marcus', 35 | ), 36 | Friend( 37 | friendImage: 'assets/facebook_ui/images/people/kate_rob.jpeg', 38 | friendName: 'Kate Rob', 39 | ), 40 | }); 41 | -------------------------------------------------------------------------------- /lib/facebook_ui/data/local_providers.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class BottomBarState with ChangeNotifier { 4 | bool _showBottomBar = true; 5 | 6 | bool get showBottomBar => _showBottomBar; 7 | 8 | set showBottomBar(bool hideMenu) { 9 | _showBottomBar = hideMenu; 10 | notifyListeners(); 11 | } 12 | } 13 | 14 | class ScreensState with ChangeNotifier { 15 | final _pageController = PageController(); 16 | int _page = 0; 17 | 18 | int get page => _page; 19 | PageController get pageController => _pageController; 20 | 21 | set page(int page) { 22 | _page = page; 23 | if (_page <= 1) { 24 | _pageController.animateToPage( 25 | _page, 26 | duration: const Duration(milliseconds: 350), 27 | curve: Curves.easeIn, 28 | ); 29 | } 30 | notifyListeners(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/facebook_ui/data/post.dart: -------------------------------------------------------------------------------- 1 | class Post { 2 | Post({ 3 | required this.userProfileIcon, 4 | required this.userName, 5 | required this.timePost, 6 | required this.descriptionPost, 7 | required this.postImage, 8 | required this.comments, 9 | required this.shared, 10 | required this.reactions, 11 | required this.principalUserReaction, 12 | required this.comment, 13 | }); 14 | 15 | final String userProfileIcon; 16 | final String userName; 17 | final String timePost; 18 | final String descriptionPost; 19 | final String postImage; 20 | final int comments; 21 | final int shared; 22 | final int reactions; 23 | final String principalUserReaction; 24 | final Comment comment; 25 | } 26 | 27 | class Comment { 28 | Comment({ 29 | required this.userProfileIcon, 30 | required this.userName, 31 | required this.comment, 32 | }); 33 | 34 | final String userProfileIcon; 35 | final String userName; 36 | final String comment; 37 | } 38 | 39 | List posts = List.of({ 40 | Post( 41 | userProfileIcon: 42 | 'assets/facebook_ui/images/people/daniela_fernandez(2).png', 43 | userName: 'Daniela Fernández Ramos', 44 | timePost: 'Hace 3 días', 45 | descriptionPost: 'Me encanto la sesión de fotos que me hizo mi amigo 😍🥺 ', 46 | postImage: 'assets/facebook_ui/images/people/daniela_fernandez.png', 47 | comments: 30, 48 | shared: 5, 49 | reactions: 50, 50 | principalUserReaction: 'Mao Lop', 51 | comment: Comment( 52 | userProfileIcon: 'assets/facebook_ui/images/people/michael_bruno.png', 53 | userName: 'Michael Bruno', 54 | comment: 'Esta foto está muy cool, deberías ser modelo', 55 | ), 56 | ), 57 | Post( 58 | userProfileIcon: 'assets/facebook_ui/images/people/samanta_smith.jpeg', 59 | userName: 'Samanta Smith', 60 | timePost: 'Hace 2 días', 61 | descriptionPost: 'I love this photo 😍', 62 | postImage: 'assets/facebook_ui/images/people/samanta_smith.jpeg', 63 | comments: 50, 64 | shared: 20, 65 | reactions: 66, 66 | principalUserReaction: 'Jhonny', 67 | comment: Comment( 68 | userProfileIcon: 'assets/facebook_ui/images/people/michael_bruno.png', 69 | userName: 'Michael Bruno', 70 | comment: '📸 📸 📸', 71 | ), 72 | ), 73 | Post( 74 | userProfileIcon: 'assets/facebook_ui/images/people/cloe_thompson.jpeg', 75 | userName: 'Cloe Thompson', 76 | timePost: 'Hace 1 día', 77 | descriptionPost: 'Relax... 🍃 🍂', 78 | postImage: 'assets/facebook_ui/images/people/cloe_thompson.jpeg', 79 | comments: 53, 80 | shared: 2, 81 | reactions: 53, 82 | principalUserReaction: 'Cloe', 83 | comment: Comment( 84 | userProfileIcon: 'assets/facebook_ui/images/people/michael_bruno.png', 85 | userName: 'Michael Bruno', 86 | comment: '✨ ✨ ✨', 87 | ), 88 | ), 89 | Post( 90 | userProfileIcon: 'assets/facebook_ui/images/people/james_paul.jpeg', 91 | userName: 'James Paul', 92 | timePost: 'Hace 2 días', 93 | descriptionPost: 'Work hard! 💪 🤙', 94 | postImage: 'assets/facebook_ui/images/people/james_paul.jpeg', 95 | comments: 32, 96 | shared: 1, 97 | reactions: 57, 98 | principalUserReaction: 'Mónica', 99 | comment: Comment( 100 | userProfileIcon: 'assets/facebook_ui/images/people/michael_bruno.png', 101 | userName: 'Michael Bruno', 102 | comment: 'Ohh! Yess! 😎 😎 ', 103 | ), 104 | ), 105 | Post( 106 | userProfileIcon: 'assets/facebook_ui/images/people/marcus_dail.jpeg', 107 | userName: 'Marcus Dail', 108 | timePost: 'Hace 4 días', 109 | descriptionPost: 'Just do it!!... 😎', 110 | postImage: 'assets/facebook_ui/images/people/marcus_dail.jpeg', 111 | comments: 55, 112 | shared: 12, 113 | reactions: 64, 114 | principalUserReaction: 'Daniela', 115 | comment: Comment( 116 | userProfileIcon: 'assets/facebook_ui/images/people/michael_bruno.png', 117 | userName: 'Michael Bruno', 118 | comment: '🔥 🔥 🔥 🔥', 119 | ), 120 | ), 121 | Post( 122 | userProfileIcon: 'assets/facebook_ui/images/people/kate_rob.jpeg', 123 | userName: 'Kate Rob', 124 | timePost: 'Hace 3 días', 125 | descriptionPost: 'Nueva sesión... 😍 👀', 126 | postImage: 'assets/facebook_ui/images/people/kate_rob.jpeg', 127 | comments: 70, 128 | shared: 18, 129 | reactions: 84, 130 | principalUserReaction: 'Marcus', 131 | comment: Comment( 132 | userProfileIcon: 'assets/facebook_ui/images/people/kate_rob.jpeg', 133 | userName: 'Michael Bruno', 134 | comment: '🙌 🎉 🎉', 135 | ), 136 | ), 137 | }); 138 | -------------------------------------------------------------------------------- /lib/facebook_ui/data/storie.dart: -------------------------------------------------------------------------------- 1 | class Storie { 2 | const Storie({ 3 | required this.previewStory, 4 | required this.userImage, 5 | required this.userName, 6 | }); 7 | 8 | final String previewStory; 9 | final String userImage; 10 | final String userName; 11 | } 12 | 13 | List stories = List.of({ 14 | const Storie( 15 | previewStory: 'assets/common/images/profile_image.jpg', 16 | userImage: 'none', 17 | userName: 'Crear historia', 18 | ), 19 | const Storie( 20 | previewStory: 'assets/facebook_ui/images/people/mao_lop.png', 21 | userImage: 'assets/facebook_ui/images/people/mao_lop.png', 22 | userName: 'Mao', 23 | ), 24 | const Storie( 25 | previewStory: 'assets/facebook_ui/images/stories/fernanda_preview.png', 26 | userImage: 'assets/facebook_ui/images/people/fernanda.png', 27 | userName: 'Fernanda', 28 | ), 29 | const Storie( 30 | previewStory: 'assets/facebook_ui/images/stories/james_preview.png', 31 | userImage: 'assets/facebook_ui/images/people/james.png', 32 | userName: 'James', 33 | ), 34 | const Storie( 35 | previewStory: 'assets/facebook_ui/images/stories/samanta_preview.png', 36 | userImage: 'assets/facebook_ui/images/people/samanta_smith.jpeg', 37 | userName: 'Samanta', 38 | ), 39 | const Storie( 40 | previewStory: 'assets/facebook_ui/images/stories/marcus_preview.png', 41 | userImage: 'assets/facebook_ui/images/people/marcus_dail.jpeg', 42 | userName: 'Marcus', 43 | ), 44 | const Storie( 45 | previewStory: 'assets/facebook_ui/images/stories/cloe_preview.png', 46 | userImage: 'assets/facebook_ui/images/people/cloe_thompson.jpeg', 47 | userName: 'Cloe', 48 | ), 49 | }); 50 | -------------------------------------------------------------------------------- /lib/facebook_ui/screens/home_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/rendering.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | import '../../utils/responsive.dart'; 6 | import '../data/local_providers.dart'; 7 | import '../data/post.dart'; 8 | import '../widgets/header_app.dart'; 9 | import '../widgets/home_screen/posts.dart'; 10 | import '../widgets/home_screen/stories.dart'; 11 | 12 | class HomeScreen extends StatefulWidget { 13 | const HomeScreen({Key? key}) : super(key: key); 14 | 15 | @override 16 | _HomeScreenState createState() => _HomeScreenState(); 17 | } 18 | 19 | class _HomeScreenState extends State { 20 | final _scrollController = ScrollController(); 21 | late bool _showBottomBar; 22 | 23 | void _showBottomBarByScroll(BuildContext context) { 24 | final bottomBarState = Provider.of(context, listen: false); 25 | 26 | _showBottomBar = bottomBarState.showBottomBar; 27 | 28 | if (_scrollController.position.userScrollDirection == 29 | ScrollDirection.reverse && 30 | _showBottomBar) { 31 | bottomBarState.showBottomBar = false; 32 | } else if (_scrollController.position.userScrollDirection == 33 | ScrollDirection.forward && 34 | !_showBottomBar) { 35 | bottomBarState.showBottomBar = true; 36 | } 37 | } 38 | 39 | @override 40 | void dispose() { 41 | _scrollController.dispose(); 42 | super.dispose(); 43 | } 44 | 45 | @override 46 | Widget build(BuildContext context) { 47 | final responsive = Responsive.of(context); 48 | return Scaffold( 49 | resizeToAvoidBottomInset: false, 50 | body: Stack( 51 | children: [ 52 | NotificationListener( 53 | onNotification: (notification) { 54 | _showBottomBarByScroll(context); 55 | return true; 56 | }, 57 | child: CustomScrollView( 58 | physics: const BouncingScrollPhysics(), 59 | controller: _scrollController, 60 | slivers: [ 61 | SliverPersistentHeader( 62 | pinned: true, 63 | floating: true, 64 | delegate: CustomSliverHeader( 65 | maxHeight: responsive.heightPercent(25), 66 | minHeight: responsive.heightPercent(11), 67 | child: const HeaderApp(), 68 | ), 69 | ), 70 | const SliverToBoxAdapter(child: Stories()), 71 | SliverList( 72 | delegate: SliverChildBuilderDelegate( 73 | (_, index) => PostWidget(post: posts[index]), 74 | childCount: posts.length, 75 | ), 76 | ), 77 | ], 78 | ), 79 | ), 80 | ], 81 | ), 82 | ); 83 | } 84 | } 85 | 86 | class CustomSliverHeader extends SliverPersistentHeaderDelegate { 87 | CustomSliverHeader({ 88 | required this.maxHeight, 89 | required this.minHeight, 90 | required this.child, 91 | }) : assert(maxHeight > minHeight); 92 | 93 | final double maxHeight; 94 | final double minHeight; 95 | final Widget child; 96 | 97 | @override 98 | Widget build(context, double shrinkOffset, bool overlapsContent) => 99 | SizedBox.expand(child: child); 100 | 101 | @override 102 | double get maxExtent => maxHeight; 103 | 104 | @override 105 | double get minExtent => minHeight; 106 | 107 | @override 108 | bool shouldRebuild(covariant CustomSliverHeader oldDelegate) => 109 | maxHeight != oldDelegate.maxHeight || 110 | minHeight != oldDelegate.minHeight || 111 | child != oldDelegate.child; 112 | } 113 | -------------------------------------------------------------------------------- /lib/facebook_ui/screens/screen_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:provider/provider.dart'; 3 | 4 | import '../data/local_providers.dart'; 5 | import '../theme/theme_state.dart'; 6 | import '../widgets/navigation_bar.dart'; 7 | import './home_screen.dart'; 8 | import './settings_screen.dart'; 9 | 10 | class ScreenController extends StatelessWidget { 11 | const ScreenController({Key? key}) : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | final bottomBarState = Provider.of(context); 16 | final screensState = Provider.of(context); 17 | final themeState = Provider.of(context); 18 | 19 | return MaterialApp( 20 | debugShowCheckedModeBanner: false, 21 | title: 'Facebook UI', 22 | theme: themeState.currentTheme, 23 | home: Scaffold( 24 | body: Stack( 25 | children: [ 26 | PageView( 27 | controller: screensState.pageController, 28 | physics: const NeverScrollableScrollPhysics(), 29 | children: [ 30 | const HomeScreen(), 31 | const SettingsScreen(), 32 | ], 33 | ), 34 | NavigationBar( 35 | showBar: bottomBarState.showBottomBar, 36 | selectedIndex: screensState.page, 37 | ), 38 | ], 39 | ), 40 | ), 41 | ); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /lib/facebook_ui/theme/theme_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | 4 | class ThemeState with ChangeNotifier { 5 | ThemeData _currentTheme = lightMode; 6 | bool _darkTheme = false; 7 | 8 | ThemeData get currentTheme => _currentTheme; 9 | bool get isDarkTheme => _darkTheme; 10 | set isDarkTheme(bool value) { 11 | _darkTheme = value; 12 | 13 | if (value) { 14 | _currentTheme = darkMode; 15 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light); 16 | } else { 17 | _currentTheme = lightMode; 18 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark); 19 | } 20 | notifyListeners(); 21 | } 22 | } 23 | 24 | final ThemeData darkMode = ThemeData( 25 | scaffoldBackgroundColor: const Color(0xff070c20), 26 | backgroundColor: const Color(0xff272d3a), 27 | buttonColor: const Color(0xff2f3643), 28 | accentColor: const Color(0xffffffff), 29 | iconTheme: const IconThemeData(color: Color(0xff515765)), 30 | dividerColor: const Color(0xff2d3340), 31 | cardColor: const Color(0xff2e3441), 32 | ); 33 | 34 | final ThemeData lightMode = ThemeData( 35 | scaffoldBackgroundColor: const Color(0xfff4f6f8), 36 | backgroundColor: const Color(0xffffffff), 37 | buttonColor: const Color(0xfff9fafb), 38 | accentColor: const Color(0xff364987), 39 | iconTheme: const IconThemeData(color: Color(0xffd5dcef)), 40 | dividerColor: const Color(0xfff8f8f8), 41 | cardColor: const Color(0xffffffff), 42 | ); 43 | -------------------------------------------------------------------------------- /lib/facebook_ui/widgets/avatar_icon.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AvatarIcon extends StatelessWidget { 4 | const AvatarIcon({ 5 | Key? key, 6 | required this.profileImage, 7 | required this.child, 8 | required this.height, 9 | required this.width, 10 | this.marginColor = const Color(0xfff4f6f8), 11 | this.marginWidth = 2, 12 | }) : super(key: key); 13 | 14 | final double height; 15 | final double width; 16 | final double marginWidth; 17 | final Color marginColor; 18 | final String profileImage; 19 | final Widget child; 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return Container( 24 | height: height, 25 | width: width, 26 | decoration: BoxDecoration( 27 | shape: BoxShape.circle, 28 | image: DecorationImage( 29 | image: AssetImage(profileImage), 30 | ), 31 | border: Border.all( 32 | color: marginColor, 33 | width: marginWidth, 34 | ), 35 | ), 36 | child: child, 37 | ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/facebook_ui/widgets/circle_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../utils/responsive.dart'; 4 | 5 | class CircleButton extends StatelessWidget { 6 | CircleButton({ 7 | Key? key, 8 | required this.callback, 9 | required this.icon, 10 | required this.backgroundColor, 11 | this.height = 0.0, 12 | this.width = 0.0, 13 | }) : super(key: key); 14 | 15 | final VoidCallback callback; 16 | final Widget icon; 17 | final Color backgroundColor; 18 | final double height; 19 | final double width; 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | final responsive = Responsive.of(context); 24 | final heightResponfive = 25 | (height == 0.0) ? responsive.heightPercent(4.5) : height; 26 | final widthResponfive = 27 | (width == 0.0) ? responsive.heightPercent(4.5) : width; 28 | return ClipOval( 29 | child: Container( 30 | height: heightResponfive, 31 | width: widthResponfive, 32 | decoration: BoxDecoration( 33 | shape: BoxShape.circle, 34 | color: backgroundColor, 35 | ), 36 | child: Material( 37 | color: Colors.transparent, 38 | child: InkWell( 39 | onTap: callback, 40 | child: Center(child: icon), 41 | ), 42 | ), 43 | ), 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/facebook_ui/widgets/header_app.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_samples/facebook_ui/screens/profile_screen.dart'; 3 | import 'package:flutter_svg/svg.dart'; 4 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 5 | import 'package:provider/provider.dart'; 6 | 7 | import '../../utils/responsive.dart'; 8 | import '../theme/theme_state.dart'; 9 | import '../widgets/avatar_icon.dart'; 10 | import '../widgets/circle_button.dart'; 11 | import '../widgets/large_button.dart'; 12 | 13 | class HeaderApp extends StatelessWidget { 14 | const HeaderApp({ 15 | Key? key, 16 | }) : super(key: key); 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | final responsive = Responsive.of(context); 21 | const profileImage = 'assets/common/images/profile_image.jpg'; 22 | 23 | return Container( 24 | height: responsive.heightPercent(25), 25 | padding: const EdgeInsets.symmetric(horizontal: 15), 26 | decoration: BoxDecoration( 27 | color: Theme.of(context).backgroundColor, 28 | borderRadius: const BorderRadius.vertical( 29 | bottom: Radius.circular(20), 30 | ), 31 | ), 32 | child: SafeArea( 33 | bottom: false, 34 | child: Stack( 35 | children: [ 36 | Positioned( 37 | right: 0, 38 | left: 0, 39 | bottom: responsive.widthPercent(4.5), 40 | child: Column( 41 | children: [ 42 | const Divider(thickness: 2), 43 | SizedBox(height: responsive.widthPercent(1)), 44 | const _PostBar(profileImage: profileImage), 45 | SizedBox(height: responsive.heightPercent(2.5)), 46 | const PostActions(), 47 | ], 48 | ), 49 | ), 50 | Container( 51 | color: Theme.of(context).backgroundColor, 52 | child: const _FacebookAppBar(profileImage: profileImage), 53 | ), 54 | ], 55 | ), 56 | ), 57 | ); 58 | } 59 | } 60 | 61 | class _FacebookAppBar extends StatelessWidget { 62 | const _FacebookAppBar({ 63 | Key? key, 64 | required this.profileImage, 65 | }) : super(key: key); 66 | 67 | final String profileImage; 68 | 69 | @override 70 | Widget build(BuildContext context) { 71 | final responsive = Responsive.of(context); 72 | final themeState = Provider.of(context); 73 | final accentColor = Theme.of(context).accentColor; 74 | 75 | const searchIcon = 'assets/facebook_ui/icons/search_icon.svg'; 76 | 77 | return Padding( 78 | padding: EdgeInsets.only(top: responsive.heightPercent(1)), 79 | child: Row( 80 | crossAxisAlignment: CrossAxisAlignment.center, 81 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 82 | children: [ 83 | CircleButton( 84 | callback: () => debugPrint('Facebook'), 85 | icon: FittedBox( 86 | fit: BoxFit.none, 87 | child: FaIcon( 88 | FontAwesomeIcons.facebook, 89 | size: responsive.widthPercent(8.5), 90 | color: const Color(0xff3284f5), 91 | textDirection: TextDirection.ltr, 92 | ), 93 | ), 94 | backgroundColor: Colors.white, 95 | height: responsive.widthPercent(8), 96 | width: responsive.widthPercent(8), 97 | ), 98 | Container( 99 | width: responsive.widthPercent(48), 100 | child: Row( 101 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 102 | crossAxisAlignment: CrossAxisAlignment.center, 103 | children: [ 104 | CircleButton( 105 | callback: () => debugPrint('Search'), 106 | icon: SvgPicture.asset( 107 | searchIcon, 108 | color: accentColor, 109 | height: responsive.widthPercent(4), 110 | ), 111 | backgroundColor: Theme.of(context).buttonColor, 112 | height: responsive.widthPercent(8.5), 113 | width: responsive.widthPercent(8.5), 114 | ), 115 | Stack( 116 | children: [ 117 | CircleButton( 118 | callback: () => debugPrint('Bell'), 119 | icon: FaIcon( 120 | FontAwesomeIcons.solidBell, 121 | size: responsive.widthPercent(4.2), 122 | color: accentColor, 123 | ), 124 | backgroundColor: Theme.of(context).buttonColor, 125 | height: responsive.widthPercent(8.5), 126 | width: responsive.widthPercent(8.5), 127 | ), 128 | Positioned( 129 | right: 6, 130 | top: 4, 131 | child: Container( 132 | height: responsive.heightPercent(0.9), 133 | width: responsive.heightPercent(0.9), 134 | decoration: const BoxDecoration( 135 | color: Color(0xffee305e), 136 | shape: BoxShape.circle, 137 | ), 138 | ), 139 | ) 140 | ], 141 | ), 142 | CircleButton( 143 | callback: () => debugPrint('Messenger'), 144 | icon: FaIcon( 145 | FontAwesomeIcons.facebookMessenger, 146 | size: responsive.widthPercent(4.2), 147 | color: (themeState.isDarkTheme) 148 | ? accentColor 149 | : const Color(0xff3ca1f5), 150 | ), 151 | backgroundColor: Theme.of(context).buttonColor, 152 | height: responsive.widthPercent(8.5), 153 | width: responsive.widthPercent(8.5), 154 | ), 155 | const SizedBox(width: 1), 156 | ClipOval( 157 | child: Hero( 158 | tag: profileImage, 159 | child: AvatarIcon( 160 | profileImage: profileImage, 161 | marginColor: (themeState.isDarkTheme) 162 | ? Theme.of(context).accentColor 163 | : Colors.transparent, 164 | height: responsive.widthPercent(8.5), 165 | width: responsive.widthPercent(8.5), 166 | child: Material( 167 | color: Colors.transparent, 168 | child: InkWell( 169 | onTap: () => Navigator.of(context).push( 170 | MaterialPageRoute( 171 | builder: (_) => const ProfileScreen(), 172 | ), 173 | ), 174 | child: const SizedBox(), 175 | ), 176 | ), 177 | ), 178 | ), 179 | ), 180 | ], 181 | ), 182 | ), 183 | ], 184 | ), 185 | ); 186 | } 187 | } 188 | 189 | class _PostBar extends StatelessWidget { 190 | const _PostBar({ 191 | Key? key, 192 | required this.profileImage, 193 | }) : super(key: key); 194 | 195 | final String profileImage; 196 | 197 | @override 198 | Widget build(BuildContext context) { 199 | final themeState = Provider.of(context); 200 | final responsive = Responsive.of(context); 201 | const smileIcon = 'assets/facebook_ui/icons/smile_icon.png'; 202 | 203 | return Row( 204 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 205 | crossAxisAlignment: CrossAxisAlignment.start, 206 | children: [ 207 | AvatarIcon( 208 | profileImage: profileImage, 209 | height: responsive.widthPercent(6), 210 | width: responsive.widthPercent(6), 211 | marginWidth: 1.5, 212 | child: const SizedBox(), 213 | marginColor: (themeState.isDarkTheme) 214 | ? Theme.of(context).accentColor 215 | : Colors.transparent, 216 | ), 217 | SizedBox(width: responsive.widthPercent(2)), 218 | Container( 219 | width: responsive.widthPercent(70), 220 | height: responsive.widthPercent(6.5), 221 | child: TextField( 222 | decoration: InputDecoration( 223 | enabledBorder: InputBorder.none, 224 | border: InputBorder.none, 225 | hintText: '¿Qué estas pensado, Moisés?', 226 | hintStyle: TextStyle( 227 | fontSize: responsive.widthPercent(3.5), 228 | color: (themeState.isDarkTheme) 229 | ? Theme.of(context).accentColor 230 | : const Color(0xff9aa2bf), 231 | ), 232 | ), 233 | style: TextStyle( 234 | color: Theme.of(context).accentColor, 235 | fontSize: responsive.heightPercent(1.5), 236 | ), 237 | ), 238 | ), 239 | ClipOval( 240 | child: Container( 241 | height: responsive.widthPercent(5), 242 | width: responsive.widthPercent(5), 243 | decoration: const BoxDecoration( 244 | shape: BoxShape.circle, 245 | image: DecorationImage( 246 | image: AssetImage(smileIcon), 247 | ), 248 | ), 249 | child: Material( 250 | color: Colors.transparent, 251 | child: InkWell( 252 | onTap: () => debugPrint('Smile'), 253 | child: const Center(), 254 | ), 255 | ), 256 | ), 257 | ), 258 | ], 259 | ); 260 | } 261 | } 262 | 263 | class PostActions extends StatelessWidget { 264 | const PostActions({ 265 | Key? key, 266 | }) : super(key: key); 267 | 268 | @override 269 | Widget build(BuildContext context) { 270 | final responsive = Responsive.of(context); 271 | 272 | return Row( 273 | mainAxisAlignment: MainAxisAlignment.spaceAround, 274 | children: [ 275 | LargeButton( 276 | callback: () => debugPrint('Fotos'), 277 | text: 'Fotos', 278 | height: responsive.heightPercent(4), 279 | width: responsive.widthPercent(27), 280 | icon: const FaIcon( 281 | FontAwesomeIcons.camera, 282 | color: Color(0xff76c997), 283 | size: 14, 284 | ), 285 | fontSize: responsive.heightPercent(1), 286 | ), 287 | LargeButton( 288 | callback: () => debugPrint('En vivo'), 289 | text: 'En vivo', 290 | height: responsive.heightPercent(4), 291 | width: responsive.widthPercent(27), 292 | icon: Stack( 293 | children: [ 294 | const FaIcon( 295 | FontAwesomeIcons.video, 296 | color: Color(0xffee305e), 297 | size: 14, 298 | ), 299 | Positioned( 300 | left: 2, 301 | top: 3, 302 | child: Container( 303 | height: 3, 304 | width: 3, 305 | decoration: const BoxDecoration( 306 | color: Colors.white, 307 | shape: BoxShape.circle, 308 | ), 309 | ), 310 | ) 311 | ], 312 | ), 313 | fontSize: responsive.heightPercent(1), 314 | ), 315 | LargeButton( 316 | height: responsive.heightPercent(4), 317 | width: responsive.widthPercent(30), 318 | callback: () => debugPrint('Video corto'), 319 | text: 'Video corto', 320 | icon: const FaIcon( 321 | FontAwesomeIcons.eye, 322 | color: Color(0xff3284f5), 323 | size: 14, 324 | ), 325 | fontSize: responsive.heightPercent(1), 326 | ) 327 | ], 328 | ); 329 | } 330 | } 331 | -------------------------------------------------------------------------------- /lib/facebook_ui/widgets/home_screen/stories.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:dotted_border/dotted_border.dart'; 3 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 4 | import 'package:provider/provider.dart'; 5 | 6 | import '../../../utils/responsive.dart'; 7 | import '../../data/storie.dart'; 8 | import '../../theme/theme_state.dart'; 9 | 10 | class Stories extends StatelessWidget { 11 | const Stories({ 12 | Key? key, 13 | }) : super(key: key); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | final responsive = Responsive.of(context); 18 | 19 | return Container( 20 | height: responsive.widthPercent(31), 21 | decoration: const BoxDecoration( 22 | borderRadius: BorderRadius.vertical( 23 | bottom: Radius.circular(25), 24 | ), 25 | ), 26 | child: ListView.builder( 27 | itemCount: stories.length, 28 | padding: const EdgeInsets.symmetric(horizontal: 15), 29 | physics: const BouncingScrollPhysics(), 30 | scrollDirection: Axis.horizontal, 31 | itemBuilder: (_, index) { 32 | return StorieWidget(storie: stories[index]); 33 | }, 34 | ), 35 | ); 36 | } 37 | } 38 | 39 | class StorieWidget extends StatelessWidget { 40 | const StorieWidget({ 41 | Key? key, 42 | required this.storie, 43 | }) : super(key: key); 44 | 45 | final Storie storie; 46 | 47 | @override 48 | Widget build(BuildContext context) { 49 | final themeState = Provider.of(context); 50 | final responsive = Responsive.of(context); 51 | final previewStory = storie.previewStory; 52 | final userImage = storie.userImage; 53 | final userName = storie.userName; 54 | final dotPattern = 55 | (userImage == 'none') ? List.of([3.5]) : List.of([130.0]); 56 | 57 | return Container( 58 | width: responsive.widthPercent(20), 59 | margin: const EdgeInsets.symmetric(horizontal: 5), 60 | child: LayoutBuilder(builder: (_, constraints) { 61 | return Stack( 62 | children: [ 63 | LayoutBuilder( 64 | builder: (_, constraints) { 65 | return Row( 66 | mainAxisAlignment: MainAxisAlignment.center, 67 | children: [ 68 | Container( 69 | margin: EdgeInsets.only( 70 | top: responsive.heightPercent(1.5), 71 | ), 72 | height: (constraints.maxHeight > 115) 73 | ? constraints.maxHeight * .55 74 | : constraints.maxHeight * .63, 75 | width: constraints.maxWidth * .9, 76 | decoration: BoxDecoration( 77 | image: DecorationImage( 78 | image: AssetImage(previewStory), 79 | fit: BoxFit.cover, 80 | ), 81 | borderRadius: 82 | BorderRadius.circular(responsive.widthPercent(6.5)), 83 | ), 84 | child: Material( 85 | color: Colors.transparent, 86 | child: InkWell( 87 | borderRadius: BorderRadius.circular( 88 | responsive.widthPercent(6.5), 89 | ), 90 | onTap: () => debugPrint( 91 | '$userName', 92 | ), 93 | child: const SizedBox(), 94 | ), 95 | ), 96 | ), 97 | ], 98 | ); 99 | }, 100 | ), 101 | Positioned( 102 | right: 1, 103 | left: 1, 104 | // top: 1, 105 | bottom: (constraints.maxHeight > 115) 106 | ? constraints.maxWidth / 5 107 | : constraints.maxWidth / 50, 108 | child: Container( 109 | child: Column( 110 | mainAxisSize: MainAxisSize.min, 111 | children: [ 112 | DottedBorder( 113 | borderType: BorderType.RRect, 114 | radius: const Radius.circular(30), 115 | padding: const EdgeInsets.all(1), 116 | dashPattern: dotPattern, 117 | color: const Color(0xff3ca1f5), 118 | strokeWidth: 1.5, 119 | child: Container( 120 | height: responsive.widthPercent(6), 121 | width: responsive.widthPercent(6), 122 | decoration: const BoxDecoration( 123 | shape: BoxShape.circle, 124 | ), 125 | child: Center( 126 | child: CircleAvatar( 127 | backgroundColor: const Color(0xff3284f5), 128 | backgroundImage: (userImage == 'none') 129 | ? null 130 | : AssetImage(userImage), 131 | child: (userImage == 'none') 132 | ? const FaIcon( 133 | FontAwesomeIcons.plus, 134 | color: Colors.white, 135 | size: 7, 136 | ) 137 | : null, 138 | maxRadius: responsive.heightPercent(1), 139 | ), 140 | ), 141 | ), 142 | ), 143 | const SizedBox(height: 5), 144 | Text( 145 | userName, 146 | style: TextStyle( 147 | fontSize: responsive.widthPercent(2.7), 148 | fontWeight: FontWeight.w400, 149 | color: (themeState.isDarkTheme) 150 | ? const Color(0xffd4d5d8) 151 | : const Color(0xff747c96), 152 | ), 153 | textAlign: TextAlign.center, 154 | ) 155 | ], 156 | ), 157 | ), 158 | ) 159 | ], 160 | ); 161 | }), 162 | ); 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /lib/facebook_ui/widgets/large_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:auto_size_text/auto_size_text.dart'; 3 | 4 | class LargeButton extends StatelessWidget { 5 | const LargeButton({ 6 | Key? key, 7 | required this.text, 8 | required this.icon, 9 | required this.callback, 10 | required this.height, 11 | required this.width, 12 | required this.fontSize, 13 | }) : super(key: key); 14 | 15 | final String text; 16 | final Widget icon; 17 | final VoidCallback callback; 18 | final double height; 19 | final double width; 20 | final double fontSize; 21 | 22 | @override 23 | Widget build(BuildContext context) { 24 | return Container( 25 | height: height, 26 | width: width, 27 | child: TextButton( 28 | onPressed: callback, 29 | style: ButtonStyle( 30 | elevation: MaterialStateProperty.all(0.0), 31 | backgroundColor: 32 | MaterialStateProperty.all(Theme.of(context).buttonColor), 33 | overlayColor: 34 | MaterialStateProperty.all(ThemeData().splashColor), 35 | ), 36 | child: Row( 37 | mainAxisAlignment: MainAxisAlignment.center, 38 | crossAxisAlignment: CrossAxisAlignment.center, 39 | children: [ 40 | icon, 41 | const SizedBox(width: 10), 42 | AutoSizeText( 43 | text, 44 | style: TextStyle( 45 | color: Theme.of(context).accentColor, 46 | fontWeight: FontWeight.w500, 47 | fontSize: fontSize, 48 | ), 49 | ), 50 | ], 51 | ), 52 | ), 53 | ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /lib/facebook_ui/widgets/navigation_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_svg/svg.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | import '../../utils/responsive.dart'; 6 | import '../data/local_providers.dart'; 7 | import '../theme/theme_state.dart'; 8 | import '../widgets/circle_button.dart'; 9 | import './notification_icon.dart'; 10 | 11 | const _duration = Duration(milliseconds: 400); 12 | const double _bottomBarHide = -100.0; 13 | const double _bottomBarShow = 0.0; 14 | 15 | class NavigationBar extends StatelessWidget { 16 | const NavigationBar({ 17 | Key? key, 18 | this.showBar = true, 19 | required this.selectedIndex, 20 | }) : super(key: key); 21 | 22 | final bool showBar; 23 | final int selectedIndex; 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | final screensState = Provider.of(context); 28 | final themeState = Provider.of(context); 29 | final responsive = Responsive.of(context); 30 | 31 | return AnimatedPositioned( 32 | duration: _duration, 33 | bottom: showBar ? _bottomBarShow : _bottomBarHide, 34 | left: 0, 35 | right: 0, 36 | child: Container( 37 | height: responsive.heightPercent(8), 38 | decoration: BoxDecoration( 39 | color: (themeState.isDarkTheme) 40 | ? (selectedIndex == 1) 41 | ? Theme.of(context).backgroundColor 42 | : Theme.of(context).scaffoldBackgroundColor 43 | : Theme.of(context).backgroundColor, 44 | borderRadius: const BorderRadius.vertical( 45 | top: Radius.circular(25), 46 | ), 47 | ), 48 | child: Row( 49 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 50 | crossAxisAlignment: CrossAxisAlignment.center, 51 | children: [ 52 | CircleButton( 53 | callback: () => screensState.page = 0, 54 | icon: SvgPicture.asset( 55 | 'assets/facebook_ui/icons/home_icon.svg', 56 | color: (selectedIndex == 0) 57 | ? const Color(0xff3284f5) 58 | : Theme.of(context).iconTheme.color, 59 | height: responsive.heightPercent(2.5), 60 | ), 61 | backgroundColor: Colors.transparent, 62 | ), 63 | Stack( 64 | children: [ 65 | CircleButton( 66 | callback: () => screensState.page = 2, 67 | icon: SvgPicture.asset( 68 | 'assets/facebook_ui/icons/watch_icon.svg', 69 | color: (selectedIndex == 2) 70 | ? const Color(0xff3284f5) 71 | : Theme.of(context).iconTheme.color, 72 | height: responsive.heightPercent(2.5), 73 | ), 74 | backgroundColor: Colors.transparent, 75 | ), 76 | const Positioned( 77 | right: 2, 78 | top: 6, 79 | child: NotificationIcon(), 80 | ), 81 | ], 82 | ), 83 | Stack( 84 | children: [ 85 | CircleButton( 86 | callback: () => screensState.page = 3, 87 | icon: SvgPicture.asset( 88 | 'assets/facebook_ui/icons/shopping_icon.svg', 89 | color: (selectedIndex == 3) 90 | ? const Color(0xff3284f5) 91 | : Theme.of(context).iconTheme.color, 92 | height: responsive.heightPercent(2.5), 93 | ), 94 | backgroundColor: Colors.transparent, 95 | ), 96 | const Positioned( 97 | right: 2, 98 | top: 7, 99 | child: NotificationIcon(), 100 | ), 101 | ], 102 | ), 103 | CircleButton( 104 | callback: () => screensState.page = 4, 105 | icon: SvgPicture.asset( 106 | 'assets/facebook_ui/icons/friends_icon.svg', 107 | color: (selectedIndex == 4) 108 | ? const Color(0xff3284f5) 109 | : Theme.of(context).iconTheme.color, 110 | height: responsive.heightPercent(2.5), 111 | ), 112 | backgroundColor: Colors.transparent, 113 | ), 114 | CircleButton( 115 | callback: () => screensState.page = 1, 116 | icon: SvgPicture.asset( 117 | 'assets/facebook_ui/icons/menu_icon.svg', 118 | color: (selectedIndex == 1) 119 | ? const Color(0xff3284f5) 120 | : Theme.of(context).iconTheme.color, 121 | height: responsive.heightPercent(2.5), 122 | ), 123 | backgroundColor: Colors.transparent, 124 | ), 125 | ], 126 | ), 127 | ), 128 | ); 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /lib/facebook_ui/widgets/notification_icon.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../utils/responsive.dart'; 4 | 5 | class NotificationIcon extends StatelessWidget { 6 | const NotificationIcon({ 7 | Key? key, 8 | }) : super(key: key); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | final responsive = Responsive.of(context); 13 | 14 | return Container( 15 | height: responsive.heightPercent(1.3), 16 | width: responsive.heightPercent(1.3), 17 | decoration: const BoxDecoration( 18 | color: Colors.white, 19 | shape: BoxShape.circle, 20 | ), 21 | child: Center( 22 | child: Container( 23 | height: responsive.heightPercent(1), 24 | width: responsive.heightPercent(1), 25 | decoration: const BoxDecoration( 26 | color: Color(0xffee305e), 27 | shape: BoxShape.circle, 28 | ), 29 | ), 30 | ), 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/facebook_ui/widgets/reaction_icons.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 3 | 4 | class Reactions extends StatelessWidget { 5 | const Reactions({ 6 | Key? key, 7 | required this.principalCircleHight, 8 | required this.principalCircleWidth, 9 | required this.secondaryCircleHight, 10 | required this.secondaryCircleWidth, 11 | required this.iconSize, 12 | required this.rightSeparation, 13 | }) : super(key: key); 14 | 15 | final double principalCircleHight; 16 | final double principalCircleWidth; 17 | final double secondaryCircleHight; 18 | final double secondaryCircleWidth; 19 | final double iconSize; 20 | final double rightSeparation; 21 | 22 | @override 23 | Widget build(BuildContext context) { 24 | return Stack( 25 | children: [ 26 | Positioned( 27 | right: rightSeparation, 28 | child: Container( 29 | height: principalCircleHight, 30 | width: principalCircleWidth, 31 | decoration: const BoxDecoration( 32 | color: Colors.white, 33 | shape: BoxShape.circle, 34 | ), 35 | child: Center( 36 | child: Container( 37 | height: secondaryCircleHight, 38 | width: secondaryCircleWidth, 39 | decoration: const BoxDecoration( 40 | color: Color(0xff3284f5), 41 | shape: BoxShape.circle, 42 | ), 43 | child: Center( 44 | child: FaIcon( 45 | FontAwesomeIcons.solidThumbsUp, 46 | color: Colors.white, 47 | size: iconSize, 48 | ), 49 | ), 50 | ), 51 | ), 52 | ), 53 | ), 54 | Positioned( 55 | right: 0, 56 | child: Container( 57 | height: principalCircleHight, 58 | width: principalCircleWidth, 59 | decoration: const BoxDecoration( 60 | color: Colors.white, 61 | shape: BoxShape.circle, 62 | ), 63 | child: Center( 64 | child: Container( 65 | height: secondaryCircleHight, 66 | width: secondaryCircleWidth, 67 | decoration: const BoxDecoration( 68 | color: Color(0xffee305e), 69 | shape: BoxShape.circle, 70 | ), 71 | child: Center( 72 | child: FaIcon( 73 | FontAwesomeIcons.solidHeart, 74 | color: Colors.white, 75 | size: iconSize, 76 | ), 77 | ), 78 | ), 79 | ), 80 | ), 81 | ), 82 | ], 83 | ); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:provider/provider.dart'; 3 | import 'package:flutter/services.dart'; 4 | 5 | import 'delivery_app/data/category_state.dart'; 6 | import 'delivery_app/screens/main_screen_delivery_food.dart'; 7 | 8 | import 'facebook_ui/data/local_providers.dart'; 9 | import 'facebook_ui/screens/screen_controller.dart'; 10 | import 'facebook_ui/theme/theme_state.dart'; 11 | 12 | void main() { 13 | SystemChrome.setSystemUIOverlayStyle( 14 | const SystemUiOverlayStyle( 15 | statusBarColor: Colors.transparent, 16 | statusBarIconBrightness: Brightness.dark, 17 | ), 18 | ); 19 | runApp(MyApp()); 20 | } 21 | 22 | class MyApp extends StatelessWidget { 23 | @override 24 | Widget build(BuildContext context) { 25 | return MultiProvider( 26 | providers: [ 27 | ChangeNotifierProvider(create: (_) => CategoryState()), 28 | ChangeNotifierProvider(create: (_) => BottomBarState()), 29 | ChangeNotifierProvider(create: (_) => ScreensState()), 30 | ChangeNotifierProvider(create: (_) => ThemeState()), 31 | ], 32 | child: const MaterialApp( 33 | debugShowCheckedModeBanner: false, 34 | home: Scaffold( 35 | body: MainScreen(), 36 | ), 37 | ), 38 | ); 39 | } 40 | } 41 | 42 | class MainScreen extends StatelessWidget { 43 | const MainScreen({Key? key}) : super(key: key); 44 | 45 | @override 46 | Widget build(BuildContext context) { 47 | return Container( 48 | child: Scaffold( 49 | body: Center( 50 | child: Column( 51 | mainAxisAlignment: MainAxisAlignment.center, 52 | children: [ 53 | ElevatedButton( 54 | onPressed: () => Navigator.of(context).push( 55 | MaterialPageRoute( 56 | builder: (_) => const MainScreenDeliveryFood(), 57 | ), 58 | ), 59 | child: const Text('Delivery App'), 60 | ), 61 | ElevatedButton( 62 | onPressed: () => Navigator.of(context).push( 63 | MaterialPageRoute( 64 | builder: (_) => const ScreenController(), 65 | ), 66 | ), 67 | child: const Text('Facebook UI (Mao Lop)'), 68 | ), 69 | ], 70 | ), 71 | ), 72 | ), 73 | ); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /lib/utils/responsive.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math' as math; 2 | import 'package:flutter/widgets.dart'; 3 | 4 | class Responsive { 5 | const Responsive({ 6 | required this.width, 7 | required this.height, 8 | required this.inch, 9 | }); 10 | 11 | factory Responsive.of(BuildContext context) { 12 | final data = MediaQuery.of(context); 13 | final size = data.size; 14 | final inch = math.sqrt(math.pow(size.width, 2) + math.pow(size.height, 2)); 15 | 16 | return Responsive(height: size.height, width: size.width, inch: inch); 17 | } 18 | 19 | final double width, height, inch; 20 | 21 | double widthPercent(double percent) { 22 | return width * percent / 100; 23 | } 24 | 25 | double heightPercent(double percent) { 26 | return height * percent / 100; 27 | } 28 | 29 | double inchPercent(double percent) { 30 | return inch * percent / 100; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.5.0" 11 | auto_size_text: 12 | dependency: "direct main" 13 | description: 14 | name: auto_size_text 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "3.0.0-nullsafety.0" 18 | boolean_selector: 19 | dependency: transitive 20 | description: 21 | name: boolean_selector 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.1.0" 25 | characters: 26 | dependency: transitive 27 | description: 28 | name: characters 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.1.0" 32 | charcode: 33 | dependency: transitive 34 | description: 35 | name: charcode 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.2.0" 39 | clock: 40 | dependency: transitive 41 | description: 42 | name: clock 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.1.0" 46 | collection: 47 | dependency: transitive 48 | description: 49 | name: collection 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.15.0" 53 | cupertino_icons: 54 | dependency: "direct main" 55 | description: 56 | name: cupertino_icons 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.0.2" 60 | dotted_border: 61 | dependency: "direct main" 62 | description: 63 | name: dotted_border 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "2.0.0-nullsafety.0" 67 | fake_async: 68 | dependency: transitive 69 | description: 70 | name: fake_async 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "1.2.0" 74 | flutter: 75 | dependency: "direct main" 76 | description: flutter 77 | source: sdk 78 | version: "0.0.0" 79 | flutter_svg: 80 | dependency: "direct main" 81 | description: 82 | name: flutter_svg 83 | url: "https://pub.dartlang.org" 84 | source: hosted 85 | version: "0.21.0-nullsafety.0" 86 | flutter_test: 87 | dependency: "direct dev" 88 | description: flutter 89 | source: sdk 90 | version: "0.0.0" 91 | font_awesome_flutter: 92 | dependency: "direct main" 93 | description: 94 | name: font_awesome_flutter 95 | url: "https://pub.dartlang.org" 96 | source: hosted 97 | version: "9.0.0" 98 | matcher: 99 | dependency: transitive 100 | description: 101 | name: matcher 102 | url: "https://pub.dartlang.org" 103 | source: hosted 104 | version: "0.12.10" 105 | meta: 106 | dependency: transitive 107 | description: 108 | name: meta 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "1.3.0" 112 | nested: 113 | dependency: transitive 114 | description: 115 | name: nested 116 | url: "https://pub.dartlang.org" 117 | source: hosted 118 | version: "1.0.0" 119 | path: 120 | dependency: transitive 121 | description: 122 | name: path 123 | url: "https://pub.dartlang.org" 124 | source: hosted 125 | version: "1.8.0" 126 | path_drawing: 127 | dependency: transitive 128 | description: 129 | name: path_drawing 130 | url: "https://pub.dartlang.org" 131 | source: hosted 132 | version: "0.5.0-nullsafety.0" 133 | path_parsing: 134 | dependency: transitive 135 | description: 136 | name: path_parsing 137 | url: "https://pub.dartlang.org" 138 | source: hosted 139 | version: "0.2.0-nullsafety.0" 140 | pedantic: 141 | dependency: transitive 142 | description: 143 | name: pedantic 144 | url: "https://pub.dartlang.org" 145 | source: hosted 146 | version: "1.11.0" 147 | petitparser: 148 | dependency: transitive 149 | description: 150 | name: petitparser 151 | url: "https://pub.dartlang.org" 152 | source: hosted 153 | version: "4.1.0" 154 | provider: 155 | dependency: "direct main" 156 | description: 157 | name: provider 158 | url: "https://pub.dartlang.org" 159 | source: hosted 160 | version: "5.0.0" 161 | sky_engine: 162 | dependency: transitive 163 | description: flutter 164 | source: sdk 165 | version: "0.0.99" 166 | source_span: 167 | dependency: transitive 168 | description: 169 | name: source_span 170 | url: "https://pub.dartlang.org" 171 | source: hosted 172 | version: "1.8.0" 173 | stack_trace: 174 | dependency: transitive 175 | description: 176 | name: stack_trace 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "1.10.0" 180 | stream_channel: 181 | dependency: transitive 182 | description: 183 | name: stream_channel 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "2.1.0" 187 | string_scanner: 188 | dependency: transitive 189 | description: 190 | name: string_scanner 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "1.1.0" 194 | term_glyph: 195 | dependency: transitive 196 | description: 197 | name: term_glyph 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "1.2.0" 201 | test_api: 202 | dependency: transitive 203 | description: 204 | name: test_api 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "0.2.19" 208 | typed_data: 209 | dependency: transitive 210 | description: 211 | name: typed_data 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "1.3.0" 215 | vector_math: 216 | dependency: transitive 217 | description: 218 | name: vector_math 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "2.1.0" 222 | very_good_analysis: 223 | dependency: "direct dev" 224 | description: 225 | name: very_good_analysis 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "2.0.0" 229 | xml: 230 | dependency: transitive 231 | description: 232 | name: xml 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "5.1.0" 236 | sdks: 237 | dart: ">=2.12.0 <3.0.0" 238 | flutter: ">=1.24.0-7.0" 239 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_samples 2 | description: Flutter apps samples 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.12.0 <3.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | auto_size_text: ^3.0.0-nullsafety.0 27 | dotted_border: ^2.0.0-nullsafety.0 28 | flutter_svg: ^0.21.0-nullsafety.0 29 | font_awesome_flutter: ^9.0.0 30 | provider: ^5.0.0 31 | 32 | 33 | # The following adds the Cupertino Icons font to your application. 34 | # Use with the CupertinoIcons class for iOS style icons. 35 | cupertino_icons: ^1.0.2 36 | 37 | dev_dependencies: 38 | flutter_test: 39 | sdk: flutter 40 | very_good_analysis: ^2.0.0 41 | 42 | # For information on the generic Dart part of this file, see the 43 | # following page: https://dart.dev/tools/pub/pubspec 44 | 45 | # The following section is specific to Flutter. 46 | flutter: 47 | 48 | # The following line ensures that the Material Icons font is 49 | # included with your application, so that you can use the icons in 50 | # the material Icons class. 51 | uses-material-design: true 52 | 53 | # To add assets to your application, add an assets section, like this: 54 | assets: 55 | - assets/common/images/ 56 | - assets/delivery_app/icons/ 57 | - assets/delivery_app/images/ 58 | - assets/facebook_ui/icons/ 59 | - assets/facebook_ui/images/ 60 | - assets/facebook_ui/images/collections/ 61 | - assets/facebook_ui/images/people/ 62 | - assets/facebook_ui/images/profile/ 63 | - assets/facebook_ui/images/stories/ 64 | 65 | # example: 66 | fonts: 67 | - family: Lexend 68 | fonts: 69 | - asset: assets/common/fonts/Lexend/Lexend-Bold.ttf 70 | weight: 700 71 | - asset: assets/common/fonts/Lexend/Lexend-Light.ttf 72 | - asset: assets/common/fonts/Lexend/Lexend-Medium.ttf 73 | - asset: assets/common/fonts/Lexend/Lexend-Regular.ttf 74 | - asset: assets/common/fonts/Lexend/Lexend-SemiBold.ttf 75 | 76 | - family: Mulish 77 | fonts: 78 | - asset: assets/common/fonts/Mulish/Mulish-Bold.ttf 79 | weight: 700 80 | - asset: assets/common/fonts/Mulish/Mulish-Light.ttf 81 | - asset: assets/common/fonts/Mulish/Mulish-Medium.ttf 82 | - asset: assets/common/fonts/Mulish/Mulish-Regular.ttf 83 | - asset: assets/common/fonts/Mulish/Mulish-SemiBold.ttf -------------------------------------------------------------------------------- /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:flutter_samples/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 | --------------------------------------------------------------------------------