├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── landingpage ├── .gitignore ├── .metadata ├── README.md ├── android │ ├── app │ │ ├── build.gradle │ │ ├── google-services.json │ │ └── src │ │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ │ └── org │ │ │ │ │ └── pcc │ │ │ │ │ └── landingpage │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ └── values │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle ├── assets │ ├── flutter-to-fly-creds.json │ ├── fonts │ │ ├── Fresca-Regular.ttf │ │ ├── IndieFlower.ttf │ │ ├── Montserrat-Medium.ttf │ │ ├── Montserrat-Regular.ttf │ │ └── Roboto-Regular.ttf │ └── images │ │ ├── bird.jpg │ │ ├── email.png │ │ ├── flutter_image.jpg │ │ ├── lego.png │ │ └── menu.png ├── ios │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ └── flutter_export_environment.sh │ ├── Podfile │ ├── Podfile.lock │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── WorkspaceSettings.xcsettings │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 100.png │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 128.png │ │ │ ├── 144.png │ │ │ ├── 152.png │ │ │ ├── 16.png │ │ │ ├── 167.png │ │ │ ├── 172.png │ │ │ ├── 180.png │ │ │ ├── 196.png │ │ │ ├── 20.png │ │ │ ├── 216.png │ │ │ ├── 256.png │ │ │ ├── 29.png │ │ │ ├── 32.png │ │ │ ├── 40.png │ │ │ ├── 48.png │ │ │ ├── 50.png │ │ │ ├── 512.png │ │ │ ├── 55.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 64.png │ │ │ ├── 72.png │ │ │ ├── 76.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ ├── 88.png │ │ │ └── Contents.json │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── Runner-Bridging-Header.h ├── lib │ ├── data │ │ ├── demo_data.dart │ │ ├── reources.dart │ │ └── res_list_item.dart │ ├── home.dart │ ├── login │ │ ├── auth_service.dart │ │ ├── firebase_login.dart │ │ ├── login_page.dart │ │ └── user_profile.dart │ ├── main.dart │ ├── plugins │ │ ├── firetop │ │ │ ├── change_notifier.dart │ │ │ ├── fire_auth_service.dart │ │ │ ├── mobile.dart │ │ │ ├── unsupported.dart │ │ │ └── web.dart │ │ └── url_launcher │ │ │ ├── mobile.dart │ │ │ ├── unsupported.dart │ │ │ ├── url_launcher.dart │ │ │ └── web.dart │ ├── router.dart │ ├── rss │ │ ├── rss_resources.dart │ │ └── rss_service.dart │ ├── utils │ │ ├── display_util.dart │ │ ├── myColors.dart │ │ ├── my_platform.dart │ │ ├── responsive_widget.dart │ │ ├── strings.dart │ │ ├── themes.dart │ │ └── widgets_lib.dart │ └── widgets │ │ ├── body.dart │ │ ├── dialog_flow.dart │ │ ├── emailBox.dart │ │ ├── fact_message.dart │ │ ├── header.dart │ │ ├── large_screen.dart │ │ ├── small_screen.dart │ │ ├── susbcribe_button.dart │ │ └── webview.dart ├── pubspec.yaml ├── pubspec.yaml.native ├── pubspec.yaml.web ├── test │ └── widget_test.dart └── web │ └── index.html └── samples.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [ptyagicodecamp] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ['https://www.paypal.me/pritya']# Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | # See https://www.dartlang.org/guides/libraries/private-files 3 | 4 | # Files and directories created by pub 5 | .dart_tool/ 6 | .packages 7 | .pub/ 8 | build/ 9 | # If you're building an application, you may want to check-in your pubspec.lock 10 | pubspec.lock 11 | 12 | # Directory created by dartdoc 13 | # If you don't generate documentation locally you can remove this line. 14 | doc/api/ 15 | firebase/ 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Priyanka Tyagi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Flutter code recipes ## 2 | 3 | **Please check out latest code recipes [here](https://ptyagicodecamp.github.io/flutter-live-booklet-flutter-component-recipes.html)** 4 | 5 | _Follow me at twitter: @ptyagi13_ 6 | _Medium: @ptyagicodecamp_ 7 | 8 | #flutter, #flutter-widgets,#cross-platform, #android, #ios, #mobile,#flutter-development,#flutter-channel, #flutter-samples,#flutter-code,#material, 9 | #firebase-auth, #firestore, #firebase-hummingbird-login, #firebase-flutter-web, #firebase-hummingbird 10 | -------------------------------------------------------------------------------- /landingpage/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .packages 28 | .pub-cache/ 29 | .pub/ 30 | /build/ 31 | 32 | # Android related 33 | **/android/**/gradle-wrapper.jar 34 | **/android/.gradle 35 | **/android/captures/ 36 | **/android/gradlew 37 | **/android/gradlew.bat 38 | **/android/local.properties 39 | **/android/**/GeneratedPluginRegistrant.java 40 | 41 | # iOS/XCode related 42 | **/ios/**/*.mode1v3 43 | **/ios/**/*.mode2v3 44 | **/ios/**/*.moved-aside 45 | **/ios/**/*.pbxuser 46 | **/ios/**/*.perspectivev3 47 | **/ios/**/*sync/ 48 | **/ios/**/.sconsign.dblite 49 | **/ios/**/.tags* 50 | **/ios/**/.vagrant/ 51 | **/ios/**/DerivedData/ 52 | **/ios/**/Icon? 53 | **/ios/**/Pods/ 54 | **/ios/**/.symlinks/ 55 | **/ios/**/profile 56 | **/ios/**/xcuserdata 57 | **/ios/.generated/ 58 | **/ios/Flutter/App.framework 59 | **/ios/Flutter/Flutter.framework 60 | **/ios/Flutter/Generated.xcconfig 61 | **/ios/Flutter/app.flx 62 | **/ios/Flutter/app.zip 63 | **/ios/Flutter/flutter_assets/ 64 | **/ios/ServiceDefinitions.json 65 | **/ios/Runner/GeneratedPluginRegistrant.* 66 | 67 | # Exceptions to above rules. 68 | !**/ios/**/default.mode1v3 69 | !**/ios/**/default.mode2v3 70 | !**/ios/**/default.pbxuser 71 | !**/ios/**/default.perspectivev3 72 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 73 | -------------------------------------------------------------------------------- /landingpage/.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: cba41ca2ec977888806a9a02fc06c459f7a806ae 8 | channel: dev 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /landingpage/README.md: -------------------------------------------------------------------------------- 1 | ## Flutter code recipes ## 2 | 3 | **Please check out latest code recipes [here](https://ptyagicodecamp.github.io/flutter-live-booklet-flutter-component-recipes.html)** 4 | 5 | _Follow me at twitter: @ptyagi13_ 6 | _Medium: @ptyagicodecamp_ 7 | 8 | #flutter, #flutter-widgets,#cross-platform, #android, #ios, #mobile,#flutter-development,#flutter-channel, #flutter-samples,#flutter-code,#material, 9 | #firebase-auth, #firestore, #firebase-hummingbird-login, #firebase-flutter-web, #firebase-hummingbird -------------------------------------------------------------------------------- /landingpage/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 28 30 | 31 | compileOptions { 32 | sourceCompatibility JavaVersion.VERSION_1_8 33 | targetCompatibility JavaVersion.VERSION_1_8 34 | } 35 | 36 | sourceSets { 37 | main.java.srcDirs += 'src/main/kotlin' 38 | } 39 | 40 | lintOptions { 41 | disable 'InvalidPackage' 42 | } 43 | 44 | defaultConfig { 45 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 46 | applicationId "org.pcc.landingpage" 47 | minSdkVersion 26 48 | targetSdkVersion 28 49 | versionCode flutterVersionCode.toInteger() 50 | versionName flutterVersionName 51 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 52 | } 53 | 54 | signingConfigs { 55 | release { 56 | storeFile file("release.keystore") 57 | storePassword "******" 58 | keyAlias "******" 59 | keyPassword "******" 60 | } 61 | } 62 | 63 | buildTypes { 64 | release { 65 | // TODO: Add your own signing config for the release build. 66 | // Signing with the debug keys for now, so `flutter run --release` works. 67 | signingConfig signingConfigs.release 68 | } 69 | } 70 | buildToolsVersion = '28.0.3' 71 | compileOptions { 72 | sourceCompatibility = kotlin_version 73 | targetCompatibility = kotlin_version 74 | } 75 | } 76 | 77 | flutter { 78 | source '../..' 79 | } 80 | 81 | dependencies { 82 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 83 | implementation 'com.google.firebase:firebase-analytics:17.0.1' 84 | testImplementation 'junit:junit:4.12' 85 | androidTestImplementation 'androidx.test:runner:1.1.0' 86 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' 87 | } 88 | 89 | apply plugin: 'com.google.gms.google-services' -------------------------------------------------------------------------------- /landingpage/android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "20736492610", 4 | "firebase_url": "https://flutter-to-fly.firebaseio.com", 5 | "project_id": "flutter-to-fly", 6 | "storage_bucket": "flutter-to-fly.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:20736492610:android:df5b054b0db87bea", 12 | "android_client_info": { 13 | "package_name": "org.pcc.landingpage" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "20736492610-n3vq7n8ab5lv50htnd4dvrt6c5c59jgq.apps.googleusercontent.com", 19 | "client_type": 1, 20 | "android_info": { 21 | "package_name": "org.pcc.landingpage", 22 | "certificate_hash": "d90efd38eb51a5a3f3e2ab70428ed905114493b6" 23 | } 24 | }, 25 | { 26 | "client_id": "20736492610-d7jjjf6hlbl61jro5mvvo590smcq9je3.apps.googleusercontent.com", 27 | "client_type": 3 28 | } 29 | ], 30 | "api_key": [ 31 | { 32 | "current_key": "AIzaSyBLEsu9Lh_mFLypJdm7jcIu5Dm-GF0viRg" 33 | } 34 | ], 35 | "services": { 36 | "appinvite_service": { 37 | "other_platform_oauth_client": [ 38 | { 39 | "client_id": "20736492610-d7jjjf6hlbl61jro5mvvo590smcq9je3.apps.googleusercontent.com", 40 | "client_type": 3 41 | } 42 | ] 43 | } 44 | } 45 | } 46 | ], 47 | "configuration_version": "1" 48 | } -------------------------------------------------------------------------------- /landingpage/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /landingpage/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 13 | 20 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /landingpage/android/app/src/main/kotlin/org/pcc/landingpage/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package org.pcc.landingpage 2 | 3 | import android.os.Bundle 4 | 5 | import io.flutter.app.FlutterActivity 6 | import io.flutter.plugins.GeneratedPluginRegistrant 7 | 8 | class MainActivity: FlutterActivity() { 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | GeneratedPluginRegistrant.registerWith(this) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /landingpage/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /landingpage/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /landingpage/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /landingpage/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /landingpage/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /landingpage/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /landingpage/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /landingpage/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /landingpage/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.10' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | classpath 'com.google.gms:google-services:4.2.0' 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | jcenter() 19 | } 20 | } 21 | 22 | rootProject.buildDir = '../build' 23 | subprojects { 24 | project.buildDir = "${rootProject.buildDir}/${project.name}" 25 | } 26 | subprojects { 27 | project.evaluationDependsOn(':app') 28 | } 29 | 30 | task clean(type: Delete) { 31 | delete rootProject.buildDir 32 | } 33 | -------------------------------------------------------------------------------- /landingpage/android/gradle.properties: -------------------------------------------------------------------------------- 1 | android.enableJetifier=true 2 | android.useAndroidX=true 3 | org.gradle.jvmargs=-Xmx1536M 4 | android.enableR8=true 5 | -------------------------------------------------------------------------------- /landingpage/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Aug 29 23:19:37 PDT 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip 7 | -------------------------------------------------------------------------------- /landingpage/android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /landingpage/assets/flutter-to-fly-creds.json: -------------------------------------------------------------------------------- 1 | /Users/ptyagi/Developer/ptyagicodecamp/keys/dialog_flow/flutter-to-fly-3c903be20948.json -------------------------------------------------------------------------------- /landingpage/assets/fonts/Fresca-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/fonts/Fresca-Regular.ttf -------------------------------------------------------------------------------- /landingpage/assets/fonts/IndieFlower.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/fonts/IndieFlower.ttf -------------------------------------------------------------------------------- /landingpage/assets/fonts/Montserrat-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/fonts/Montserrat-Medium.ttf -------------------------------------------------------------------------------- /landingpage/assets/fonts/Montserrat-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/fonts/Montserrat-Regular.ttf -------------------------------------------------------------------------------- /landingpage/assets/fonts/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/fonts/Roboto-Regular.ttf -------------------------------------------------------------------------------- /landingpage/assets/images/bird.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/images/bird.jpg -------------------------------------------------------------------------------- /landingpage/assets/images/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/images/email.png -------------------------------------------------------------------------------- /landingpage/assets/images/flutter_image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/images/flutter_image.jpg -------------------------------------------------------------------------------- /landingpage/assets/images/lego.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/images/lego.png -------------------------------------------------------------------------------- /landingpage/assets/images/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/assets/images/menu.png -------------------------------------------------------------------------------- /landingpage/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 | -------------------------------------------------------------------------------- /landingpage/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /landingpage/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /landingpage/ios/Flutter/flutter_export_environment.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # This is a generated file; do not edit or check into version control. 3 | export "FLUTTER_ROOT=/Users/ptyagi/fluttersdk/flutter" 4 | export "FLUTTER_APPLICATION_PATH=/Users/ptyagi/Developer/ptyagicodecamp/flutter/x-flutter-landingpage/landingpage" 5 | export "FLUTTER_TARGET=lib/main.dart" 6 | export "FLUTTER_BUILD_DIR=build" 7 | export "SYMROOT=${SOURCE_ROOT}/../build/ios" 8 | export "FLUTTER_FRAMEWORK_DIR=/Users/ptyagi/fluttersdk/flutter/bin/cache/artifacts/engine/ios" 9 | export "FLUTTER_BUILD_NAME=1.0.0" 10 | export "FLUTTER_BUILD_NUMBER=1" 11 | -------------------------------------------------------------------------------- /landingpage/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 parse_KV_file(file, separator='=') 14 | file_abs_path = File.expand_path(file) 15 | if !File.exists? file_abs_path 16 | return []; 17 | end 18 | pods_ary = [] 19 | skip_line_start_symbols = ["#", "/"] 20 | File.foreach(file_abs_path) { |line| 21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 22 | plugin = line.split(pattern=separator) 23 | if plugin.length == 2 24 | podname = plugin[0].strip() 25 | path = plugin[1].strip() 26 | podpath = File.expand_path("#{path}", file_abs_path) 27 | pods_ary.push({:name => podname, :path => podpath}); 28 | else 29 | puts "Invalid plugin specification: #{line}" 30 | end 31 | } 32 | return pods_ary 33 | end 34 | 35 | target 'Runner' do 36 | use_frameworks! 37 | 38 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 39 | # referring to absolute paths on developers' machines. 40 | system('rm -rf .symlinks') 41 | system('mkdir -p .symlinks/plugins') 42 | 43 | # Flutter Pods 44 | generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') 45 | if generated_xcode_build_settings.empty? 46 | puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first." 47 | end 48 | generated_xcode_build_settings.map { |p| 49 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 50 | symlink = File.join('.symlinks', 'flutter') 51 | File.symlink(File.dirname(p[:path]), symlink) 52 | pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) 53 | end 54 | } 55 | 56 | # Plugin Pods 57 | plugin_pods = parse_KV_file('../.flutter-plugins') 58 | plugin_pods.map { |p| 59 | symlink = File.join('.symlinks', 'plugins', p[:name]) 60 | File.symlink(p[:path], symlink) 61 | pod p[:name], :path => File.join(symlink, 'ios') 62 | } 63 | end 64 | 65 | # Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. 66 | install! 'cocoapods', :disable_input_output_paths => true 67 | 68 | post_install do |installer| 69 | installer.pods_project.targets.each do |target| 70 | target.build_configurations.each do |config| 71 | config.build_settings['ENABLE_BITCODE'] = 'NO' 72 | end 73 | end 74 | end 75 | -------------------------------------------------------------------------------- /landingpage/ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - BoringSSL-GRPC (0.0.3): 3 | - BoringSSL-GRPC/Implementation (= 0.0.3) 4 | - BoringSSL-GRPC/Interface (= 0.0.3) 5 | - BoringSSL-GRPC/Implementation (0.0.3): 6 | - BoringSSL-GRPC/Interface (= 0.0.3) 7 | - BoringSSL-GRPC/Interface (0.0.3) 8 | - cloud_firestore (0.0.1): 9 | - Firebase/Core 10 | - Firebase/Firestore (~> 6.0) 11 | - Flutter 12 | - Firebase/Auth (6.7.0): 13 | - Firebase/CoreOnly 14 | - FirebaseAuth (~> 6.2.3) 15 | - Firebase/Core (6.7.0): 16 | - Firebase/CoreOnly 17 | - FirebaseAnalytics (= 6.1.1) 18 | - Firebase/CoreOnly (6.7.0): 19 | - FirebaseCore (= 6.2.1) 20 | - Firebase/Firestore (6.7.0): 21 | - Firebase/CoreOnly 22 | - FirebaseFirestore (~> 1.4.4) 23 | - firebase_auth (0.0.1): 24 | - Firebase/Auth (~> 6.0) 25 | - Firebase/Core 26 | - Flutter 27 | - firebase_core (0.0.1): 28 | - Firebase/Core 29 | - Flutter 30 | - FirebaseAnalytics (6.1.1): 31 | - FirebaseCore (~> 6.2) 32 | - FirebaseInstanceID (~> 4.2) 33 | - GoogleAppMeasurement (= 6.1.1) 34 | - GoogleUtilities/AppDelegateSwizzler (~> 6.0) 35 | - GoogleUtilities/MethodSwizzler (~> 6.0) 36 | - GoogleUtilities/Network (~> 6.0) 37 | - "GoogleUtilities/NSData+zlib (~> 6.0)" 38 | - nanopb (~> 0.3) 39 | - FirebaseAuth (6.2.3): 40 | - FirebaseAuthInterop (~> 1.0) 41 | - FirebaseCore (~> 6.2) 42 | - GoogleUtilities/AppDelegateSwizzler (~> 6.2) 43 | - GoogleUtilities/Environment (~> 6.2) 44 | - GTMSessionFetcher/Core (~> 1.1) 45 | - FirebaseAuthInterop (1.0.0) 46 | - FirebaseCore (6.2.1): 47 | - FirebaseCoreDiagnostics (~> 1.0) 48 | - FirebaseCoreDiagnosticsInterop (~> 1.0) 49 | - GoogleUtilities/Environment (~> 6.2) 50 | - GoogleUtilities/Logger (~> 6.2) 51 | - FirebaseCoreDiagnostics (1.0.1): 52 | - FirebaseCoreDiagnosticsInterop (~> 1.0) 53 | - GoogleDataTransportCCTSupport (~> 1.0) 54 | - GoogleUtilities/Environment (~> 6.2) 55 | - GoogleUtilities/Logger (~> 6.2) 56 | - FirebaseCoreDiagnosticsInterop (1.0.0) 57 | - FirebaseFirestore (1.4.5): 58 | - FirebaseAuthInterop (~> 1.0) 59 | - FirebaseCore (~> 6.2) 60 | - FirebaseFirestore/abseil-cpp (= 1.4.5) 61 | - "gRPC-C++ (= 0.0.9)" 62 | - leveldb-library (~> 1.20) 63 | - nanopb (~> 0.3.901) 64 | - Protobuf (~> 3.1) 65 | - FirebaseFirestore/abseil-cpp (1.4.5): 66 | - FirebaseAuthInterop (~> 1.0) 67 | - FirebaseCore (~> 6.2) 68 | - "gRPC-C++ (= 0.0.9)" 69 | - leveldb-library (~> 1.20) 70 | - nanopb (~> 0.3.901) 71 | - Protobuf (~> 3.1) 72 | - FirebaseInstanceID (4.2.3): 73 | - FirebaseCore (~> 6.0) 74 | - GoogleUtilities/Environment (~> 6.0) 75 | - GoogleUtilities/UserDefaults (~> 6.0) 76 | - Flutter (1.0.0) 77 | - google_sign_in (0.0.1): 78 | - Flutter 79 | - GoogleSignIn (~> 4.0) 80 | - GoogleAppMeasurement (6.1.1): 81 | - GoogleUtilities/AppDelegateSwizzler (~> 6.0) 82 | - GoogleUtilities/MethodSwizzler (~> 6.0) 83 | - GoogleUtilities/Network (~> 6.0) 84 | - "GoogleUtilities/NSData+zlib (~> 6.0)" 85 | - nanopb (~> 0.3) 86 | - GoogleDataTransport (1.1.3) 87 | - GoogleDataTransportCCTSupport (1.0.2): 88 | - GoogleDataTransport (~> 1.1) 89 | - nanopb 90 | - GoogleSignIn (4.4.0): 91 | - "GoogleToolboxForMac/NSDictionary+URLArguments (~> 2.1)" 92 | - "GoogleToolboxForMac/NSString+URLArguments (~> 2.1)" 93 | - GTMSessionFetcher/Core (~> 1.1) 94 | - GoogleToolboxForMac/DebugUtils (2.2.1): 95 | - GoogleToolboxForMac/Defines (= 2.2.1) 96 | - GoogleToolboxForMac/Defines (2.2.1) 97 | - "GoogleToolboxForMac/NSDictionary+URLArguments (2.2.1)": 98 | - GoogleToolboxForMac/DebugUtils (= 2.2.1) 99 | - GoogleToolboxForMac/Defines (= 2.2.1) 100 | - "GoogleToolboxForMac/NSString+URLArguments (= 2.2.1)" 101 | - "GoogleToolboxForMac/NSString+URLArguments (2.2.1)" 102 | - GoogleUtilities/AppDelegateSwizzler (6.2.5): 103 | - GoogleUtilities/Environment 104 | - GoogleUtilities/Logger 105 | - GoogleUtilities/Network 106 | - GoogleUtilities/Environment (6.2.5) 107 | - GoogleUtilities/Logger (6.2.5): 108 | - GoogleUtilities/Environment 109 | - GoogleUtilities/MethodSwizzler (6.2.5): 110 | - GoogleUtilities/Logger 111 | - GoogleUtilities/Network (6.2.5): 112 | - GoogleUtilities/Logger 113 | - "GoogleUtilities/NSData+zlib" 114 | - GoogleUtilities/Reachability 115 | - "GoogleUtilities/NSData+zlib (6.2.5)" 116 | - GoogleUtilities/Reachability (6.2.5): 117 | - GoogleUtilities/Logger 118 | - GoogleUtilities/UserDefaults (6.2.5): 119 | - GoogleUtilities/Logger 120 | - "gRPC-C++ (0.0.9)": 121 | - "gRPC-C++/Implementation (= 0.0.9)" 122 | - "gRPC-C++/Interface (= 0.0.9)" 123 | - "gRPC-C++/Implementation (0.0.9)": 124 | - "gRPC-C++/Interface (= 0.0.9)" 125 | - gRPC-Core (= 1.21.0) 126 | - nanopb (~> 0.3) 127 | - "gRPC-C++/Interface (0.0.9)" 128 | - gRPC-Core (1.21.0): 129 | - gRPC-Core/Implementation (= 1.21.0) 130 | - gRPC-Core/Interface (= 1.21.0) 131 | - gRPC-Core/Implementation (1.21.0): 132 | - BoringSSL-GRPC (= 0.0.3) 133 | - gRPC-Core/Interface (= 1.21.0) 134 | - nanopb (~> 0.3) 135 | - gRPC-Core/Interface (1.21.0) 136 | - GTMSessionFetcher/Core (1.2.2) 137 | - leveldb-library (1.22) 138 | - nanopb (0.3.901): 139 | - nanopb/decode (= 0.3.901) 140 | - nanopb/encode (= 0.3.901) 141 | - nanopb/decode (0.3.901) 142 | - nanopb/encode (0.3.901) 143 | - Protobuf (3.9.0) 144 | - webview_flutter (0.0.1): 145 | - Flutter 146 | 147 | DEPENDENCIES: 148 | - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) 149 | - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) 150 | - firebase_core (from `.symlinks/plugins/firebase_core/ios`) 151 | - Flutter (from `.symlinks/flutter/ios`) 152 | - google_sign_in (from `.symlinks/plugins/google_sign_in/ios`) 153 | - webview_flutter (from `.symlinks/plugins/webview_flutter/ios`) 154 | 155 | SPEC REPOS: 156 | https://github.com/cocoapods/specs.git: 157 | - BoringSSL-GRPC 158 | - Firebase 159 | - FirebaseAnalytics 160 | - FirebaseAuth 161 | - FirebaseAuthInterop 162 | - FirebaseCore 163 | - FirebaseCoreDiagnostics 164 | - FirebaseCoreDiagnosticsInterop 165 | - FirebaseFirestore 166 | - FirebaseInstanceID 167 | - GoogleAppMeasurement 168 | - GoogleDataTransport 169 | - GoogleDataTransportCCTSupport 170 | - GoogleSignIn 171 | - GoogleToolboxForMac 172 | - GoogleUtilities 173 | - "gRPC-C++" 174 | - gRPC-Core 175 | - GTMSessionFetcher 176 | - leveldb-library 177 | - nanopb 178 | - Protobuf 179 | 180 | EXTERNAL SOURCES: 181 | cloud_firestore: 182 | :path: ".symlinks/plugins/cloud_firestore/ios" 183 | firebase_auth: 184 | :path: ".symlinks/plugins/firebase_auth/ios" 185 | firebase_core: 186 | :path: ".symlinks/plugins/firebase_core/ios" 187 | Flutter: 188 | :path: ".symlinks/flutter/ios" 189 | google_sign_in: 190 | :path: ".symlinks/plugins/google_sign_in/ios" 191 | webview_flutter: 192 | :path: ".symlinks/plugins/webview_flutter/ios" 193 | 194 | SPEC CHECKSUMS: 195 | BoringSSL-GRPC: db8764df3204ccea016e1c8dd15d9a9ad63ff318 196 | cloud_firestore: 51fb4d22b59e6f59b3931a10c5d1df64bd8c373f 197 | Firebase: 291d7b0a7b393f252358083b5d224884126fa46d 198 | firebase_auth: 1e3b7bdd37b9fbd4ef75ba1d985b00be09e02d3d 199 | firebase_core: ae55ea92448ec8675d325da4db22cf3b4d58a54d 200 | FirebaseAnalytics: 843c7f64a8f9c79f0d03281197ebe7bb1d58d477 201 | FirebaseAuth: e7f86c2dfc57281cd01f7da5e4b40e01e4510a4a 202 | FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc 203 | FirebaseCore: 32b48f41c84a56fbde73b35ed01a830b3b6dc048 204 | FirebaseCoreDiagnostics: 4c04ae09d0ab027c30179828c6bb47764df1bd13 205 | FirebaseCoreDiagnosticsInterop: 6829da2b8d1fc795ff1bd99df751d3788035d2cb 206 | FirebaseFirestore: c457c22c49ccf15a0fbe95bfcbcf69b984dec285 207 | FirebaseInstanceID: 8b42755db950682e7de0d167bc6fb26a57b244af 208 | Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a 209 | google_sign_in: 27e70a98b529f0b076d4b19f231b81da28b1750b 210 | GoogleAppMeasurement: 86a82f0e1f20b8eedf8e20326530138fd71409de 211 | GoogleDataTransport: 91e682bd60a49d3f8f69f2e909a66efaed5a1e7a 212 | GoogleDataTransportCCTSupport: 6b545f7149111180763dc18c6f372c963de4a310 213 | GoogleSignIn: 7ff245e1a7b26d379099d3243a562f5747e23d39 214 | GoogleToolboxForMac: b3553629623a3b1bff17f555e736cd5a6d95ad55 215 | GoogleUtilities: e7dc37039b19df7fe543479d3e4a02ac8d11bb69 216 | "gRPC-C++": 9dfe7b44821e7b3e44aacad2af29d2c21f7cde83 217 | gRPC-Core: c9aef9a261a1247e881b18059b84d597293c9947 218 | GTMSessionFetcher: 61bb0f61a4cb560030f1222021178008a5727a23 219 | leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 220 | nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48 221 | Protobuf: 1097ca58584c8d9be81bfbf2c5ff5975648dd87a 222 | webview_flutter: 1aa7604e6cdb451a9b7ed2c37d5454c0b440246b 223 | 224 | PODFILE CHECKSUM: b6a0a141693093b304368d08511b46cf3d1d0ac5 225 | 226 | COCOAPODS: 1.7.3 227 | -------------------------------------------------------------------------------- /landingpage/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 13 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 15 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 16 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 18 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 19 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 20 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 21 | A183DF4098A71000CDB5952D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A91ADE14328CB71ABFF203 /* Pods_Runner.framework */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXCopyFilesBuildPhase section */ 25 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 26 | isa = PBXCopyFilesBuildPhase; 27 | buildActionMask = 2147483647; 28 | dstPath = ""; 29 | dstSubfolderSpec = 10; 30 | files = ( 31 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 32 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 33 | ); 34 | name = "Embed Frameworks"; 35 | runOnlyForDeploymentPostprocessing = 0; 36 | }; 37 | /* End PBXCopyFilesBuildPhase section */ 38 | 39 | /* Begin PBXFileReference section */ 40 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 41 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 42 | 258B3C4215B2B54F47C025CA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 43 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 44 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 45 | 43A91ADE14328CB71ABFF203 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 47 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 48 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 49 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 50 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 51 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 52 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 54 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 55 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 56 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | A514CCAA45651F6D153EE609 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 58 | C4E81F900FBA5A0A993344F3 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 59 | /* End PBXFileReference section */ 60 | 61 | /* Begin PBXFrameworksBuildPhase section */ 62 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 63 | isa = PBXFrameworksBuildPhase; 64 | buildActionMask = 2147483647; 65 | files = ( 66 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 67 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, 68 | A183DF4098A71000CDB5952D /* Pods_Runner.framework in Frameworks */, 69 | ); 70 | runOnlyForDeploymentPostprocessing = 0; 71 | }; 72 | /* End PBXFrameworksBuildPhase section */ 73 | 74 | /* Begin PBXGroup section */ 75 | 3F274183038AD7734253F89C /* Frameworks */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 43A91ADE14328CB71ABFF203 /* Pods_Runner.framework */, 79 | ); 80 | name = Frameworks; 81 | sourceTree = ""; 82 | }; 83 | 9740EEB11CF90186004384FC /* Flutter */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 3B80C3931E831B6300D905FE /* App.framework */, 87 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 88 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 89 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 90 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 91 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 92 | ); 93 | name = Flutter; 94 | sourceTree = ""; 95 | }; 96 | 97C146E51CF9000F007C117D = { 97 | isa = PBXGroup; 98 | children = ( 99 | 9740EEB11CF90186004384FC /* Flutter */, 100 | 97C146F01CF9000F007C117D /* Runner */, 101 | 97C146EF1CF9000F007C117D /* Products */, 102 | DDE802CCC67918A9A3C4147A /* Pods */, 103 | 3F274183038AD7734253F89C /* Frameworks */, 104 | ); 105 | sourceTree = ""; 106 | }; 107 | 97C146EF1CF9000F007C117D /* Products */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 97C146EE1CF9000F007C117D /* Runner.app */, 111 | ); 112 | name = Products; 113 | sourceTree = ""; 114 | }; 115 | 97C146F01CF9000F007C117D /* Runner */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 119 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 120 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 121 | 97C147021CF9000F007C117D /* Info.plist */, 122 | 97C146F11CF9000F007C117D /* Supporting Files */, 123 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 124 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 125 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 126 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 127 | ); 128 | path = Runner; 129 | sourceTree = ""; 130 | }; 131 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | ); 135 | name = "Supporting Files"; 136 | sourceTree = ""; 137 | }; 138 | DDE802CCC67918A9A3C4147A /* Pods */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | A514CCAA45651F6D153EE609 /* Pods-Runner.debug.xcconfig */, 142 | C4E81F900FBA5A0A993344F3 /* Pods-Runner.release.xcconfig */, 143 | 258B3C4215B2B54F47C025CA /* Pods-Runner.profile.xcconfig */, 144 | ); 145 | name = Pods; 146 | path = Pods; 147 | sourceTree = ""; 148 | }; 149 | /* End PBXGroup section */ 150 | 151 | /* Begin PBXNativeTarget section */ 152 | 97C146ED1CF9000F007C117D /* Runner */ = { 153 | isa = PBXNativeTarget; 154 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 155 | buildPhases = ( 156 | 008DC54D775173CA1D40A3BB /* [CP] Check Pods Manifest.lock */, 157 | 9740EEB61CF901F6004384FC /* Run Script */, 158 | 97C146EA1CF9000F007C117D /* Sources */, 159 | 97C146EB1CF9000F007C117D /* Frameworks */, 160 | 97C146EC1CF9000F007C117D /* Resources */, 161 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 162 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 163 | C039950F40F822BF90A0179C /* [CP] Embed Pods Frameworks */, 164 | 3B60F9466F7CAA7F2EFC7FCC /* [CP] Copy Pods Resources */, 165 | ); 166 | buildRules = ( 167 | ); 168 | dependencies = ( 169 | ); 170 | name = Runner; 171 | productName = Runner; 172 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 173 | productType = "com.apple.product-type.application"; 174 | }; 175 | /* End PBXNativeTarget section */ 176 | 177 | /* Begin PBXProject section */ 178 | 97C146E61CF9000F007C117D /* Project object */ = { 179 | isa = PBXProject; 180 | attributes = { 181 | LastUpgradeCheck = 0910; 182 | ORGANIZATIONNAME = "The Chromium Authors"; 183 | TargetAttributes = { 184 | 97C146ED1CF9000F007C117D = { 185 | CreatedOnToolsVersion = 7.3.1; 186 | LastSwiftMigration = 0910; 187 | }; 188 | }; 189 | }; 190 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 191 | compatibilityVersion = "Xcode 3.2"; 192 | developmentRegion = English; 193 | hasScannedForEncodings = 0; 194 | knownRegions = ( 195 | en, 196 | Base, 197 | ); 198 | mainGroup = 97C146E51CF9000F007C117D; 199 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 200 | projectDirPath = ""; 201 | projectRoot = ""; 202 | targets = ( 203 | 97C146ED1CF9000F007C117D /* Runner */, 204 | ); 205 | }; 206 | /* End PBXProject section */ 207 | 208 | /* Begin PBXResourcesBuildPhase section */ 209 | 97C146EC1CF9000F007C117D /* Resources */ = { 210 | isa = PBXResourcesBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 214 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 215 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 216 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 217 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 218 | ); 219 | runOnlyForDeploymentPostprocessing = 0; 220 | }; 221 | /* End PBXResourcesBuildPhase section */ 222 | 223 | /* Begin PBXShellScriptBuildPhase section */ 224 | 008DC54D775173CA1D40A3BB /* [CP] Check Pods Manifest.lock */ = { 225 | isa = PBXShellScriptBuildPhase; 226 | buildActionMask = 2147483647; 227 | files = ( 228 | ); 229 | inputFileListPaths = ( 230 | ); 231 | inputPaths = ( 232 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 233 | "${PODS_ROOT}/Manifest.lock", 234 | ); 235 | name = "[CP] Check Pods Manifest.lock"; 236 | outputFileListPaths = ( 237 | ); 238 | outputPaths = ( 239 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | shellPath = /bin/sh; 243 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 244 | showEnvVarsInLog = 0; 245 | }; 246 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 247 | isa = PBXShellScriptBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | ); 251 | inputPaths = ( 252 | ); 253 | name = "Thin Binary"; 254 | outputPaths = ( 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | shellPath = /bin/sh; 258 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; 259 | }; 260 | 3B60F9466F7CAA7F2EFC7FCC /* [CP] Copy Pods Resources */ = { 261 | isa = PBXShellScriptBuildPhase; 262 | buildActionMask = 2147483647; 263 | files = ( 264 | ); 265 | inputPaths = ( 266 | ); 267 | name = "[CP] Copy Pods Resources"; 268 | outputPaths = ( 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | shellPath = /bin/sh; 272 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; 273 | showEnvVarsInLog = 0; 274 | }; 275 | 9740EEB61CF901F6004384FC /* Run Script */ = { 276 | isa = PBXShellScriptBuildPhase; 277 | buildActionMask = 2147483647; 278 | files = ( 279 | ); 280 | inputPaths = ( 281 | ); 282 | name = "Run Script"; 283 | outputPaths = ( 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | shellPath = /bin/sh; 287 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 288 | }; 289 | C039950F40F822BF90A0179C /* [CP] Embed Pods Frameworks */ = { 290 | isa = PBXShellScriptBuildPhase; 291 | buildActionMask = 2147483647; 292 | files = ( 293 | ); 294 | inputPaths = ( 295 | ); 296 | name = "[CP] Embed Pods Frameworks"; 297 | outputPaths = ( 298 | ); 299 | runOnlyForDeploymentPostprocessing = 0; 300 | shellPath = /bin/sh; 301 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 302 | showEnvVarsInLog = 0; 303 | }; 304 | /* End PBXShellScriptBuildPhase section */ 305 | 306 | /* Begin PBXSourcesBuildPhase section */ 307 | 97C146EA1CF9000F007C117D /* Sources */ = { 308 | isa = PBXSourcesBuildPhase; 309 | buildActionMask = 2147483647; 310 | files = ( 311 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 312 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 313 | ); 314 | runOnlyForDeploymentPostprocessing = 0; 315 | }; 316 | /* End PBXSourcesBuildPhase section */ 317 | 318 | /* Begin PBXVariantGroup section */ 319 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 320 | isa = PBXVariantGroup; 321 | children = ( 322 | 97C146FB1CF9000F007C117D /* Base */, 323 | ); 324 | name = Main.storyboard; 325 | sourceTree = ""; 326 | }; 327 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 328 | isa = PBXVariantGroup; 329 | children = ( 330 | 97C147001CF9000F007C117D /* Base */, 331 | ); 332 | name = LaunchScreen.storyboard; 333 | sourceTree = ""; 334 | }; 335 | /* End PBXVariantGroup section */ 336 | 337 | /* Begin XCBuildConfiguration section */ 338 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 339 | isa = XCBuildConfiguration; 340 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 341 | buildSettings = { 342 | ALWAYS_SEARCH_USER_PATHS = NO; 343 | CLANG_ANALYZER_NONNULL = YES; 344 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 345 | CLANG_CXX_LIBRARY = "libc++"; 346 | CLANG_ENABLE_MODULES = YES; 347 | CLANG_ENABLE_OBJC_ARC = YES; 348 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 349 | CLANG_WARN_BOOL_CONVERSION = YES; 350 | CLANG_WARN_COMMA = YES; 351 | CLANG_WARN_CONSTANT_CONVERSION = YES; 352 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 353 | CLANG_WARN_EMPTY_BODY = YES; 354 | CLANG_WARN_ENUM_CONVERSION = YES; 355 | CLANG_WARN_INFINITE_RECURSION = YES; 356 | CLANG_WARN_INT_CONVERSION = YES; 357 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 358 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 359 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 360 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 361 | CLANG_WARN_STRICT_PROTOTYPES = YES; 362 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 363 | CLANG_WARN_UNREACHABLE_CODE = YES; 364 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 365 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 366 | COPY_PHASE_STRIP = NO; 367 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 368 | ENABLE_NS_ASSERTIONS = NO; 369 | ENABLE_STRICT_OBJC_MSGSEND = YES; 370 | GCC_C_LANGUAGE_STANDARD = gnu99; 371 | GCC_NO_COMMON_BLOCKS = YES; 372 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 373 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 374 | GCC_WARN_UNDECLARED_SELECTOR = YES; 375 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 376 | GCC_WARN_UNUSED_FUNCTION = YES; 377 | GCC_WARN_UNUSED_VARIABLE = YES; 378 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 379 | MTL_ENABLE_DEBUG_INFO = NO; 380 | SDKROOT = iphoneos; 381 | TARGETED_DEVICE_FAMILY = "1,2"; 382 | VALIDATE_PRODUCT = YES; 383 | }; 384 | name = Profile; 385 | }; 386 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 387 | isa = XCBuildConfiguration; 388 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 389 | buildSettings = { 390 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 391 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 392 | DEVELOPMENT_TEAM = S8QB4VV633; 393 | ENABLE_BITCODE = NO; 394 | FRAMEWORK_SEARCH_PATHS = ( 395 | "$(inherited)", 396 | "$(PROJECT_DIR)/Flutter", 397 | ); 398 | INFOPLIST_FILE = Runner/Info.plist; 399 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 400 | LIBRARY_SEARCH_PATHS = ( 401 | "$(inherited)", 402 | "$(PROJECT_DIR)/Flutter", 403 | ); 404 | PRODUCT_BUNDLE_IDENTIFIER = org.pcc.landingpage; 405 | PRODUCT_NAME = "$(TARGET_NAME)"; 406 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 407 | SWIFT_VERSION = 4.0; 408 | VERSIONING_SYSTEM = "apple-generic"; 409 | }; 410 | name = Profile; 411 | }; 412 | 97C147031CF9000F007C117D /* Debug */ = { 413 | isa = XCBuildConfiguration; 414 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 415 | buildSettings = { 416 | ALWAYS_SEARCH_USER_PATHS = NO; 417 | CLANG_ANALYZER_NONNULL = YES; 418 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 419 | CLANG_CXX_LIBRARY = "libc++"; 420 | CLANG_ENABLE_MODULES = YES; 421 | CLANG_ENABLE_OBJC_ARC = YES; 422 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 423 | CLANG_WARN_BOOL_CONVERSION = YES; 424 | CLANG_WARN_COMMA = YES; 425 | CLANG_WARN_CONSTANT_CONVERSION = YES; 426 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 427 | CLANG_WARN_EMPTY_BODY = YES; 428 | CLANG_WARN_ENUM_CONVERSION = YES; 429 | CLANG_WARN_INFINITE_RECURSION = YES; 430 | CLANG_WARN_INT_CONVERSION = YES; 431 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 432 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 433 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 434 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 435 | CLANG_WARN_STRICT_PROTOTYPES = YES; 436 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 437 | CLANG_WARN_UNREACHABLE_CODE = YES; 438 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 439 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 440 | COPY_PHASE_STRIP = NO; 441 | DEBUG_INFORMATION_FORMAT = dwarf; 442 | ENABLE_STRICT_OBJC_MSGSEND = YES; 443 | ENABLE_TESTABILITY = YES; 444 | GCC_C_LANGUAGE_STANDARD = gnu99; 445 | GCC_DYNAMIC_NO_PIC = NO; 446 | GCC_NO_COMMON_BLOCKS = YES; 447 | GCC_OPTIMIZATION_LEVEL = 0; 448 | GCC_PREPROCESSOR_DEFINITIONS = ( 449 | "DEBUG=1", 450 | "$(inherited)", 451 | ); 452 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 453 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 454 | GCC_WARN_UNDECLARED_SELECTOR = YES; 455 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 456 | GCC_WARN_UNUSED_FUNCTION = YES; 457 | GCC_WARN_UNUSED_VARIABLE = YES; 458 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 459 | MTL_ENABLE_DEBUG_INFO = YES; 460 | ONLY_ACTIVE_ARCH = YES; 461 | SDKROOT = iphoneos; 462 | TARGETED_DEVICE_FAMILY = "1,2"; 463 | }; 464 | name = Debug; 465 | }; 466 | 97C147041CF9000F007C117D /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 469 | buildSettings = { 470 | ALWAYS_SEARCH_USER_PATHS = NO; 471 | CLANG_ANALYZER_NONNULL = YES; 472 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 473 | CLANG_CXX_LIBRARY = "libc++"; 474 | CLANG_ENABLE_MODULES = YES; 475 | CLANG_ENABLE_OBJC_ARC = YES; 476 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 477 | CLANG_WARN_BOOL_CONVERSION = YES; 478 | CLANG_WARN_COMMA = YES; 479 | CLANG_WARN_CONSTANT_CONVERSION = YES; 480 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 481 | CLANG_WARN_EMPTY_BODY = YES; 482 | CLANG_WARN_ENUM_CONVERSION = YES; 483 | CLANG_WARN_INFINITE_RECURSION = YES; 484 | CLANG_WARN_INT_CONVERSION = YES; 485 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 486 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 487 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 488 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 489 | CLANG_WARN_STRICT_PROTOTYPES = YES; 490 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 491 | CLANG_WARN_UNREACHABLE_CODE = YES; 492 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 493 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 494 | COPY_PHASE_STRIP = NO; 495 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 496 | ENABLE_NS_ASSERTIONS = NO; 497 | ENABLE_STRICT_OBJC_MSGSEND = YES; 498 | GCC_C_LANGUAGE_STANDARD = gnu99; 499 | GCC_NO_COMMON_BLOCKS = YES; 500 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 501 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 502 | GCC_WARN_UNDECLARED_SELECTOR = YES; 503 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 504 | GCC_WARN_UNUSED_FUNCTION = YES; 505 | GCC_WARN_UNUSED_VARIABLE = YES; 506 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 507 | MTL_ENABLE_DEBUG_INFO = NO; 508 | SDKROOT = iphoneos; 509 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 510 | TARGETED_DEVICE_FAMILY = "1,2"; 511 | VALIDATE_PRODUCT = YES; 512 | }; 513 | name = Release; 514 | }; 515 | 97C147061CF9000F007C117D /* Debug */ = { 516 | isa = XCBuildConfiguration; 517 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 518 | buildSettings = { 519 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 520 | CLANG_ENABLE_MODULES = YES; 521 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 522 | ENABLE_BITCODE = NO; 523 | FRAMEWORK_SEARCH_PATHS = ( 524 | "$(inherited)", 525 | "$(PROJECT_DIR)/Flutter", 526 | ); 527 | INFOPLIST_FILE = Runner/Info.plist; 528 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 529 | LIBRARY_SEARCH_PATHS = ( 530 | "$(inherited)", 531 | "$(PROJECT_DIR)/Flutter", 532 | ); 533 | PRODUCT_BUNDLE_IDENTIFIER = org.pcc.landingpage; 534 | PRODUCT_NAME = "$(TARGET_NAME)"; 535 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 536 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 537 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 538 | SWIFT_VERSION = 4.0; 539 | VERSIONING_SYSTEM = "apple-generic"; 540 | }; 541 | name = Debug; 542 | }; 543 | 97C147071CF9000F007C117D /* Release */ = { 544 | isa = XCBuildConfiguration; 545 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 546 | buildSettings = { 547 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 548 | CLANG_ENABLE_MODULES = YES; 549 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 550 | ENABLE_BITCODE = NO; 551 | FRAMEWORK_SEARCH_PATHS = ( 552 | "$(inherited)", 553 | "$(PROJECT_DIR)/Flutter", 554 | ); 555 | INFOPLIST_FILE = Runner/Info.plist; 556 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 557 | LIBRARY_SEARCH_PATHS = ( 558 | "$(inherited)", 559 | "$(PROJECT_DIR)/Flutter", 560 | ); 561 | PRODUCT_BUNDLE_IDENTIFIER = org.pcc.landingpage; 562 | PRODUCT_NAME = "$(TARGET_NAME)"; 563 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 564 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 565 | SWIFT_VERSION = 4.0; 566 | VERSIONING_SYSTEM = "apple-generic"; 567 | }; 568 | name = Release; 569 | }; 570 | /* End XCBuildConfiguration section */ 571 | 572 | /* Begin XCConfigurationList section */ 573 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 574 | isa = XCConfigurationList; 575 | buildConfigurations = ( 576 | 97C147031CF9000F007C117D /* Debug */, 577 | 97C147041CF9000F007C117D /* Release */, 578 | 249021D3217E4FDB00AE95B9 /* Profile */, 579 | ); 580 | defaultConfigurationIsVisible = 0; 581 | defaultConfigurationName = Release; 582 | }; 583 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 584 | isa = XCConfigurationList; 585 | buildConfigurations = ( 586 | 97C147061CF9000F007C117D /* Debug */, 587 | 97C147071CF9000F007C117D /* Release */, 588 | 249021D4217E4FDB00AE95B9 /* Profile */, 589 | ); 590 | defaultConfigurationIsVisible = 0; 591 | defaultConfigurationName = Release; 592 | }; 593 | /* End XCConfigurationList section */ 594 | }; 595 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 596 | } 597 | -------------------------------------------------------------------------------- /landingpage/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /landingpage/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 56 | 58 | 64 | 65 | 66 | 67 | 68 | 69 | 75 | 77 | 83 | 84 | 85 | 86 | 88 | 89 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /landingpage/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /landingpage/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildSystemType 6 | Original 7 | 8 | 9 | -------------------------------------------------------------------------------- /landingpage/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: [UIApplicationLaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"idiom":"watch","filename":"172.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"86x86","expected-size":"172","role":"quickLook"},{"idiom":"watch","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"40x40","expected-size":"80","role":"appLauncher"},{"idiom":"watch","filename":"88.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"40mm","scale":"2x","size":"44x44","expected-size":"88","role":"appLauncher"},{"idiom":"watch","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"50x50","expected-size":"100","role":"appLauncher"},{"idiom":"watch","filename":"196.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"98x98","expected-size":"196","role":"quickLook"},{"idiom":"watch","filename":"216.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"108x108","expected-size":"216","role":"quickLook"},{"idiom":"watch","filename":"48.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"24x24","expected-size":"48","role":"notificationCenter"},{"idiom":"watch","filename":"55.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"27.5x27.5","expected-size":"55","role":"notificationCenter"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"3x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"2x"},{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} -------------------------------------------------------------------------------- /landingpage/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 | -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /landingpage/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ptyagicodecamp/x-flutter-landingpage/eee23edfdabf9b9704d17c8eb975efb922c87f94/landingpage/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /landingpage/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. -------------------------------------------------------------------------------- /landingpage/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 | -------------------------------------------------------------------------------- /landingpage/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 | -------------------------------------------------------------------------------- /landingpage/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | landingpage 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 | -------------------------------------------------------------------------------- /landingpage/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /landingpage/lib/data/demo_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:landingpage/data/res_list_item.dart'; 2 | 3 | import 'res_list_item.dart'; 4 | 5 | final List resources = [ 6 | Resource('References', "", "", references), 7 | Resource('Cheat Sheets', "", "", cheatSheets), 8 | Resource('Curated Contents', "", "", curatedItems), 9 | Resource('Videos & Podcasts', "", "", mediaListing) 10 | ]; 11 | 12 | final List references = Resource.fromData([ 13 | { 14 | "title": "It's All Widget", 15 | "description": 16 | "An open list of example apps made with Flutter include many open source samples.", 17 | "link": "https://itsallwidgets.com/" 18 | }, 19 | { 20 | "title": "Flutter", 21 | "description": "Official Flutter Development Website", 22 | "link": "https://flutter.dev/" 23 | } 24 | ]); 25 | 26 | final List cheatSheets = Resource.fromData([ 27 | { 28 | "title": "Flutter Layout Cheat Sheet", 29 | "description": "", 30 | "link": 31 | "https://medium.com/flutter-community/flutter-layout-cheat-sheet-5363348d037e" 32 | }, 33 | { 34 | "title": "Flutter Animations Cheat Sheet", 35 | "description": "", 36 | "link": 37 | "https://medium.com/flutter-community/flutter-animations-cheat-sheet-7f8cebfb850c" 38 | }, 39 | { 40 | "title": "Dart Awesome Cheat Sheet for Flutter Beginners", 41 | "description": "", 42 | "link": "https://link.medium.com/RDSSCukKSZ" 43 | } 44 | ]); 45 | 46 | final List curatedItems = Resource.fromData([ 47 | { 48 | "title": "FlutterX", 49 | "description": "A Searchable List of Flutter Resources", 50 | "link": "https://flutterx.com/" 51 | }, 52 | { 53 | "title": "Curated list of resources", 54 | "description": "A Searchable List of Flutter Resources", 55 | "link": "https://github.com/Solido/awesome-flutter" 56 | } 57 | ]); 58 | 59 | final List mediaListing = Resource.fromData([ 60 | { 61 | "title": "Flutter YouTube Channel", 62 | "description": "", 63 | "link": "https://www.youtube.com/flutterdev" 64 | }, 65 | { 66 | "title": "The Boring Flutter Development Show", 67 | "description": 68 | "The Boring Show is a biweekly, long-format show in which a few engineers from the Flutter team get together to hack on something", 69 | "link": 70 | "https://www.youtube.com/watch?v=vqPG1tU6-c0&list=PLjxrf2q8roU3ahJVrSgAnPjzkpGmL9Czl" 71 | }, 72 | { 73 | "title": "Flutter Widget of the Week", 74 | "description": 75 | "Widget of the Week is a series of quick, animated videos, each of which covers a particular widget from the Flutter SDK", 76 | "link": 77 | "https://www.youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG" 78 | }, 79 | { 80 | "title": "Flutter in Focus", 81 | "description": 82 | "Let's learn Flutter features in 10 minutes or less with our new series, Flutter in Focus!", 83 | "link": 84 | "https://www.youtube.com/playlist?list=PLjxrf2q8roU2HdJQDjJzOeO6J3FoFLWr2" 85 | }, 86 | { 87 | "title": "Flutter Podcast", 88 | "description": 89 | "An ongoing series featuring some of the amazing developers from the Flutter community.", 90 | "link": "https://itsallwidgets.com/podcast" 91 | } 92 | ]); 93 | -------------------------------------------------------------------------------- /landingpage/lib/data/reources.dart: -------------------------------------------------------------------------------- 1 | import 'package:landingpage/data/res_list_item.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter/widgets.dart'; 4 | import 'package:landingpage/plugins/url_launcher/url_launcher.dart'; 5 | import 'dart:convert'; 6 | import 'package:url_launcher/url_launcher.dart'; 7 | 8 | import 'demo_data.dart'; 9 | 10 | const HtmlEscape htmlEscape = HtmlEscape(); 11 | 12 | class FlutterResources extends StatelessWidget { 13 | @override 14 | Widget build(BuildContext context) { 15 | return Scaffold( 16 | appBar: AppBar( 17 | title: Text('Flutter Resources'), 18 | ), 19 | body: showListing(), 20 | ); 21 | } 22 | 23 | Widget showListing() { 24 | var items = resources; 25 | return ListView.builder( 26 | itemCount: items.length, 27 | itemBuilder: (BuildContext context, int index) => 28 | ResourceListItem(items[index])); 29 | } 30 | 31 | Widget showLoading() { 32 | return Align( 33 | alignment: Alignment.center, 34 | child: CircularProgressIndicator(), 35 | ); 36 | } 37 | 38 | void openLink(String url) { 39 | var substr = url.toString().split(":"); 40 | var myUrl = "https://ptyagicodecamp.github.io" + substr[2]; 41 | 42 | UrlUtils.open(myUrl); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /landingpage/lib/data/res_list_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:landingpage/plugins/url_launcher/url_launcher.dart'; 2 | import 'package:flutter/cupertino.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class ResourceListItem extends StatelessWidget { 6 | final Resource _resource; 7 | const ResourceListItem(this._resource); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return _buildTiles(_resource); 12 | } 13 | 14 | Widget _buildTiles(Resource resource) { 15 | if (resource.children.isEmpty) 16 | return ListTile( 17 | title: Text( 18 | resource.title, 19 | style: TextStyle(fontFamily: 'Montserrat-Regular', fontSize: 20), 20 | ), 21 | subtitle: resource.description.isNotEmpty 22 | ? Text( 23 | resource.description, 24 | style: TextStyle(fontFamily: 'Fresca', fontSize: 18), 25 | ) 26 | : null, 27 | onTap: () { 28 | if (resource.link.isNotEmpty) { 29 | UrlUtils.open(resource.link); 30 | } 31 | }); 32 | 33 | return ExpansionTile( 34 | key: PageStorageKey(resource), 35 | title: Text(resource.title, 36 | style: TextStyle(fontFamily: 'Montserrat-Medium', fontSize: 20)), 37 | children: resource.children.map(_buildTiles).toList(), 38 | ); 39 | } 40 | } 41 | 42 | class Resource { 43 | final String title; 44 | final String description; 45 | final String link; 46 | final List children; 47 | 48 | //intializing empty children 49 | Resource(this.title, this.description, this.link, 50 | [this.children = const []]); 51 | 52 | Resource.fromMap(Map data) 53 | : title = data["title"], 54 | description = data["description"], 55 | link = data["link"], 56 | this.children = const []; 57 | 58 | static List fromData(List> data) { 59 | return data.map((item) => Resource.fromMap(item)).toList(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /landingpage/lib/home.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'utils/myColors.dart'; 4 | import 'widgets/body.dart'; 5 | import 'widgets/header.dart'; 6 | 7 | class MyHomePage extends StatelessWidget { 8 | @override 9 | Widget build(BuildContext context) { 10 | //Add a container and provide a linear gradient. 11 | //basically use different shades of same color. 12 | return Container( 13 | decoration: BoxDecoration( 14 | gradient: LinearGradient(colors: [MyColors.white1, MyColors.white2])), 15 | child: Scaffold( 16 | backgroundColor: Colors.transparent, 17 | body: SingleChildScrollView( 18 | child: Column( 19 | children: [HeaderWidget(), Body()], 20 | ), 21 | ), 22 | ), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /landingpage/lib/login/auth_service.dart: -------------------------------------------------------------------------------- 1 | //import 'dart:async'; 2 | // 3 | //import 'package:firebase/firebase.dart' as fb; 4 | //import 'package:firebase/firebase.dart'; 5 | //import 'package:firebase/firestore.dart'; 6 | //import 'package:flutter_web/foundation.dart'; 7 | // 8 | //abstract class BaseAuthService with ChangeNotifier { 9 | // Future currentUser(); 10 | // Future signIn(String email, String password); 11 | // Future googleSignIn(); 12 | // Future updateUser(User user); 13 | // Future createUser( 14 | // String firstName, String lastName, String email, String password); 15 | // Future signOut(); 16 | //} 17 | // 18 | //class FireAuthService extends BaseAuthService { 19 | // final Auth _firebaseAuth = fb.auth(); 20 | // 21 | // //Get currently logged-in user 22 | // @override 23 | // Future currentUser() async { 24 | // return await _firebaseAuth.currentUser; 25 | // } 26 | // 27 | // //Sign-in using email and password, notifies all subscribers. 28 | // @override 29 | // Future signIn(String email, String password) async { 30 | // try { 31 | // var auth = 32 | // await _firebaseAuth.signInWithEmailAndPassword(email, password); 33 | // 34 | // notifyListeners(); 35 | // return auth.user; 36 | // } catch (e) { 37 | // throw Exception(e); 38 | // } 39 | // } 40 | // 41 | // //This method is called from register form. A user account is created in FirebaseAuth 42 | // @override 43 | // Future createUser( 44 | // String firstName, String lastName, String email, String password) async { 45 | // var auth = 46 | // await _firebaseAuth.createUserWithEmailAndPassword(email, password); 47 | // 48 | // var info = fb.UserProfile(); 49 | // info.displayName = '$firstName $lastName'; 50 | // await auth.user.updateProfile(info); 51 | // 52 | // updateUser(auth.user); 53 | // 54 | // return auth.user; 55 | // } 56 | // 57 | // //A record is created at Firestore to keep track of all personalized data for each user. 58 | // @override 59 | // Future updateUser(User user) async { 60 | // final CollectionReference ref = fb.firestore().collection('users'); 61 | // 62 | // String displayName = user.displayName; 63 | // String photoUrl = user.photoURL; 64 | // 65 | // if (displayName == null) { 66 | // displayName = "No Name yet"; 67 | // } 68 | // 69 | // if (photoUrl == null) { 70 | // photoUrl = ""; 71 | // } 72 | // 73 | // var newData = { 74 | // 'uid': user.uid, 75 | // 'displayName': displayName, 76 | // 'photoUrl': photoUrl, 77 | // 'email': user.email, 78 | // 'lastActive': DateTime.now() 79 | // }; 80 | // 81 | // await ref.doc(user.uid).set(newData, SetOptions(merge: true)); 82 | // 83 | // return user; 84 | // } 85 | // 86 | // //Sign-out 87 | // @override 88 | // Future signOut() async { 89 | // _firebaseAuth.signOut(); 90 | // notifyListeners(); 91 | // } 92 | // 93 | // @override 94 | // Future googleSignIn() async { 95 | // //TODO 96 | // } 97 | //} 98 | -------------------------------------------------------------------------------- /landingpage/lib/login/firebase_login.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/login/login_page.dart'; 3 | import 'package:landingpage/login/user_profile.dart'; 4 | import 'package:landingpage/plugins/firetop/change_notifier.dart'; 5 | import 'package:landingpage/plugins/firetop/fire_auth_service.dart'; 6 | import 'package:provider/provider.dart'; 7 | import 'package:landingpage/router.dart' as router; 8 | 9 | //user Firebase Auth to login using Google account credentials 10 | class FirebaseAuthLogin extends StatefulWidget { 11 | @override 12 | State createState() { 13 | return _FirebaseAuthLoginState(); 14 | } 15 | } 16 | 17 | class _FirebaseAuthLoginState extends State { 18 | static MyAuthUser user; 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return body(); 23 | } 24 | 25 | FutureBuilder body() { 26 | return FutureBuilder( 27 | future: Provider.of(context).currentUser(), 28 | builder: (context, AsyncSnapshot snapshot) { 29 | if (snapshot.connectionState == ConnectionState.done) { 30 | if (snapshot.error != null) { 31 | return Text(snapshot.error.toString()); 32 | } 33 | 34 | if (snapshot.hasData) { 35 | user = snapshot.data; 36 | 37 | return UserProfilePage( 38 | currentUser: user, onSignOut: () => signOut()); 39 | } 40 | 41 | return LogInPage(title: 'Login'); 42 | } else { 43 | return Container( 44 | child: CircularProgressIndicator(), 45 | ); 46 | } 47 | }, 48 | ); 49 | } 50 | 51 | void signOut() { 52 | Navigator.popAndPushNamed(context, router.HOME); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /landingpage/lib/login/login_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/widgets.dart'; 3 | import 'package:landingpage/plugins/firetop/change_notifier.dart'; 4 | import 'package:landingpage/plugins/firetop/fire_auth_service.dart'; 5 | import 'package:landingpage/router.dart' as router; 6 | import 'package:landingpage/utils/responsive_widget.dart'; 7 | import 'package:landingpage/utils/widgets_lib.dart'; 8 | import 'package:provider/provider.dart'; 9 | 10 | class LogInPage extends StatefulWidget { 11 | final String title; 12 | final void Function(MyAuthUser) onSignIn; 13 | 14 | LogInPage({Key key, this.title, this.onSignIn}) : super(key: key); 15 | 16 | @override 17 | _LogInPageState createState() => new _LogInPageState(); 18 | } 19 | 20 | enum FormType { login, register } 21 | 22 | class _LogInPageState extends State { 23 | static final formKey = new GlobalKey(); 24 | 25 | String _email; 26 | String _password; 27 | String _hintText = ''; 28 | FormType _formType = FormType.login; 29 | 30 | @override 31 | Widget build(BuildContext context) { 32 | return Scaffold( 33 | appBar: AppBar( 34 | title: Text('LogIn'), 35 | ), 36 | body: body(context), 37 | ); 38 | } 39 | 40 | Widget body(BuildContext context) { 41 | if (ResponsiveWidget.isSmallScreen(context)) { 42 | return smallScreen(context); 43 | } 44 | 45 | return largeScreen(context); 46 | } 47 | 48 | Widget smallScreen(BuildContext context) { 49 | return SingleChildScrollView( 50 | child: Container( 51 | padding: const EdgeInsets.all(16.0), 52 | child: Column(children: [ 53 | Card( 54 | child: 55 | Column(mainAxisSize: MainAxisSize.min, children: [ 56 | Container( 57 | padding: const EdgeInsets.all(16.0), 58 | child: Form( 59 | key: formKey, 60 | child: Column( 61 | crossAxisAlignment: CrossAxisAlignment.stretch, 62 | children: loginForm() + 63 | [ 64 | SizedBox( 65 | height: 30, 66 | ) 67 | ] + 68 | submissionOptions(), // adding two widget lists 69 | ))), 70 | ])), 71 | hintText(), 72 | ]))); 73 | } 74 | 75 | Widget largeScreen(BuildContext context) { 76 | return Center( 77 | child: SizedBox( 78 | width: MediaQuery.of(context).size.width / 2, 79 | height: MediaQuery.of(context).size.height, 80 | child: Container( 81 | padding: const EdgeInsets.all(16.0), 82 | child: Column(children: [ 83 | Card( 84 | child: Column( 85 | mainAxisSize: MainAxisSize.min, 86 | children: [ 87 | Container( 88 | padding: const EdgeInsets.all(16.0), 89 | child: Form( 90 | key: formKey, 91 | child: Column( 92 | crossAxisAlignment: CrossAxisAlignment.stretch, 93 | children: loginForm() + 94 | [ 95 | SizedBox( 96 | height: 30, 97 | ) 98 | ] + 99 | submissionOptions(), // adding two widget lists 100 | ))), 101 | ])), 102 | hintText(), 103 | ]))), 104 | ); 105 | } 106 | 107 | void submitForm() async { 108 | final form = formKey.currentState; 109 | if (form.validate()) { 110 | form.save(); 111 | 112 | //hides keyboard 113 | FocusScope.of(context).requestFocus(new FocusNode()); 114 | try { 115 | MyAuthUser firebaseUser = _formType == FormType.login 116 | ? await Provider.of(context) 117 | .signIn(_email, _password) 118 | : await Provider.of(context) 119 | .createUser(_email, '', _email, _password); 120 | 121 | String userId = firebaseUser.uid; 122 | 123 | setState(() { 124 | _hintText = 'Signed In\n\nUser id: $userId'; 125 | //user created his account. Now directly sign-in 126 | Navigator.pushReplacementNamed(context, router.USER_PROFILE, 127 | arguments: firebaseUser); 128 | }); 129 | } catch (e) { 130 | setState(() { 131 | _hintText = 'Sign In Error\n\n${e.message}'; 132 | }); 133 | } 134 | } else { 135 | setState(() { 136 | _hintText = ''; 137 | }); 138 | } 139 | } 140 | 141 | void register() { 142 | formKey.currentState.reset(); 143 | setState(() { 144 | _formType = FormType.register; 145 | _hintText = ''; 146 | }); 147 | } 148 | 149 | void signIn() { 150 | formKey.currentState.reset(); 151 | setState(() { 152 | _formType = FormType.login; 153 | _hintText = ''; 154 | }); 155 | } 156 | 157 | List loginForm() { 158 | return [ 159 | padded( 160 | child: TextFormField( 161 | key: Key('email'), 162 | decoration: InputDecoration(labelText: 'Email'), 163 | autocorrect: false, 164 | validator: (val) => val.isEmpty ? 'Email can\'t be empty.' : null, 165 | onSaved: (val) => _email = val, 166 | )), 167 | padded( 168 | child: TextFormField( 169 | key: Key('password'), 170 | decoration: InputDecoration(labelText: 'Password'), 171 | obscureText: true, 172 | autocorrect: false, 173 | validator: (val) => val.isEmpty ? 'Password can\'t be empty.' : null, 174 | onSaved: (val) => _password = val, 175 | )), 176 | ]; 177 | } 178 | 179 | List submissionOptions() { 180 | switch (_formType) { 181 | case FormType.login: 182 | return [ 183 | LogInButton( 184 | key: Key('login'), 185 | text: 'Login', 186 | height: 44.0, 187 | backgroundColor: Colors.blue, 188 | onPressed: submitForm), 189 | SizedBox( 190 | height: 10, 191 | ), 192 | FlatButton( 193 | key: Key('register'), 194 | child: Text( 195 | "Need an account? Register", 196 | style: TextStyle(fontSize: 20, fontStyle: FontStyle.italic), 197 | ), 198 | onPressed: register), 199 | ]; 200 | case FormType.register: 201 | return [ 202 | LogInButton( 203 | key: Key('create_account'), 204 | text: 'Register', 205 | height: 44.0, 206 | backgroundColor: Colors.blue, 207 | onPressed: submitForm), 208 | SizedBox( 209 | height: 10, 210 | ), 211 | FlatButton( 212 | key: Key('sign_in'), 213 | child: Text( 214 | "Registered already ? Login", 215 | style: TextStyle(fontSize: 20, fontStyle: FontStyle.italic), 216 | ), 217 | onPressed: signIn), 218 | ]; 219 | } 220 | return null; 221 | } 222 | 223 | Widget hintText() { 224 | return Container( 225 | padding: const EdgeInsets.all(32.0), 226 | child: new Text(_hintText, 227 | key: Key('hint_text'), 228 | style: TextStyle(fontSize: 18.0, color: Colors.grey), 229 | textAlign: TextAlign.center)); 230 | } 231 | 232 | Widget padded({Widget child}) { 233 | return Padding( 234 | padding: EdgeInsets.symmetric(vertical: 8.0), 235 | child: child, 236 | ); 237 | } 238 | } 239 | -------------------------------------------------------------------------------- /landingpage/lib/login/user_profile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/plugins/firetop/change_notifier.dart'; 3 | import 'package:landingpage/plugins/firetop/fire_auth_service.dart'; 4 | import 'package:landingpage/utils/responsive_widget.dart'; 5 | import 'package:provider/provider.dart'; 6 | 7 | //user Firebase Auth to login using Google account credentials 8 | class UserProfilePage extends StatefulWidget { 9 | final MyAuthUser currentUser; 10 | final VoidCallback onSignOut; 11 | 12 | UserProfilePage({this.currentUser, this.onSignOut}); 13 | 14 | @override 15 | State createState() { 16 | return _UserProfilePageState(); 17 | } 18 | } 19 | 20 | class _UserProfilePageState extends State { 21 | String photoUrl = ""; 22 | String displayName = "no name yet"; 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | if (widget.currentUser != null) { 27 | if (widget.currentUser.photoUrl != null) { 28 | photoUrl = widget.currentUser.photoUrl; 29 | } 30 | if (widget.currentUser.displayName != null) { 31 | displayName = widget.currentUser.displayName; 32 | } 33 | } 34 | 35 | return Scaffold( 36 | appBar: AppBar( 37 | title: Text("My Profile"), 38 | ), 39 | body: body(context), 40 | ); 41 | } 42 | 43 | Widget body(BuildContext context) { 44 | if (ResponsiveWidget.isSmallScreen(context)) { 45 | return smallScreen(context); 46 | } 47 | 48 | return largeScreen(context); 49 | } 50 | 51 | Widget largeScreen(BuildContext context) { 52 | return Center( 53 | child: SizedBox( 54 | width: MediaQuery.of(context).size.width / 2, 55 | height: MediaQuery.of(context).size.height / 2, 56 | child: Center( 57 | child: Column( 58 | children: [ 59 | SizedBox( 60 | height: 20.0, 61 | ), 62 | Text( 63 | 'Welcome ' + displayName, 64 | style: TextStyle( 65 | fontSize: 20, 66 | fontWeight: FontWeight.bold, 67 | fontStyle: FontStyle.normal), 68 | ), 69 | SizedBox( 70 | height: 20.0, 71 | ), 72 | SizedBox( 73 | height: 100, 74 | width: 100, 75 | child: CircleAvatar( 76 | radius: 200, 77 | child: profilePhoto(BuildContext), 78 | ), 79 | ), 80 | SizedBox( 81 | height: 20.0, 82 | ), 83 | RaisedButton( 84 | child: Text('Sign out'), 85 | onPressed: () async { 86 | Navigator.pushReplacementNamed(context, "/"); 87 | await Provider.of(context).signOut(); 88 | }, 89 | ) 90 | ], 91 | ), 92 | ), 93 | ), 94 | ); 95 | } 96 | 97 | Widget profilePhoto(BuildContext) { 98 | if (photoUrl != null && photoUrl.length > 2) { 99 | return Image.network( 100 | photoUrl, 101 | fit: BoxFit.fitHeight, 102 | ); 103 | } else { 104 | return Container(child: Icon(Icons.person)); 105 | } 106 | } 107 | 108 | Widget smallScreen(BuildContext context) { 109 | return Center( 110 | child: Column( 111 | children: [ 112 | SizedBox( 113 | height: 20.0, 114 | ), 115 | Text( 116 | 'Welcome ' + displayName, 117 | style: TextStyle( 118 | fontSize: 20, 119 | fontWeight: FontWeight.bold, 120 | fontStyle: FontStyle.normal), 121 | ), 122 | SizedBox( 123 | height: 20.0, 124 | ), 125 | SizedBox( 126 | height: 100, 127 | width: 100, 128 | child: CircleAvatar( 129 | radius: 200, 130 | child: profilePhoto(BuildContext), 131 | ), 132 | ), 133 | SizedBox( 134 | height: 20.0, 135 | ), 136 | RaisedButton( 137 | child: Text('Sign out'), 138 | onPressed: () async { 139 | Navigator.pushReplacementNamed(context, "/"); 140 | await Provider.of(context).signOut(); 141 | }, 142 | ) 143 | ], 144 | ), 145 | ); 146 | } 147 | } 148 | -------------------------------------------------------------------------------- /landingpage/lib/main.dart: -------------------------------------------------------------------------------- 1 | //Note: This needs to be changed to flutter package for Native apps 2 | import 'package:flutter/material.dart'; 3 | import 'package:landingpage/utils/themes.dart'; 4 | 5 | import 'router.dart' as router; 6 | 7 | void main() => runApp(MyApp()); 8 | 9 | class MyApp extends StatelessWidget { 10 | // This widget is the root of your application 11 | // From here, everything gets started. 12 | @override 13 | Widget build(BuildContext context) { 14 | return MaterialApp( 15 | debugShowCheckedModeBanner: false, 16 | title: 'Flutter to fly away!', 17 | theme: MyAppThemes.AppThemeBlue(context), 18 | onGenerateRoute: router.generateRoute, 19 | initialRoute: '/', 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/firetop/change_notifier.dart: -------------------------------------------------------------------------------- 1 | import 'package:fb_auth/data/classes/auth_user.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'dart:core'; 4 | 5 | abstract class BaseAuthService with ChangeNotifier { 6 | Future currentUser(); 7 | Future signIn(String email, String password); 8 | Future googleSignIn(); 9 | Future updateUser(MyAuthUser user); 10 | Future createUser( 11 | String firstName, String lastName, String email, String password); 12 | Future signOut(); 13 | } 14 | 15 | class MyAuthUser extends AuthUser { 16 | final String uid; 17 | final String displayName; 18 | final String email; 19 | final String photoUrl; 20 | final bool isEmailVerified; 21 | final bool isAnonymous; 22 | 23 | MyAuthUser( 24 | {@required this.uid, 25 | @required this.displayName, 26 | @required this.email, 27 | @required this.isEmailVerified, 28 | @required this.isAnonymous, 29 | @required this.photoUrl}); 30 | 31 | @override 32 | String toString() { 33 | return '$displayName'; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/firetop/fire_auth_service.dart: -------------------------------------------------------------------------------- 1 | export 'unsupported.dart' 2 | if (dart.library.html) 'web.dart' 3 | if (dart.library.io) 'mobile.dart'; 4 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/firetop/mobile.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:fb_auth/fb_auth.dart'; 3 | import 'package:firebase_auth/firebase_auth.dart'; 4 | import 'package:google_sign_in/google_sign_in.dart'; 5 | import 'change_notifier.dart'; 6 | 7 | class FireAuthService extends BaseAuthService { 8 | FireAuthService._(); 9 | FireAuthService(); 10 | 11 | static final _auth = FBAuth(); 12 | 13 | @override 14 | Future currentUser() async { 15 | AuthUser user = await _auth.currentUser(); 16 | return user != null 17 | ? MyAuthUser( 18 | uid: user.uid, displayName: user.displayName, email: user.email) 19 | : null; 20 | } 21 | 22 | @override 23 | Future signIn(String email, String password) async { 24 | var auth = await _auth.login(email, password); 25 | notifyListeners(); 26 | AuthUser user = auth; 27 | return MyAuthUser( 28 | uid: user.uid, displayName: user.displayName, email: user.email); 29 | } 30 | 31 | @override 32 | Future googleSignIn() async { 33 | GoogleSignInAccount googleUser = await GoogleSignIn().signIn(); 34 | GoogleSignInAuthentication googleAuth = await googleUser.authentication; 35 | AuthCredential credential = GoogleAuthProvider.getCredential( 36 | accessToken: googleAuth.accessToken, 37 | idToken: googleAuth.idToken, 38 | ); 39 | 40 | FirebaseUser firebaseUser = 41 | (await FirebaseAuth.instance.signInWithCredential(credential)).user; 42 | 43 | //creates user entry after logging-in for first tie. 44 | updateUser(MyAuthUser( 45 | uid: firebaseUser.uid, 46 | displayName: firebaseUser.displayName, 47 | email: firebaseUser.email)); 48 | notifyListeners(); 49 | 50 | return MyAuthUser( 51 | uid: firebaseUser.uid, 52 | displayName: firebaseUser.displayName, 53 | email: firebaseUser.email); 54 | } 55 | 56 | @override 57 | Future updateUser(MyAuthUser myAuthUser) async { 58 | FirebaseUser user = myAuthUser as FirebaseUser; 59 | Firestore _fireStore = Firestore.instance; 60 | DocumentReference documentReference = 61 | _fireStore.collection('users').document(user.uid); 62 | 63 | documentReference.setData({ 64 | 'uid': user.uid, 65 | 'displayName': user.displayName, 66 | //'photoUrl': user., 67 | 'email': user.email, 68 | 'lastActive': DateTime.now() 69 | }, merge: true); 70 | 71 | return myAuthUser; 72 | } 73 | 74 | @override 75 | Future createUser( 76 | String firstName, String lastName, String email, String password) async { 77 | var auth = await FirebaseAuth.instance 78 | .createUserWithEmailAndPassword(email: email, password: password); 79 | UserUpdateInfo info = UserUpdateInfo(); 80 | info.displayName = '$firstName $lastName'; 81 | 82 | await auth.user.updateProfile(info); 83 | 84 | FirebaseUser user = auth.user; 85 | return MyAuthUser( 86 | uid: user.uid, displayName: user.displayName, email: user.email); 87 | } 88 | 89 | @override 90 | Future signOut() async { 91 | _auth.logout(); 92 | notifyListeners(); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/firetop/unsupported.dart: -------------------------------------------------------------------------------- 1 | import 'change_notifier.dart'; 2 | 3 | class FireAuthService extends BaseAuthService { 4 | FireAuthService._(); 5 | 6 | FireAuthService(); 7 | 8 | @override 9 | Future createUser( 10 | String firstName, String lastName, String email, String password) { 11 | throw ("Platform not found"); 12 | } 13 | 14 | @override 15 | Future currentUser() { 16 | throw ("Platform not found"); 17 | } 18 | 19 | @override 20 | Future googleSignIn() { 21 | throw ("Platform not found"); 22 | } 23 | 24 | @override 25 | Future signIn(String email, String password) { 26 | throw ("Platform not found"); 27 | } 28 | 29 | @override 30 | Future signOut() { 31 | throw ("Platform not found"); 32 | } 33 | 34 | @override 35 | Future updateUser(Object user) { 36 | throw ("Platform not found"); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/firetop/web.dart: -------------------------------------------------------------------------------- 1 | import 'package:fb_auth/fb_auth.dart'; 2 | //import 'package:fb_auth/data/classes/auth_user.dart'; 3 | //import 'package:fb_auth/data/services/auth/auth.dart'; 4 | import 'change_notifier.dart'; 5 | 6 | class FireAuthService extends BaseAuthService { 7 | FireAuthService._(); 8 | FireAuthService(); 9 | 10 | static final _auth = FBAuth(); 11 | 12 | @override 13 | Future currentUser() async { 14 | AuthUser user = await _auth.currentUser(); 15 | return user != null 16 | ? MyAuthUser( 17 | uid: user.uid, displayName: user.displayName, email: user.email) 18 | : null; 19 | } 20 | 21 | @override 22 | Future signIn(String email, String password) async { 23 | var auth = await _auth.login(email, password); 24 | notifyListeners(); 25 | AuthUser user = auth; 26 | return MyAuthUser( 27 | uid: user.uid, displayName: user.displayName, email: user.email); 28 | } 29 | 30 | @override 31 | Future googleSignIn() async { 32 | throw ("Not implemented"); 33 | } 34 | 35 | @override 36 | Future updateUser(MyAuthUser user) async { 37 | // Firestore _fireStore = Firestore.instance; 38 | // DocumentReference documentReference = 39 | // _fireStore.collection('users').document(user.uid); 40 | // 41 | // documentReference.setData({ 42 | // 'uid': user.uid, 43 | // 'displayName': user.displayName, 44 | // //'photoUrl': user., 45 | // 'email': user.email, 46 | // 'lastActive': DateTime.now() 47 | // }, merge: true); 48 | 49 | return user; 50 | } 51 | 52 | @override 53 | Future createUser( 54 | String firstName, String lastName, String email, String password) async { 55 | var auth = await _auth.createAccount(email, password); 56 | AuthUser user = auth; 57 | return MyAuthUser( 58 | uid: user.uid, displayName: user.displayName, email: user.email); 59 | } 60 | 61 | @override 62 | Future signOut() async { 63 | _auth.logout(); 64 | notifyListeners(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/url_launcher/mobile.dart: -------------------------------------------------------------------------------- 1 | import 'package:url_launcher/url_launcher.dart'; 2 | 3 | class UrlUtils { 4 | UrlUtils._(); 5 | 6 | static void open(String url, {String name}) async { 7 | if (await canLaunch(url)) { 8 | await launch(url); 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/url_launcher/unsupported.dart: -------------------------------------------------------------------------------- 1 | //Taken from https://github.com/AppleEducate/flutter_x/blob/finish/lib/plugins/url_launcher/unsupported.dart 2 | 3 | class UrlUtils { 4 | UrlUtils._(); 5 | 6 | static void open(String url, {String name}) { 7 | throw 'Platform Not Supported'; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/url_launcher/url_launcher.dart: -------------------------------------------------------------------------------- 1 | export 'unsupported.dart' 2 | if (dart.library.html) 'web.dart' 3 | if (dart.library.io) 'mobile.dart'; 4 | -------------------------------------------------------------------------------- /landingpage/lib/plugins/url_launcher/web.dart: -------------------------------------------------------------------------------- 1 | import 'package:universal_html/prefer_universal/html.dart' as html; 2 | 3 | class UrlUtils { 4 | UrlUtils._(); 5 | 6 | static void open(String url, {String name}) { 7 | html.window.open(url, name); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /landingpage/lib/router.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/plugins/firetop/change_notifier.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | import 'data/reources.dart'; 6 | import 'home.dart'; 7 | import 'login/firebase_login.dart'; 8 | import 'login/user_profile.dart'; 9 | import 'package:landingpage/plugins/firetop/fire_auth_service.dart'; 10 | 11 | const String HOME = '/'; 12 | const String FACTS_DIALOGFLOW = "FACTS_DIALOGFLOW"; 13 | const String FIREBASE_LOGIN = 'FIREBASE_LOGIN'; 14 | const String USER_PROFILE = 'USER_PROFILE'; 15 | const String FLUTTER_RESOURCES = 'FLUTTER_RESOURCES'; 16 | 17 | Route generateRoute(RouteSettings routeSettings) { 18 | switch (routeSettings.name) { 19 | case HOME: 20 | return MaterialPageRoute(builder: (context) => MyHomePage()); 21 | break; 22 | 23 | case FLUTTER_RESOURCES: 24 | return MaterialPageRoute(builder: (context) => FlutterResources()); 25 | break; 26 | 27 | case FIREBASE_LOGIN: 28 | return MaterialPageRoute(builder: (context) { 29 | return ChangeNotifierProvider( 30 | child: FirebaseAuthLogin(), 31 | builder: (BuildContext context) { 32 | return FireAuthService(); 33 | }, 34 | ); 35 | }); 36 | break; 37 | 38 | case USER_PROFILE: 39 | return MaterialPageRoute(builder: (context) { 40 | final MyAuthUser firebaseUser = routeSettings.arguments; 41 | return ChangeNotifierProvider( 42 | child: UserProfilePage( 43 | currentUser: firebaseUser, 44 | onSignOut: () { 45 | Navigator.pushNamed(context, HOME); 46 | }), 47 | builder: (BuildContext context) { 48 | return FireAuthService(); 49 | }, 50 | ); 51 | }); 52 | break; 53 | default: 54 | return MaterialPageRoute(builder: (context) => MyHomePage()); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /landingpage/lib/rss/rss_resources.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/widgets.dart'; 3 | import 'package:landingpage/plugins/url_launcher/url_launcher.dart'; 4 | import 'dart:convert'; 5 | //import 'package:url_launcher/url_launcher.dart'; 6 | 7 | import 'rss_service.dart'; 8 | 9 | const HtmlEscape htmlEscape = HtmlEscape(); 10 | 11 | class FlutterResources extends StatelessWidget { 12 | @override 13 | Widget build(BuildContext context) { 14 | return Scaffold( 15 | appBar: AppBar( 16 | title: Text('Flutter Resources'), 17 | ), 18 | body: showListing(), 19 | ); 20 | } 21 | 22 | FutureBuilder showListing() { 23 | return FutureBuilder( 24 | future: RssService().getFeed(), 25 | builder: (BuildContext context, AsyncSnapshot snapshot) { 26 | switch (snapshot.connectionState) { 27 | case ConnectionState.done: 28 | if (snapshot.hasData) { 29 | if (snapshot.data != null) { 30 | final feed = snapshot.data; 31 | return ListView.builder( 32 | itemCount: feed.items.length, 33 | itemBuilder: (BuildContext ctxt, int index) { 34 | final item = feed.items[index]; 35 | return ListTile( 36 | title: Text( 37 | item.title, 38 | style: TextStyle(fontFamily: 'Roboto', fontSize: 20), 39 | ), 40 | leading: Icon(Icons.star_border), 41 | contentPadding: EdgeInsets.all(16.0), 42 | onTap: () async { 43 | openLink(item.id); 44 | }, 45 | ); 46 | }); 47 | } else { 48 | return showLoading(); 49 | } 50 | } else { 51 | showLoading(); 52 | } 53 | break; 54 | 55 | default: 56 | return showLoading(); 57 | } 58 | }, 59 | ); 60 | } 61 | 62 | Widget showLoading() { 63 | return Align( 64 | alignment: Alignment.center, 65 | child: CircularProgressIndicator(), 66 | ); 67 | } 68 | 69 | void openLink(String url) { 70 | var substr = url.toString().split(":"); 71 | var myUrl = "https://ptyagicodecamp.github.io" + substr[2]; 72 | UrlUtils.open(myUrl); 73 | //html.window.open(myUrl, "Flutter Resources"); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /landingpage/lib/rss/rss_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:webfeed/domain/atom_feed.dart'; 2 | import 'package:http/http.dart' as http; 3 | 4 | class RssService { 5 | final _targetUrl = 'https://ptyagicodecamp.github.io/feeds/flutter.atom.xml'; 6 | 7 | Future getFeed() => 8 | http.read(_targetUrl).then((xmlString) => AtomFeed.parse(xmlString)); 9 | 10 | //tag:ptyagicodecamp.github.io,2019-08-30:/custom-switch-widget-for-accepting-privacy-policy-in-flutter-apps.html 11 | } 12 | -------------------------------------------------------------------------------- /landingpage/lib/utils/display_util.dart: -------------------------------------------------------------------------------- 1 | enum NavLinks { Home, Github, Videos, Resources, Jobs, LogIn } 2 | 3 | String displayString(NavLinks link) { 4 | switch (link) { 5 | case NavLinks.Home: 6 | return "Home"; 7 | break; 8 | 9 | case NavLinks.Github: 10 | return "Github"; 11 | break; 12 | case NavLinks.Videos: 13 | return "Videos"; 14 | break; 15 | 16 | case NavLinks.Jobs: 17 | return "Jobs"; 18 | break; 19 | 20 | case NavLinks.LogIn: 21 | return "LogIn"; 22 | break; 23 | 24 | case NavLinks.Resources: 25 | return "Resources"; 26 | break; 27 | 28 | default: 29 | return ""; 30 | } 31 | } 32 | 33 | String linkUrl(NavLinks link) { 34 | switch (link) { 35 | case NavLinks.Home: 36 | return "https://flutter-to-fly.web.app/"; 37 | break; 38 | 39 | case NavLinks.Github: 40 | return "https://github.com/ptyagicodecamp"; 41 | break; 42 | case NavLinks.Videos: 43 | return "https://www.youtube.com/channel/UCO3_dbHasEnA2dr_U0EhMAA?view_as=subscriber"; 44 | break; 45 | 46 | case NavLinks.Jobs: 47 | return "https://flutterjobs.info/jobs/all"; 48 | break; 49 | 50 | default: 51 | return ""; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /landingpage/lib/utils/myColors.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class MyColors { 4 | static const Color white1 = Color(0xFFF8FBFF); 5 | static const Color white2 = Color(0xFFFCFDFD); 6 | 7 | static const Color blue1 = Color(0xFF00b0ff); 8 | static const Color blue2 = Color(0xFF0081cb); 9 | static const Color blue3 = Color(0xFF4fc3f7); 10 | 11 | static const Color blue4 = Color(0xFF8591B0); 12 | 13 | static Color green1 = Colors.green[900]; 14 | static Color green2 = Colors.green[600]; 15 | static const Color green3 = Colors.greenAccent; 16 | 17 | static Color purple1 = Colors.purple[800]; 18 | static Color purple2 = Colors.purple[300]; 19 | static const Color purple3 = Colors.purpleAccent; 20 | 21 | static const Color orange1 = Colors.deepOrange; 22 | static const Color orange2 = Colors.orange; 23 | static const Color orange3 = Colors.orangeAccent; 24 | } 25 | -------------------------------------------------------------------------------- /landingpage/lib/utils/my_platform.dart: -------------------------------------------------------------------------------- 1 | ////import 'dart:html' as html; 2 | //import 'dart:io' show Platform; 3 | // 4 | ////This approach is for web platform. 5 | ////import 'dart:io' as Platform; should be used for Native. 6 | //abstract class MyPlatform { 7 | // static bool iOS() => false; 8 | // static bool isAndroid() => false; 9 | // static bool isMobile() => isAndroid() || iOS(); 10 | // 11 | //} 12 | // 13 | //class NativePlatform implements MyPlatform { 14 | // 15 | // @override 16 | // static bool iOS() => Platform.isIOS; 17 | // 18 | // @override 19 | // static bool isAndroid() => Platform.isAndroid; 20 | // 21 | // @override 22 | // static bool isMobile() => isAndroid() || iOS(); 23 | //} 24 | -------------------------------------------------------------------------------- /landingpage/lib/utils/responsive_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ResponsiveWidget extends StatelessWidget { 4 | final Widget largeScreen; 5 | final Widget mediumScreen; 6 | final Widget smallScreen; 7 | 8 | const ResponsiveWidget( 9 | {Key key, this.largeScreen, this.mediumScreen, this.smallScreen}) 10 | : super(key: key); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | //return smallScreen; 15 | //final shortestSide = MediaQuery.of(context).size.shortestSide; 16 | final shortestSide = getShortestSide(context); 17 | //Returns the largest screen for screens 1200 or larger. 18 | if (shortestSide >= 1200) { 19 | return largeScreen; 20 | } else if (shortestSide > 800 && shortestSide < 1200) { 21 | //if medium screen not available, then return large screen 22 | return mediumScreen ?? largeScreen; 23 | } else { 24 | //if small screen implementation not available, then return large screen 25 | return smallScreen ?? largeScreen; 26 | } 27 | } 28 | 29 | static double getShortestSide(BuildContext context) { 30 | return MediaQuery.of(context).size.width; 31 | } 32 | //Making these methods static, so that they can be used as accessed from other widgets 33 | 34 | //Large screen is any screen whose width is more than 1200 pixels 35 | static bool isLargeScreen(BuildContext context) { 36 | return getShortestSide(context) > 1200; 37 | } 38 | 39 | //Small screen is any screen whose width is less than 800 pixels 40 | static bool isSmallScreen(BuildContext context) { 41 | return getShortestSide(context) < 800; 42 | } 43 | 44 | //Medium screen is any screen whose width is less than 1200 pixels, 45 | //and more than 800 pixels 46 | static bool isMediumScreen(BuildContext context) { 47 | return getShortestSide(context) > 800 && getShortestSide(context) < 1200; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /landingpage/lib/utils/strings.dart: -------------------------------------------------------------------------------- 1 | class Strings { 2 | static const String appTitle = "Flutter to fly !"; 3 | static const String logoTitle = "ftf"; 4 | static const String loginButton = "Login"; 5 | static const String hello = "Hello!"; 6 | static const String welcomeTo = "Let's "; 7 | static const String ftf = "Build Together !"; 8 | static const String subscribeText = 9 | "Don't forget to Subscribe to our newsletter"; 10 | static const String email_hint = "Email address please"; 11 | static const String subscribeButton = "Subscribe"; 12 | 13 | // static const String backgroundImage = "assets/flutter_image.jpg"; 14 | static const String backgroundImage = "assets/images/lego.png"; 15 | static const String logoImage = "assets/images/bird.jpg"; 16 | static const String emailImage = "assets/images/email.png"; 17 | static const String menuImage = "assets/images/menu.png"; 18 | } 19 | -------------------------------------------------------------------------------- /landingpage/lib/utils/themes.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/utils/myColors.dart'; 3 | 4 | class MyAppThemes { 5 | static ThemeData AppThemeBlue(BuildContext context) { 6 | return ThemeData( 7 | // Define the default brightness and colors for the overall app. 8 | brightness: Brightness.light, 9 | primaryColor: MyColors.blue1, 10 | secondaryHeaderColor: MyColors.blue2, 11 | accentColor: MyColors.blue3, 12 | 13 | // I used custom font for the default font family. 14 | fontFamily: 'Montserrat-Regular', 15 | 16 | textTheme: getDefaultTextTheme(context), 17 | ); 18 | } 19 | 20 | static ThemeData AppThemeGreen(BuildContext context) { 21 | return ThemeData( 22 | // Define the default brightness and colors for the overall app. 23 | brightness: Brightness.light, 24 | primaryColor: MyColors.green1, 25 | secondaryHeaderColor: MyColors.green2, 26 | accentColor: MyColors.green3, 27 | 28 | fontFamily: 'Fresca', 29 | textTheme: getItalicTitleTextTheme(context), 30 | ); 31 | } 32 | 33 | static ThemeData AppThemePurple(BuildContext context) { 34 | return ThemeData( 35 | // Define the default brightness and colors for the overall app. 36 | brightness: Brightness.light, 37 | primaryColor: MyColors.purple1, 38 | secondaryHeaderColor: MyColors.purple2, 39 | accentColor: MyColors.purple3, 40 | 41 | textTheme: getDefaultTextTheme(context), 42 | ); 43 | } 44 | 45 | // Define the default TextTheme for headline, title and body text 46 | static TextTheme getDefaultTextTheme(BuildContext context) { 47 | return TextTheme( 48 | headline: TextStyle(fontSize: 36.0, fontWeight: FontWeight.bold), 49 | title: TextStyle( 50 | fontSize: 20.0, 51 | fontStyle: FontStyle.normal, 52 | fontWeight: FontWeight.bold), 53 | body1: TextStyle( 54 | fontSize: 26.0, 55 | fontStyle: FontStyle.italic, 56 | fontWeight: FontWeight.normal), 57 | ); 58 | } 59 | 60 | //Example of extending the parent theme. Overwrites textTheme with given attributes 61 | static TextTheme getItalicTitleTextTheme(BuildContext context) { 62 | return Theme.of(context).textTheme.copyWith( 63 | title: TextStyle( 64 | fontSize: 20.0, 65 | fontStyle: FontStyle.italic, 66 | fontWeight: FontWeight.bold), 67 | ); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /landingpage/lib/utils/widgets_lib.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../router.dart'; 4 | import 'myColors.dart'; 5 | 6 | Widget factBot(BuildContext context) { 7 | return Container( 8 | alignment: Alignment.bottomRight, 9 | child: FloatingActionButton( 10 | materialTapTargetSize: MaterialTapTargetSize.padded, 11 | child: Center( 12 | child: Icon(Icons.chat), 13 | ), 14 | elevation: 4.0, 15 | backgroundColor: MyColors.blue1, 16 | onPressed: () => Navigator.pushNamed(context, FACTS_DIALOGFLOW), 17 | )); 18 | } 19 | 20 | class LogInButton extends StatelessWidget { 21 | LogInButton( 22 | {this.key, this.text, this.height, this.onPressed, this.backgroundColor}) 23 | : super(key: key); 24 | Key key; 25 | String text; 26 | double height; 27 | VoidCallback onPressed; 28 | Color backgroundColor; 29 | 30 | @override 31 | Widget build(BuildContext context) { 32 | return new ConstrainedBox( 33 | constraints: BoxConstraints.expand(height: height), 34 | child: new RaisedButton( 35 | child: new Text(text, 36 | style: TextStyle(color: Colors.white, fontSize: 20.0)), 37 | shape: new RoundedRectangleBorder( 38 | borderRadius: BorderRadius.all(Radius.circular(height / 4))), 39 | color: backgroundColor, 40 | textColor: Colors.black87, 41 | onPressed: onPressed), 42 | ); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/body.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/utils/responsive_widget.dart'; 3 | 4 | import 'large_screen.dart'; 5 | import 'small_screen.dart'; 6 | 7 | class Body extends StatelessWidget { 8 | @override 9 | Widget build(BuildContext context) { 10 | return ResponsiveWidget( 11 | largeScreen: LargeScreen(), 12 | smallScreen: SmallScreen(), 13 | ); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/dialog_flow.dart: -------------------------------------------------------------------------------- 1 | //import 'package:flutter_dialogflow/dialogflow_v2.dart'; 2 | //import 'package:flutter_web/material.dart'; 3 | // 4 | //import 'fact_message.dart'; 5 | // 6 | //class FlutterFactsDialogFlow extends StatefulWidget { 7 | // FlutterFactsDialogFlow({Key key, this.title}) : super(key: key); 8 | // 9 | // final String title; 10 | // 11 | // @override 12 | // _FlutterFactsDialogFlowState createState() => new _FlutterFactsDialogFlowState(); 13 | //} 14 | // 15 | //class _FlutterFactsDialogFlowState extends State { 16 | // final List _messages = []; 17 | // final TextEditingController _textController = new TextEditingController(); 18 | // 19 | // Widget _queryInputWidget(BuildContext context) { 20 | // return Container( 21 | // child: Container( 22 | // margin: EdgeInsets.symmetric(horizontal: 8.0, vertical: 8.0), 23 | // child: Row( 24 | // children: [ 25 | // Flexible( 26 | // child: TextField( 27 | // controller: _textController, 28 | // onSubmitted: _submitQuery, 29 | // decoration: InputDecoration.collapsed(hintText: "Send a message"), 30 | // ), 31 | // ), 32 | // Container( 33 | // margin: EdgeInsets.symmetric(horizontal: 4.0), 34 | // child: IconButton( 35 | // icon: Icon(Icons.send), 36 | // onPressed: () => _submitQuery(_textController.text)), 37 | // ), 38 | // ], 39 | // ), 40 | // ), 41 | // ); 42 | // } 43 | // 44 | // void _dialogFlowResponse(query) async { 45 | // _textController.clear(); 46 | // AuthGoogle authGoogle = 47 | // await AuthGoogle(fileJson: "assets/flutter-to-fly-creds.json").build(); 48 | // Dialogflow dialogFlow = 49 | // Dialogflow(authGoogle: authGoogle, language: Language.english); 50 | // AIResponse response = await dialogFlow.detectIntent(query); 51 | // FactsMessage message = FactsMessage( 52 | // text: response.getMessage() ?? 53 | // CardDialogflow(response.getListMessage()[0]).title, 54 | // name: "Flutter Bot", 55 | // type: false, 56 | // ); 57 | // setState(() { 58 | // _messages.insert(0, message); 59 | // }); 60 | // } 61 | // 62 | // void _submitQuery(String text) { 63 | // _textController.clear(); 64 | // FactsMessage message = new FactsMessage( 65 | // text: text, 66 | // name: "Priyanka", 67 | // type: true, 68 | // ); 69 | // setState(() { 70 | // _messages.insert(0, message); 71 | // }); 72 | // _dialogFlowResponse(text); 73 | // } 74 | // 75 | // @override 76 | // Widget build(BuildContext context) { 77 | // return Scaffold( 78 | // appBar: AppBar( 79 | // centerTitle: true, 80 | // title: Text("Flutter Facts"), 81 | // ), 82 | // body: Column(children: [ 83 | // Flexible( 84 | // child: ListView.builder( 85 | // padding: EdgeInsets.all(8.0), 86 | // reverse: true, //To keep the latest messages at the bottom 87 | // itemBuilder: (_, int index) => _messages[index], 88 | // itemCount: _messages.length, 89 | // )), 90 | // Divider(height: 1.0), 91 | // Container( 92 | // decoration: new BoxDecoration(color: Theme.of(context).cardColor), 93 | // child: _queryInputWidget(context), 94 | // ), 95 | // ]), 96 | // ); 97 | // } 98 | //} 99 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/emailBox.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/utils/myColors.dart'; 3 | import 'package:landingpage/utils/responsive_widget.dart'; 4 | import 'package:landingpage/utils/strings.dart'; 5 | import 'package:landingpage/widgets/susbcribe_button.dart'; 6 | 7 | class EmailBox extends StatelessWidget { 8 | @override 9 | Widget build(BuildContext context) { 10 | return Padding( 11 | padding: EdgeInsets.only( 12 | left: 4.0, 13 | right: ResponsiveWidget.isSmallScreen(context) ? 4 : 74, 14 | top: 10, 15 | bottom: 40), 16 | child: Container( 17 | height: 60, 18 | decoration: BoxDecoration( 19 | color: MyColors.white1, 20 | borderRadius: BorderRadius.circular(20), 21 | boxShadow: [ 22 | BoxShadow( 23 | color: Colors.black12, offset: Offset(0, 8), blurRadius: 8) 24 | ]), 25 | child: Padding( 26 | padding: EdgeInsets.symmetric(horizontal: 20), 27 | child: Row( 28 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 29 | children: [ 30 | Expanded( 31 | flex: 8, 32 | child: TextField( 33 | decoration: InputDecoration( 34 | border: InputBorder.none, 35 | hintText: Strings.email_hint, 36 | hintStyle: TextStyle(fontFamily: 'Fresca', fontSize: 18)), 37 | ), 38 | ), 39 | Expanded( 40 | flex: 2, 41 | child: 42 | //Example of applying local themes to a certain widget in app 43 | Theme( 44 | data: ThemeData( 45 | primaryColor: MyColors.orange1, 46 | secondaryHeaderColor: MyColors.orange2, 47 | accentColor: MyColors.orange3, 48 | ), 49 | child: SubscribeButton(), 50 | )) 51 | ], 52 | ), 53 | ), 54 | ), 55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/fact_message.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class FactsMessage extends StatelessWidget { 4 | FactsMessage({this.text, this.name, this.type}); 5 | 6 | final String text; 7 | final String name; 8 | final bool type; 9 | 10 | List botMessage(context) { 11 | return [ 12 | Container( 13 | margin: const EdgeInsets.only(right: 16.0), 14 | child: CircleAvatar(child: Text('Bot')), 15 | ), 16 | Expanded( 17 | child: Column( 18 | crossAxisAlignment: CrossAxisAlignment.start, 19 | children: [ 20 | Text(this.name, style: TextStyle(fontWeight: FontWeight.bold)), 21 | Container( 22 | margin: const EdgeInsets.only(top: 5.0), 23 | child: Text(text), 24 | ), 25 | ], 26 | ), 27 | ), 28 | ]; 29 | } 30 | 31 | List userMessage(context) { 32 | return [ 33 | Expanded( 34 | child: Column( 35 | crossAxisAlignment: CrossAxisAlignment.end, 36 | children: [ 37 | Text(this.name, style: Theme.of(context).textTheme.subhead), 38 | Container( 39 | margin: const EdgeInsets.only(top: 5.0), 40 | child: Text(text), 41 | ), 42 | ], 43 | ), 44 | ), 45 | Container( 46 | margin: const EdgeInsets.only(left: 16.0), 47 | child: CircleAvatar(child: new Text(this.name[0])), 48 | ), 49 | ]; 50 | } 51 | 52 | @override 53 | Widget build(BuildContext context) { 54 | return new Container( 55 | margin: const EdgeInsets.symmetric(vertical: 10.0), 56 | child: new Row( 57 | crossAxisAlignment: CrossAxisAlignment.start, 58 | children: this.type ? userMessage(context) : botMessage(context), 59 | ), 60 | ); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/header.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/plugins/url_launcher/url_launcher.dart'; 3 | import 'package:landingpage/router.dart' as router; 4 | import 'package:landingpage/utils/myColors.dart'; 5 | import 'package:landingpage/utils/responsive_widget.dart'; 6 | import 'package:landingpage/utils/strings.dart'; 7 | //import 'dart:html' as html; 8 | 9 | import '../utils/display_util.dart'; 10 | 11 | class HeaderWidget extends StatefulWidget { 12 | @override 13 | _HeaderWidgetState createState() => _HeaderWidgetState(); 14 | } 15 | 16 | class _HeaderWidgetState extends State { 17 | var links = ["Home", "Github", "Videos", "Jobs"]; 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Padding( 22 | padding: EdgeInsets.symmetric(horizontal: 45, vertical: 38), 23 | child: buildHeader(context), 24 | ); 25 | } 26 | 27 | Widget buildHeader(BuildContext context) { 28 | return Row( 29 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 30 | children: [buildLogo(context), buildHeaderLinks(context)], 31 | ); 32 | } 33 | 34 | //Builds navigation links at the right top of landing page 35 | Widget buildHeaderLinks(BuildContext context) { 36 | if (!ResponsiveWidget.isSmallScreen(context)) { 37 | return Row( 38 | mainAxisAlignment: MainAxisAlignment.spaceAround, 39 | children: getLinksListing(context)..add(buildLoginButton(context)), 40 | ); 41 | } else { 42 | return PopupMenuButton( 43 | //child: Image.network("assets/menu.png", width: 25, height: 25), 44 | child: Image.asset(Strings.menuImage, width: 25, height: 25), 45 | onSelected: (NavLinks value) { 46 | setState(() { 47 | openLink(value); 48 | }); 49 | }, 50 | itemBuilder: (BuildContext context) => >[ 51 | const PopupMenuItem( 52 | value: NavLinks.Home, 53 | child: Text( 54 | "Home", 55 | style: 56 | TextStyle(fontFamily: 'Montserrat-Regular', fontSize: 20), 57 | )), 58 | const PopupMenuItem( 59 | value: NavLinks.Github, 60 | child: Text( 61 | "Github", 62 | style: 63 | TextStyle(fontFamily: 'Montserrat-Regular', fontSize: 20), 64 | )), 65 | const PopupMenuItem( 66 | value: NavLinks.Videos, 67 | child: Text("Videos", 68 | style: TextStyle( 69 | fontFamily: 'Montserrat-Regular', fontSize: 20))), 70 | const PopupMenuItem( 71 | value: NavLinks.Resources, 72 | child: Text("Resources", 73 | style: TextStyle( 74 | fontFamily: 'Montserrat-Regular', fontSize: 20))), 75 | const PopupMenuItem( 76 | value: NavLinks.Jobs, 77 | child: Text("Jobs", 78 | style: TextStyle( 79 | fontFamily: 'Montserrat-Regular', fontSize: 20))), 80 | PopupMenuItem(value: NavLinks.LogIn, child: buildLoginButton(context)) 81 | ], 82 | ); 83 | } 84 | } 85 | 86 | bool isNotNavLinksLogin(link) { 87 | return link != NavLinks.LogIn; 88 | } 89 | 90 | //Builds navigation list for header 91 | List getLinksListing(BuildContext context) { 92 | return NavLinks.values.where((link) => link != NavLinks.LogIn).map((link) { 93 | return Padding( 94 | padding: EdgeInsets.only(left: 18), 95 | child: InkWell( 96 | hoverColor: Theme.of(context).primaryColor, 97 | highlightColor: Theme.of(context).secondaryHeaderColor, 98 | splashColor: Theme.of(context).primaryColor, 99 | borderRadius: BorderRadius.circular(20.0), 100 | child: Text( 101 | displayString(link), 102 | //style: Theme.of(context).textTheme.title, 103 | style: TextStyle( 104 | fontFamily: 'Montserrat-Regular', 105 | fontSize: 20, 106 | fontStyle: FontStyle.normal), 107 | ), 108 | onTap: () { 109 | openLink(link); 110 | })); 111 | }).toList(); 112 | } 113 | 114 | void openLink(NavLinks link) { 115 | if (link == NavLinks.Resources) { 116 | //open Resource page 117 | Navigator.pushNamed(context, router.FLUTTER_RESOURCES); 118 | } else { 119 | UrlUtils.open(getTargetUrl(link), name: displayString(link)); 120 | //html.window.open(getTargetUrl(link), displayString(link)); 121 | } 122 | } 123 | 124 | String getTargetUrl(NavLinks link) { 125 | String url = ""; 126 | 127 | switch (link) { 128 | case NavLinks.Home: 129 | url = "https://flutter-to-fly.firebaseapp.com"; 130 | break; 131 | 132 | case NavLinks.Github: 133 | url = "https://github.com/ptyagicodecamp"; 134 | break; 135 | 136 | case NavLinks.Videos: 137 | url = 138 | "https://www.youtube.com/channel/UCO3_dbHasEnA2dr_U0EhMAA/videos?view_as=subscriber"; 139 | break; 140 | 141 | case NavLinks.Jobs: 142 | url = "https://flutterjobs.info"; 143 | break; 144 | 145 | default: 146 | url = "https://flutter-to-fly.firebaseapp.com"; 147 | } 148 | 149 | return url; 150 | } 151 | 152 | //Builds and decorates login button 153 | Widget buildLoginButton(BuildContext context) { 154 | return Padding( 155 | padding: EdgeInsets.all(8.0), 156 | child: InkWell( 157 | onTap: () { 158 | Navigator.pushNamed(context, router.FIREBASE_LOGIN); 159 | }, 160 | child: Container( 161 | margin: EdgeInsets.only(left: 20), 162 | width: 120, 163 | height: 40, 164 | decoration: BoxDecoration( 165 | gradient: LinearGradient(colors: [ 166 | Theme.of(context).primaryColor, 167 | Theme.of(context).secondaryHeaderColor 168 | ], begin: Alignment.bottomRight, end: Alignment.topLeft), 169 | borderRadius: BorderRadius.circular(20), 170 | boxShadow: [ 171 | BoxShadow( 172 | color: Theme.of(context).accentColor.withOpacity(0.3), 173 | offset: Offset(0, 8), //Shadow starts at x=0, y=8 174 | blurRadius: 8) 175 | ]), 176 | child: Material( 177 | color: Colors.transparent, 178 | child: Center( 179 | child: Text( 180 | Strings.loginButton, 181 | style: TextStyle( 182 | color: MyColors.white1, fontSize: 18, letterSpacing: 1), 183 | ), 184 | ), 185 | ), 186 | ), 187 | ), 188 | ); 189 | } 190 | 191 | //Builds rectangle with circular corners and Text on it and next to it as title 192 | Widget buildLogo(BuildContext context) { 193 | return Row( 194 | children: [ 195 | Container( 196 | width: 50, 197 | height: 50, 198 | child: Center( 199 | child: Image.asset(Strings.logoImage), 200 | ), 201 | ), 202 | //give some space between logo box and title 203 | SizedBox( 204 | width: 16, 205 | ), 206 | Text( 207 | Strings.appTitle, 208 | style: TextStyle(fontFamily: 'Indie Flower', fontSize: 26), 209 | ) 210 | ], 211 | ); 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/large_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/utils/myColors.dart'; 3 | import 'package:landingpage/utils/strings.dart'; 4 | import 'package:landingpage/widgets/emailBox.dart'; 5 | 6 | class LargeScreen extends StatelessWidget { 7 | @override 8 | Widget build(BuildContext context) { 9 | return SizedBox( 10 | height: 600, 11 | child: Stack( 12 | fit: StackFit.loose, 13 | children: [ 14 | addBackground(), 15 | addWelcomeText(context), 16 | ], 17 | ), 18 | ); 19 | } 20 | 21 | //Adds background Image 22 | Widget addBackground() { 23 | return FractionallySizedBox( 24 | alignment: Alignment.centerRight, //to keep images aligned to right 25 | widthFactor: .6, //covers about 60% of the screen width 26 | child: Image.asset( 27 | Strings.backgroundImage, 28 | scale: .85, 29 | ), 30 | ); 31 | } 32 | 33 | //Adds welcome text 34 | Widget addWelcomeText(BuildContext context) { 35 | return Column( 36 | children: [ 37 | FractionallySizedBox( 38 | alignment: Alignment.centerLeft, //text aligned to left side 39 | widthFactor: .6, //covers about half of the screen 40 | child: Padding( 41 | padding: EdgeInsets.only(left: 48), 42 | child: Column( 43 | crossAxisAlignment: CrossAxisAlignment.start, 44 | mainAxisAlignment: MainAxisAlignment.center, 45 | children: [ 46 | Text( 47 | Strings.hello, 48 | style: TextStyle( 49 | fontWeight: FontWeight.bold, 50 | fontSize: 60, 51 | color: MyColors.blue4, 52 | ), 53 | ), 54 | RichText( 55 | text: TextSpan( 56 | text: Strings.welcomeTo, 57 | style: TextStyle(fontSize: 60, color: MyColors.blue4), 58 | children: [ 59 | TextSpan( 60 | text: Strings.ftf, 61 | style: TextStyle( 62 | fontSize: 60, 63 | fontWeight: FontWeight.bold, 64 | color: Colors.black54)) 65 | ]), 66 | ), 67 | Padding( 68 | padding: EdgeInsets.only(left: 12.0, top: 10), 69 | child: Text( 70 | Strings.subscribeText, 71 | style: TextStyle(fontFamily: 'Indie Flower'), 72 | ), 73 | ), 74 | SizedBox( 75 | height: 200, 76 | ), //Give some spacing 77 | EmailBox(), 78 | ], 79 | ), 80 | ), 81 | ), 82 | // Padding( 83 | // padding: EdgeInsets.all(8.0), 84 | // child: factBot(context), 85 | // ), 86 | ], 87 | ); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/small_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/utils/myColors.dart'; 3 | import 'package:landingpage/utils/strings.dart'; 4 | import 'package:landingpage/utils/widgets_lib.dart'; 5 | 6 | import 'emailBox.dart'; 7 | 8 | class SmallScreen extends StatelessWidget { 9 | @override 10 | Widget build(BuildContext context) { 11 | return SingleChildScrollView( 12 | child: Column( 13 | children: [ 14 | Padding( 15 | padding: EdgeInsets.all(40), 16 | child: Column( 17 | crossAxisAlignment: CrossAxisAlignment.start, 18 | children: [ 19 | Text( 20 | Strings.hello, 21 | style: TextStyle( 22 | fontWeight: FontWeight.bold, 23 | fontSize: 40, 24 | color: MyColors.blue4, 25 | ), 26 | ), 27 | RichText( 28 | text: TextSpan( 29 | text: Strings.welcomeTo, 30 | style: TextStyle(fontSize: 40, color: MyColors.blue4), 31 | children: [ 32 | TextSpan( 33 | text: Strings.ftf, 34 | style: TextStyle( 35 | fontSize: 40, 36 | fontWeight: FontWeight.bold, 37 | color: Colors.black54)) 38 | ]), 39 | ), 40 | SizedBox( 41 | height: 30, 42 | ), 43 | Center( 44 | child: Image.asset( 45 | Strings.backgroundImage, 46 | scale: 1, 47 | ), 48 | ), 49 | Padding( 50 | padding: EdgeInsets.only(left: 12.0, top: 20), 51 | child: Text( 52 | Strings.subscribeText, 53 | style: TextStyle(fontFamily: 'Indie Flower'), 54 | ), 55 | ), 56 | SizedBox( 57 | height: 30, 58 | ), 59 | EmailBox(), 60 | SizedBox( 61 | height: 30, 62 | ), 63 | ], 64 | ), 65 | ), 66 | Padding( 67 | padding: EdgeInsets.all(8.0), 68 | child: factBot(context), 69 | ), 70 | ], 71 | ), 72 | ); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/susbcribe_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:landingpage/utils/myColors.dart'; 3 | import 'package:landingpage/utils/responsive_widget.dart'; 4 | import 'package:landingpage/utils/strings.dart'; 5 | 6 | class SubscribeButton extends StatelessWidget { 7 | @override 8 | Widget build(BuildContext context) { 9 | return InkWell( 10 | child: Container( 11 | height: 40, 12 | decoration: BoxDecoration( 13 | gradient: LinearGradient(colors: [ 14 | Theme.of(context).primaryColor, 15 | Theme.of(context).secondaryHeaderColor 16 | ], begin: Alignment.bottomRight, end: Alignment.topLeft), 17 | borderRadius: BorderRadius.circular(20.0), 18 | boxShadow: [ 19 | BoxShadow( 20 | color: Theme.of(context).accentColor.withOpacity(.3), 21 | offset: Offset(0, 8), 22 | blurRadius: 8.0) 23 | ]), 24 | child: Material( 25 | color: Colors.transparent, 26 | child: InkWell( 27 | onTap: () {}, //TODO 28 | child: Center( 29 | child: buildButton(context), 30 | ), 31 | ), 32 | ), 33 | ), 34 | ); 35 | } 36 | 37 | Widget buildButton(BuildContext context) { 38 | if (ResponsiveWidget.isSmallScreen(context)) 39 | return buildSmallButton(context); 40 | else 41 | return buildLargeButton(context); 42 | } 43 | 44 | Widget buildLargeButton(BuildContext context) { 45 | return Row( 46 | mainAxisAlignment: MainAxisAlignment.center, 47 | children: [ 48 | Text( 49 | Strings.subscribeButton, 50 | style: TextStyle( 51 | color: MyColors.white1, 52 | fontSize: ResponsiveWidget.isSmallScreen(context) 53 | ? 12 54 | : ResponsiveWidget.isMediumScreen(context) ? 12 : 16, 55 | letterSpacing: 1), 56 | ), 57 | SizedBox( 58 | width: ResponsiveWidget.isSmallScreen(context) 59 | ? 4 60 | : ResponsiveWidget.isMediumScreen(context) ? 6 : 8, 61 | ), 62 | Image.asset( 63 | Strings.emailImage, 64 | color: MyColors.white1, 65 | width: ResponsiveWidget.isSmallScreen(context) 66 | ? 12 67 | : ResponsiveWidget.isMediumScreen(context) ? 12 : 20, 68 | height: ResponsiveWidget.isSmallScreen(context) 69 | ? 12 70 | : ResponsiveWidget.isMediumScreen(context) ? 12 : 20, 71 | ) 72 | ], 73 | ); 74 | } 75 | 76 | Widget buildSmallButton(BuildContext context) { 77 | return Row( 78 | mainAxisAlignment: MainAxisAlignment.center, 79 | children: [ 80 | Image.asset( 81 | Strings.emailImage, 82 | color: MyColors.white1, 83 | width: ResponsiveWidget.isSmallScreen(context) 84 | ? 12 85 | : ResponsiveWidget.isMediumScreen(context) ? 12 : 20, 86 | height: ResponsiveWidget.isSmallScreen(context) 87 | ? 12 88 | : ResponsiveWidget.isMediumScreen(context) ? 12 : 20, 89 | ) 90 | ], 91 | ); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /landingpage/lib/widgets/webview.dart: -------------------------------------------------------------------------------- 1 | //import 'package:flutter/material.dart'; 2 | //import 'package:webview_flutter/webview_flutter.dart'; 3 | // 4 | //class MyWebView extends StatelessWidget { 5 | // final String title; 6 | // final String url; 7 | // 8 | // MyWebView({this.title, this.url}); 9 | // 10 | // @override 11 | // Widget build(BuildContext context) { 12 | // //final WebViewArguments args = ModalRoute.of(context).settings.arguments; 13 | // 14 | // return Scaffold( 15 | // appBar: AppBar( 16 | // title: Text(title), 17 | // ), 18 | // body: WebView( 19 | // initialUrl: url, 20 | // javascriptMode: JavascriptMode.unrestricted, 21 | // ), 22 | // ); 23 | // } 24 | //} 25 | // 26 | //class WebViewArguments { 27 | // final String title; 28 | // final String url; 29 | // 30 | // WebViewArguments({this.title, this.url}); 31 | //} 32 | -------------------------------------------------------------------------------- /landingpage/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: landingpage 2 | description: Cross platform sample landing page implemented in Flutter 3 | 4 | version: 1.0.0+1 5 | 6 | environment: 7 | sdk: ">=2.1.0 <3.0.0" 8 | 9 | dependencies: 10 | flutter: 11 | sdk: flutter 12 | 13 | # The following adds the Cupertino Icons font to your application. 14 | # Use with the CupertinoIcons class for iOS style icons. 15 | cupertino_icons: ^0.1.2 16 | # flutter_dialogflow: any #^0.1.2 17 | webview_flutter: ^0.3.10+3 18 | 19 | #firebase auth for Google SignIn 20 | google_sign_in: ^4.0.7 #google signin 21 | provider: ^3.1.0 #ChangeNotifier, Consumer, Providers 22 | #firebase_core: ^0.4.0+9 23 | #firebase_auth: ^0.14.0+4 #user auth 24 | cloud_firestore: ^0.12.9+1 #saving user profiles 25 | 26 | #firebase: ^5.0.4 27 | fb_auth: ^0.0.2+1 28 | 29 | universal_html: ^1.1.0 30 | url_launcher: ^5.1.2 31 | #http: ^0.12.0+2 32 | webfeed: ^0.4.2 33 | 34 | dev_dependencies: 35 | flutter_test: 36 | sdk: flutter 37 | 38 | 39 | # For information on the generic Dart part of this file, see the 40 | # following page: https://dart.dev/tools/pub/pubspec 41 | 42 | # The following section is specific to Flutter. 43 | flutter: 44 | 45 | # The following line ensures that the Material Icons font is 46 | # included with your application, so that you can use the icons in 47 | # the material Icons class. 48 | uses-material-design: true 49 | 50 | # To add assets to your application, add an assets section, like this: 51 | assets: 52 | - assets/flutter-to-fly-creds.json 53 | - assets/images/ 54 | 55 | fonts: 56 | - family: Indie Flower 57 | fonts: 58 | - asset: assets/fonts/IndieFlower.ttf 59 | - family: Fresca 60 | fonts: 61 | - asset: assets/fonts/Fresca-Regular.ttf 62 | - family: Montserrat-Medium 63 | fonts: 64 | - asset: assets/fonts/Montserrat-Medium.ttf 65 | - family: Montserrat-Regular 66 | fonts: 67 | - asset: assets/fonts/Montserrat-Regular.ttf 68 | - family: Roboto-Regular 69 | fonts: 70 | - asset: assets/fonts/Roboto-Regular.ttf 71 | 72 | 73 | 74 | 75 | # An image asset can refer to one or more resolution-specific "variants", see 76 | # https://flutter.dev/assets-and-images/#resolution-aware. 77 | 78 | # For details regarding adding assets from package dependencies, see 79 | # https://flutter.dev/assets-and-images/#from-packages 80 | 81 | # To add custom fonts to your application, add a fonts section here, 82 | # in this "flutter" section. Each entry in this list should have a 83 | # "family" key with the font family name, and a "fonts" key with a 84 | # list giving the asset and other descriptors for the font. For 85 | # example: 86 | # fonts: 87 | # - family: Schyler 88 | # fonts: 89 | # - asset: fonts/Schyler-Regular.ttf 90 | # - asset: fonts/Schyler-Italic.ttf 91 | # style: italic 92 | # - family: Trajan Pro 93 | # fonts: 94 | # - asset: fonts/TrajanPro.ttf 95 | # - asset: fonts/TrajanPro_Bold.ttf 96 | # weight: 700 97 | # 98 | # For details regarding fonts from package dependencies, 99 | # see https://flutter.dev/custom-fonts/#from-packages 100 | -------------------------------------------------------------------------------- /landingpage/pubspec.yaml.native: -------------------------------------------------------------------------------- 1 | name: landingpage 2 | description: Cross platform sample landing page implemented in Flutter 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # In Android, build-name is used as versionName while build-number used as versionCode. 10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 12 | # Read more about iOS versioning at 13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 14 | version: 1.0.0+1 15 | 16 | environment: 17 | sdk: ">=2.1.0 <3.0.0" 18 | 19 | dependencies: 20 | flutter: 21 | sdk: flutter 22 | 23 | # The following adds the Cupertino Icons font to your application. 24 | # Use with the CupertinoIcons class for iOS style icons. 25 | cupertino_icons: ^0.1.2 26 | flutter_dialogflow: ^0.1.2 27 | 28 | dev_dependencies: 29 | flutter_test: 30 | sdk: flutter 31 | 32 | 33 | # For information on the generic Dart part of this file, see the 34 | # following page: https://dart.dev/tools/pub/pubspec 35 | 36 | # The following section is specific to Flutter. 37 | flutter: 38 | 39 | # The following line ensures that the Material Icons font is 40 | # included with your application, so that you can use the icons in 41 | # the material Icons class. 42 | uses-material-design: true 43 | 44 | # To add assets to your application, add an assets section, like this: 45 | assets: 46 | - assets/email.png 47 | - assets/flutter_image.jpg 48 | - assets/menu.png 49 | - assets/flutter-to-fly-creds.json 50 | 51 | fonts: 52 | - family: Indie Flower 53 | fonts: 54 | - asset: fonts/IndieFlower.ttf 55 | 56 | 57 | # An image asset can refer to one or more resolution-specific "variants", see 58 | # https://flutter.dev/assets-and-images/#resolution-aware. 59 | 60 | # For details regarding adding assets from package dependencies, see 61 | # https://flutter.dev/assets-and-images/#from-packages 62 | 63 | # To add custom fonts to your application, add a fonts section here, 64 | # in this "flutter" section. Each entry in this list should have a 65 | # "family" key with the font family name, and a "fonts" key with a 66 | # list giving the asset and other descriptors for the font. For 67 | # example: 68 | # fonts: 69 | # - family: Schyler 70 | # fonts: 71 | # - asset: fonts/Schyler-Regular.ttf 72 | # - asset: fonts/Schyler-Italic.ttf 73 | # style: italic 74 | # - family: Trajan Pro 75 | # fonts: 76 | # - asset: fonts/TrajanPro.ttf 77 | # - asset: fonts/TrajanPro_Bold.ttf 78 | # weight: 700 79 | # 80 | # For details regarding fonts from package dependencies, 81 | # see https://flutter.dev/custom-fonts/#from-packages 82 | -------------------------------------------------------------------------------- /landingpage/pubspec.yaml.web: -------------------------------------------------------------------------------- 1 | name: landingpage 2 | description: Cross platform sample landing page implemented in Flutter 3 | 4 | version: 1.0.0+1 5 | 6 | environment: 7 | sdk: ">=2.3.0-dev.68.0 <3.0.0" 8 | 9 | dependencies: 10 | flutter_web: any 11 | flutter_web_ui: any 12 | firebase: any 13 | service_worker: ^0.2.0 14 | googleapis_auth: ^0.2.3+5 15 | provider: any 16 | http: 0.12.0+2 17 | webfeed: ^0.4.2 18 | html_unescape: ^1.0.1+3 19 | 20 | dev_dependencies: 21 | #dependencies to enable the Dart web build system 22 | build_runner: ^1.4.0 # ^1.3.5 (building site) 23 | build_web_compilers: ^2.0.0 24 | flutter_web_test: any 25 | #webfeed: any 26 | 27 | 28 | #flutter: 29 | # uses-material-design: true 30 | 31 | ## These overrides tell the package tools to get them from GitHub 32 | dependency_overrides: 33 | # http: 34 | # git: 35 | # url: https://github.com/dart-lang/http 36 | # 37 | # webfeed: 38 | # git: 39 | # url: https://github.com/witochandra/webfeed 40 | # 41 | # service_worker: 42 | # git: 43 | # url: https://github.com/isoos/service_worker 44 | # 45 | # googleapis_auth: 46 | # git: 47 | # url: https://github.com/dart-lang/googleapis_auth 48 | 49 | provider: 50 | git: 51 | url: https://github.com/kevmoo/provider 52 | ref: flutter_web 53 | 54 | firebase: 55 | git: 56 | url: https://github.com/FirebaseExtended/firebase-dart 57 | flutter_web: 58 | git: 59 | url: https://github.com/flutter/flutter_web 60 | path: packages/flutter_web 61 | flutter_web_ui: 62 | git: 63 | url: https://github.com/flutter/flutter_web 64 | path: packages/flutter_web_ui 65 | flutter_web_test: 66 | git: 67 | url: https://github.com/flutter/flutter_web 68 | path: packages/flutter_web_test -------------------------------------------------------------------------------- /landingpage/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 | //Note: This needs to be changed to flutter package for Native apps 9 | import 'package:flutter/material.dart'; 10 | import 'package:flutter_test/flutter_test.dart'; 11 | import 'package:landingpage/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 | -------------------------------------------------------------------------------- /landingpage/web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Login 6 | 7 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /samples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "sourcePath": "lib/src/material/floating_action_button.dart", 4 | "sourceLine": 118, 5 | "serial": "1", 6 | "package": "flutter", 7 | "library": "material", 8 | "element": "FloatingActionButton", 9 | "id": "material.FloatingActionButton.1", 10 | "file": "material.FloatingActionButton.1.dart", 11 | "description": "This example shows how to make a simple [FloatingActionButton] in a\n[Scaffold], with a pink [backgroundColor] and a thumbs up [Icon]." 12 | }, 13 | { 14 | "sourcePath": "lib/src/material/dropdown.dart", 15 | "sourceLine": 581, 16 | "serial": "1", 17 | "package": "flutter", 18 | "library": "material", 19 | "element": "DropdownButton", 20 | "id": "material.DropdownButton.1", 21 | "file": "material.DropdownButton.1.dart", 22 | "description": "This sample shows a `DropdownButton` whose value is one of\n\"One\", \"Two\", \"Free\", or \"Four\"." 23 | }, 24 | { 25 | "sourcePath": "lib/src/material/raised_button.dart", 26 | "sourceLine": 101, 27 | "serial": "1", 28 | "package": "flutter", 29 | "library": "material", 30 | "element": "RaisedButton", 31 | "id": "material.RaisedButton.1", 32 | "file": "material.RaisedButton.1.dart", 33 | "description": "This sample shows how to render a disabled RaisedButton, an enabled RaisedButton\nand lastly a RaisedButton with gradient background.\n\n![Three raised buttons, one enabled, another disabled, and the last one\nstyled with a blue gradient background](https://flutter.github.io/assets-for-api-docs/assets/material/raised_button.png)" 34 | }, 35 | { 36 | "sourcePath": "lib/src/material/checkbox_list_tile.dart", 37 | "sourceLine": 250, 38 | "serial": "3", 39 | "package": "flutter", 40 | "library": "material", 41 | "element": "CheckboxListTile", 42 | "id": "material.CheckboxListTile.3", 43 | "file": "material.CheckboxListTile.3.dart", 44 | "description": "![Custom checkbox list tile sample](https://flutter.github.io/assets-for-api-docs/assets/material/checkbox_list_tile_custom.png)\n\nHere is an example of a custom LabeledCheckbox widget, but you can easily\nmake your own configurable widget." 45 | }, 46 | { 47 | "sourcePath": "lib/src/material/chip.dart", 48 | "sourceLine": 219, 49 | "serial": "1", 50 | "package": "flutter", 51 | "library": "chip", 52 | "element": "DeletableChipAttributes.onDeleted", 53 | "id": "chip.DeletableChipAttributes.onDeleted.1", 54 | "file": "chip.DeletableChipAttributes.onDeleted.1.dart", 55 | "description": "This sample shows how to use [onDeleted] to remove an entry when the\ndelete button is tapped." 56 | }, 57 | { 58 | "sourcePath": "lib/src/material/expansion_panel.dart", 59 | "sourceLine": 309, 60 | "serial": "1", 61 | "package": "flutter", 62 | "library": "material", 63 | "element": "ExpansionPanelList.radio", 64 | "id": "material.ExpansionPanelList.radio.1", 65 | "file": "material.ExpansionPanelList.radio.1.dart", 66 | "description": "Here is a simple example of how to implement ExpansionPanelList.radio." 67 | }, 68 | { 69 | "sourcePath": "lib/src/widgets/single_child_scroll_view.dart", 70 | "sourceLine": 196, 71 | "serial": "1", 72 | "package": "flutter", 73 | "library": "widgets", 74 | "element": "SingleChildScrollView", 75 | "id": "widgets.SingleChildScrollView.1", 76 | "file": "widgets.SingleChildScrollView.1.dart", 77 | "description": "In this example, the children are spaced out equally, unless there's no more\nroom, in which case they stack vertically and scroll.\n\nWhen using this technique, [Expanded] and [Flexible] are not useful, because\nin both cases the \"available space\" is infinite (since this is in a viewport).\nThe next section describes a technique for providing a maximum height constraint." 78 | }, 79 | { 80 | "sourcePath": "lib/src/material/scaffold.dart", 81 | "sourceLine": 1182, 82 | "serial": "2", 83 | "package": "flutter", 84 | "library": "material", 85 | "element": "Scaffold.of", 86 | "id": "material.Scaffold.of.2", 87 | "file": "material.Scaffold.of.2.dart", 88 | "description": "When the [Scaffold] is actually created in the same `build` function, the\n`context` argument to the `build` function can't be used to find the\n[Scaffold] (since it's \"above\" the widget being returned in the widget\ntree). In such cases, the following technique with a [Builder] can be used\nto provide a new scope with a [BuildContext] that is \"under\" the\n[Scaffold]:" 89 | }, 90 | { 91 | "sourcePath": "lib/src/material/expansion_panel.dart", 92 | "sourceLine": 217, 93 | "serial": "1", 94 | "package": "flutter", 95 | "library": "material", 96 | "element": "ExpansionPanelList", 97 | "id": "material.ExpansionPanelList.1", 98 | "file": "material.ExpansionPanelList.1.dart", 99 | "description": "Here is a simple example of how to implement ExpansionPanelList." 100 | }, 101 | { 102 | "sourcePath": "lib/src/material/chip.dart", 103 | "sourceLine": 219, 104 | "serial": "1", 105 | "package": "flutter", 106 | "library": "material", 107 | "element": "DeletableChipAttributes.onDeleted", 108 | "id": "material.DeletableChipAttributes.onDeleted.1", 109 | "file": "material.DeletableChipAttributes.onDeleted.1.dart", 110 | "description": "This sample shows how to use [onDeleted] to remove an entry when the\ndelete button is tapped." 111 | }, 112 | { 113 | "sourcePath": "lib/src/widgets/basic.dart", 114 | "sourceLine": 5479, 115 | "serial": "1", 116 | "package": "flutter", 117 | "library": "widgets", 118 | "element": "Listener", 119 | "id": "widgets.Listener.1", 120 | "file": "widgets.Listener.1.dart", 121 | "description": "This example makes a [Container] react to being entered by a mouse\npointer, showing a count of the number of entries and exits." 122 | }, 123 | { 124 | "sourcePath": "lib/src/material/switch_list_tile.dart", 125 | "sourceLine": 255, 126 | "serial": "2", 127 | "package": "flutter", 128 | "library": "material", 129 | "element": "SwitchListTile", 130 | "id": "material.SwitchListTile.2", 131 | "file": "material.SwitchListTile.2.dart", 132 | "description": "![Switch list tile semantics sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile_semantics.png)\n\nHere is an example of a custom labeled radio widget, called\nLinkedLabelRadio, that includes an interactive [RichText] widget that\nhandles tap gestures." 133 | }, 134 | { 135 | "sourcePath": "lib/src/material/floating_action_button.dart", 136 | "sourceLine": 118, 137 | "serial": "2", 138 | "package": "flutter", 139 | "library": "material", 140 | "element": "FloatingActionButton", 141 | "id": "material.FloatingActionButton.2", 142 | "file": "material.FloatingActionButton.2.dart", 143 | "description": "This example shows how to make an extended [FloatingActionButton] in a\n[Scaffold], with a pink [backgroundColor] and a thumbs up [Icon] and a\n[Text] label." 144 | }, 145 | { 146 | "sourcePath": "lib/src/material/switch_list_tile.dart", 147 | "sourceLine": 255, 148 | "serial": "3", 149 | "package": "flutter", 150 | "library": "material", 151 | "element": "SwitchListTile", 152 | "id": "material.SwitchListTile.3", 153 | "file": "material.SwitchListTile.3.dart", 154 | "description": "![Custom switch list tile sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile_custom.png)\n\nHere is an example of a custom LabeledSwitch widget, but you can easily\nmake your own configurable widget." 155 | }, 156 | { 157 | "sourcePath": "lib/src/material/scaffold.dart", 158 | "sourceLine": 887, 159 | "serial": "1", 160 | "package": "flutter", 161 | "library": "material", 162 | "element": "Scaffold", 163 | "id": "material.Scaffold.1", 164 | "file": "material.Scaffold.1.dart", 165 | "description": "This example shows a [Scaffold] with an [AppBar], a [BottomAppBar] and a\n[FloatingActionButton]. The [body] is a [Text] placed in a [Center] in order\nto center the text within the [Scaffold] and the [FloatingActionButton] is\ncentered and docked within the [BottomAppBar] using\n[FloatingActionButtonLocation.centerDocked]. The [FloatingActionButton] is\nconnected to a callback that increments a counter." 166 | }, 167 | { 168 | "sourcePath": "lib/src/widgets/basic.dart", 169 | "sourceLine": 4837, 170 | "serial": "1", 171 | "package": "flutter", 172 | "library": "widgets", 173 | "element": "Flow", 174 | "id": "widgets.Flow.1", 175 | "file": "widgets.Flow.1.dart", 176 | "description": "This example uses the [Flow] widget to create a menu that opens and closes\nas it is interacted with. The color of the button in the menu changes to\nindicate which one has been selected.\n\n{@animation 450 100 https://flutter.github.io/assets-for-api-docs/assets/widgets/flow_menu.mp4}" 177 | }, 178 | { 179 | "sourcePath": "lib/src/material/ink_well.dart", 180 | "sourceLine": 813, 181 | "serial": "1", 182 | "package": "flutter", 183 | "library": "material", 184 | "element": "InkWell", 185 | "id": "material.InkWell.1", 186 | "file": "material.InkWell.1.dart", 187 | "description": "Tap the container to cause it to grow. Then, tap it again and hold before\nthe widget reaches its maximum size to observe the clipped ink splash." 188 | }, 189 | { 190 | "sourcePath": "lib/src/widgets/image.dart", 191 | "sourceLine": 637, 192 | "serial": "1", 193 | "package": "flutter", 194 | "library": "widgets", 195 | "element": "Image.frameBuilder", 196 | "id": "widgets.Image.frameBuilder.1", 197 | "file": "widgets.Image.frameBuilder.1.dart", 198 | "description": "The following sample demonstrates how to use this builder to implement an\nimage that fades in once it's been loaded.\n\nThis sample contains a limited subset of the functionality that the\n[FadeInImage] widget provides out of the box." 199 | }, 200 | { 201 | "sourcePath": "lib/src/material/scaffold.dart", 202 | "sourceLine": 1182, 203 | "serial": "1", 204 | "package": "flutter", 205 | "library": "material", 206 | "element": "Scaffold.of", 207 | "id": "material.Scaffold.of.1", 208 | "file": "material.Scaffold.of.1.dart", 209 | "description": "Typical usage of the [Scaffold.of] function is to call it from within the\n`build` method of a child of a [Scaffold]." 210 | }, 211 | { 212 | "sourcePath": "lib/src/services/keyboard_key.dart", 213 | "sourceLine": 124, 214 | "serial": "1", 215 | "package": "flutter", 216 | "library": "services", 217 | "element": "LogicalKeyboardKey", 218 | "id": "services.LogicalKeyboardKey.1", 219 | "file": "services.LogicalKeyboardKey.1.dart", 220 | "description": "This example shows how to detect if the user has selected the logical \"Q\"\nkey." 221 | }, 222 | { 223 | "sourcePath": "lib/src/material/icon_button.dart", 224 | "sourceLine": 125, 225 | "serial": "1", 226 | "package": "flutter", 227 | "library": "material", 228 | "element": "IconButton", 229 | "id": "material.IconButton.1", 230 | "file": "material.IconButton.1.dart", 231 | "description": "This sample shows an `IconButton` that uses the Material icon \"volume_up\" to\nincrease the volume." 232 | }, 233 | { 234 | "sourcePath": "lib/src/material/radio_list_tile.dart", 235 | "sourceLine": 293, 236 | "serial": "1", 237 | "package": "flutter", 238 | "library": "material", 239 | "element": "RadioListTile", 240 | "id": "material.RadioListTile.1", 241 | "file": "material.RadioListTile.1.dart", 242 | "description": "![RadioListTile sample](https://flutter.github.io/assets-for-api-docs/assets/material/radio_list_tile.png)\n\nThis widget shows a pair of radio buttons that control the `_character`\nfield. The field is of the type `SingingCharacter`, an enum." 243 | }, 244 | { 245 | "sourcePath": "lib/src/widgets/image.dart", 246 | "sourceLine": 705, 247 | "serial": "1", 248 | "package": "flutter", 249 | "library": "widgets", 250 | "element": "Image.loadingBuilder", 251 | "id": "widgets.Image.loadingBuilder.1", 252 | "file": "widgets.Image.loadingBuilder.1.dart", 253 | "description": "The following sample uses [loadingBuilder] to show a\n[CircularProgressIndicator] while an image loads over the network." 254 | }, 255 | { 256 | "sourcePath": "lib/src/widgets/basic.dart", 257 | "sourceLine": 4421, 258 | "serial": "1", 259 | "package": "flutter", 260 | "library": "widgets", 261 | "element": "Expanded", 262 | "id": "widgets.Expanded.1", 263 | "file": "widgets.Expanded.1.dart", 264 | "description": "This example shows how to use an [Expanded] widget in a [Column] so that\nit's middle child, a [Container] here, expands to fill the space." 265 | }, 266 | { 267 | "sourcePath": "lib/src/services/keyboard_key.dart", 268 | "sourceLine": 2019, 269 | "serial": "1", 270 | "package": "flutter", 271 | "library": "services", 272 | "element": "PhysicalKeyboardKey", 273 | "id": "services.PhysicalKeyboardKey.1", 274 | "file": "services.PhysicalKeyboardKey.1.dart", 275 | "description": "This example shows how to detect if the user has selected the physical key\nto the right of the CAPS LOCK key." 276 | }, 277 | { 278 | "sourcePath": "lib/src/widgets/focus_scope.dart", 279 | "sourceLine": 135, 280 | "serial": "1", 281 | "package": "flutter", 282 | "library": "widgets", 283 | "element": "Focus", 284 | "id": "widgets.Focus.1", 285 | "file": "widgets.Focus.1.dart", 286 | "description": "This example shows how to manage focus using the [Focus] and [FocusScope]\nwidgets. See [FocusNode] for a similar example that doesn't use [Focus] or\n[FocusScope]." 287 | }, 288 | { 289 | "sourcePath": "lib/src/material/radio.dart", 290 | "sourceLine": 92, 291 | "serial": "1", 292 | "package": "flutter", 293 | "library": "material", 294 | "element": "Radio", 295 | "id": "material.Radio.1", 296 | "file": "material.Radio.1.dart", 297 | "description": "Here is an example of Radio widgets wrapped in ListTiles, which is similar\nto what you could get with the RadioListTile widget.\n\nThe currently selected character is passed into `groupValue`, which is\nmaintained by the example's `State`. In this case, the first `Radio`\nwill start off selected because `_character` is initialized to\n`SingingCharacter.lafayette`.\n\nIf the second radio button is pressed, the example's state is updated\nwith `setState`, updating `_character` to `SingingCharacter.jefferson`.\nThis causes the buttons to rebuild with the updated `groupValue`, and\ntherefore the selection of the second button.\n\nRequires one of its ancestors to be a [Material] widget." 298 | }, 299 | { 300 | "sourcePath": "lib/src/material/card.dart", 301 | "sourceLine": 99, 302 | "serial": "2", 303 | "package": "flutter", 304 | "library": "material", 305 | "element": "Card", 306 | "id": "material.Card.2", 307 | "file": "material.Card.2.dart", 308 | "description": "This sample shows creation of a [Card] widget that can be tapped. When\ntapped this [Card]'s [InkWell] displays an \"ink splash\" that fills the\nentire card." 309 | }, 310 | { 311 | "sourcePath": "lib/src/material/switch_list_tile.dart", 312 | "sourceLine": 255, 313 | "serial": "1", 314 | "package": "flutter", 315 | "library": "material", 316 | "element": "SwitchListTile", 317 | "id": "material.SwitchListTile.1", 318 | "file": "material.SwitchListTile.1.dart", 319 | "description": "![SwitchListTile sample](https://flutter.github.io/assets-for-api-docs/assets/material/switch_list_tile.png)\n\nThis widget shows a switch that, when toggled, changes the state of a [bool]\nmember field called `_lights`." 320 | }, 321 | { 322 | "sourcePath": "lib/src/material/radio_list_tile.dart", 323 | "sourceLine": 293, 324 | "serial": "3", 325 | "package": "flutter", 326 | "library": "material", 327 | "element": "RadioListTile", 328 | "id": "material.RadioListTile.3", 329 | "file": "material.RadioListTile.3.dart", 330 | "description": "![Custom radio list tile sample](https://flutter.github.io/assets-for-api-docs/assets/material/radio_list_tile_custom.png)\n\nHere is an example of a custom LabeledRadio widget, but you can easily\nmake your own configurable widget." 331 | }, 332 | { 333 | "sourcePath": "lib/src/material/list_tile.dart", 334 | "sourceLine": 606, 335 | "serial": "5", 336 | "package": "flutter", 337 | "library": "material", 338 | "element": "ListTile", 339 | "id": "material.ListTile.5", 340 | "file": "material.ListTile.5.dart", 341 | "description": "Here is an example of an article list item with multi-line titles and\nsubtitles. It utilizes [Row]s and [Column]s, as well as [Expanded] and\n[AspectRatio] widgets to organize its layout.\n\n![Custom list item b](https://flutter.github.io/assets-for-api-docs/assets/widgets/custom_list_item_b.png)" 342 | }, 343 | { 344 | "sourcePath": "lib/src/services/system_chrome.dart", 345 | "sourceLine": 376, 346 | "serial": "2", 347 | "package": "flutter", 348 | "library": "services", 349 | "element": "SystemChrome.setSystemUIOverlayStyle", 350 | "id": "services.SystemChrome.setSystemUIOverlayStyle.2", 351 | "file": "services.SystemChrome.setSystemUIOverlayStyle.2.dart", 352 | "description": "The following example creates a widget that changes the status bar color\nto a random value on Android." 353 | }, 354 | { 355 | "sourcePath": "lib/src/material/list_tile.dart", 356 | "sourceLine": 606, 357 | "serial": "4", 358 | "package": "flutter", 359 | "library": "material", 360 | "element": "ListTile", 361 | "id": "material.ListTile.4", 362 | "file": "material.ListTile.4.dart", 363 | "description": "Here is an example of a custom list item that resembles a Youtube related\nvideo list item created with [Expanded] and [Container] widgets.\n\n![Custom list item a](https://flutter.github.io/assets-for-api-docs/assets/widgets/custom_list_item_a.png)" 364 | }, 365 | { 366 | "sourcePath": "lib/src/material/app_bar.dart", 367 | "sourceLine": 166, 368 | "serial": "1", 369 | "package": "flutter", 370 | "library": "material", 371 | "element": "AppBar", 372 | "id": "material.AppBar.1", 373 | "file": "material.AppBar.1.dart", 374 | "description": "This sample shows an [AppBar] with two simple actions. The first action\nopens a [SnackBar], while the second action navigates to a new page." 375 | }, 376 | { 377 | "sourcePath": "lib/src/material/card.dart", 378 | "sourceLine": 99, 379 | "serial": "1", 380 | "package": "flutter", 381 | "library": "material", 382 | "element": "Card", 383 | "id": "material.Card.1", 384 | "file": "material.Card.1.dart", 385 | "description": "This sample shows creation of a [Card] widget that shows album information\nand two actions." 386 | }, 387 | { 388 | "sourcePath": "lib/src/material/checkbox_list_tile.dart", 389 | "sourceLine": 250, 390 | "serial": "2", 391 | "package": "flutter", 392 | "library": "material", 393 | "element": "CheckboxListTile", 394 | "id": "material.CheckboxListTile.2", 395 | "file": "material.CheckboxListTile.2.dart", 396 | "description": "![Checkbox list tile semantics sample](https://flutter.github.io/assets-for-api-docs/assets/material/checkbox_list_tile_semantics.png)\n\nHere is an example of a custom labeled checkbox widget, called\nLinkedLabelCheckbox, that includes an interactive [RichText] widget that\nhandles tap gestures." 397 | }, 398 | { 399 | "sourcePath": "lib/src/material/radio_list_tile.dart", 400 | "sourceLine": 293, 401 | "serial": "2", 402 | "package": "flutter", 403 | "library": "material", 404 | "element": "RadioListTile", 405 | "id": "material.RadioListTile.2", 406 | "file": "material.RadioListTile.2.dart", 407 | "description": "![Radio list tile semantics sample](https://flutter.github.io/assets-for-api-docs/assets/material/radio_list_tile_semantics.png)\n\nHere is an example of a custom labeled radio widget, called\nLinkedLabelRadio, that includes an interactive [RichText] widget that\nhandles tap gestures." 408 | }, 409 | { 410 | "sourcePath": "lib/src/widgets/focus_manager.dart", 411 | "sourceLine": 337, 412 | "serial": "1", 413 | "package": "flutter", 414 | "library": "widgets", 415 | "element": "FocusNode", 416 | "id": "widgets.FocusNode.1", 417 | "file": "widgets.FocusNode.1.dart", 418 | "description": "This example shows how a FocusNode should be managed if not using the\n[Focus] or [FocusScope] widgets. See the [Focus] widget for a similar\nexample using [Focus] and [FocusScope] widgets." 419 | }, 420 | { 421 | "sourcePath": "lib/src/widgets/single_child_scroll_view.dart", 422 | "sourceLine": 196, 423 | "serial": "2", 424 | "package": "flutter", 425 | "library": "widgets", 426 | "element": "SingleChildScrollView", 427 | "id": "widgets.SingleChildScrollView.2", 428 | "file": "widgets.SingleChildScrollView.2.dart", 429 | "description": "In this example, the column becomes either as big as viewport, or as big as\nthe contents, whichever is biggest." 430 | }, 431 | { 432 | "sourcePath": "lib/src/material/stepper.dart", 433 | "sourceLine": 236, 434 | "serial": "1", 435 | "package": "flutter", 436 | "library": "material", 437 | "element": "Stepper.controlsBuilder", 438 | "id": "material.Stepper.controlsBuilder.1", 439 | "file": "material.Stepper.controlsBuilder.1.dart", 440 | "description": "Creates a stepper control with custom buttons." 441 | }, 442 | { 443 | "sourcePath": "lib/src/material/bottom_navigation_bar.dart", 444 | "sourceLine": 137, 445 | "serial": "1", 446 | "package": "flutter", 447 | "library": "material", 448 | "element": "BottomNavigationBar", 449 | "id": "material.BottomNavigationBar.1", 450 | "file": "material.BottomNavigationBar.1.dart", 451 | "description": "This example shows a [BottomNavigationBar] as it is used within a [Scaffold]\nwidget. The [BottomNavigationBar] has three [BottomNavigationBarItem]\nwidgets and the [currentIndex] is set to index 0. The selected item is\namber. The `_onItemTapped` function changes the selected item's index\nand displays a corresponding message in the center of the [Scaffold].\n\n![A scaffold with a bottom navigation bar containing three bottom navigation\nbar items. The first one is selected.](https://flutter.github.io/assets-for-api-docs/assets/material/bottom_navigation_bar.png)" 452 | }, 453 | { 454 | "sourcePath": "lib/src/widgets/navigator.dart", 455 | "sourceLine": 747, 456 | "serial": "1", 457 | "package": "flutter", 458 | "library": "widgets", 459 | "element": "Navigator", 460 | "id": "widgets.Navigator.1", 461 | "file": "widgets.Navigator.1.dart", 462 | "description": "The following example demonstrates how a nested [Navigator] can be used to\npresent a standalone user registration journey.\n\nEven though this example uses two [Navigator]s to demonstrate nested\n[Navigator]s, a similar result is possible using only a single [Navigator].\n\nRun this example with `flutter run --route=/signup` to start it with\nthe signup flow instead of on the home page." 463 | }, 464 | { 465 | "sourcePath": "lib/src/widgets/form.dart", 466 | "sourceLine": 66, 467 | "serial": "1", 468 | "package": "flutter", 469 | "library": "widgets", 470 | "element": "Form", 471 | "id": "widgets.Form.1", 472 | "file": "widgets.Form.1.dart", 473 | "description": "This example shows a [Form] with one [TextFormField] and a [RaisedButton]. A\n[GlobalKey] is used here to identify the [Form] and validate input." 474 | }, 475 | { 476 | "sourcePath": "lib/src/widgets/basic.dart", 477 | "sourceLine": 4421, 478 | "serial": "2", 479 | "package": "flutter", 480 | "library": "widgets", 481 | "element": "Expanded", 482 | "id": "widgets.Expanded.2", 483 | "file": "widgets.Expanded.2.dart", 484 | "description": "This example shows how to use an [Expanded] widget in a [Row] with multiple\nchildren expanded, utilizing the [flex] factor to prioritize available space." 485 | }, 486 | { 487 | "sourcePath": "lib/src/widgets/editable_text.dart", 488 | "sourceLine": 119, 489 | "serial": "1", 490 | "package": "flutter", 491 | "library": "widgets", 492 | "element": "TextEditingController", 493 | "id": "widgets.TextEditingController.1", 494 | "file": "widgets.TextEditingController.1.dart", 495 | "description": "This example creates a [TextField] with a [TextEditingController] whose\nchange listener forces the entered text to be lower case and keeps the\ncursor at the end of the input." 496 | }, 497 | { 498 | "sourcePath": "lib/src/material/icon_button.dart", 499 | "sourceLine": 125, 500 | "serial": "2", 501 | "package": "flutter", 502 | "library": "material", 503 | "element": "IconButton", 504 | "id": "material.IconButton.2", 505 | "file": "material.IconButton.2.dart", 506 | "description": "In this sample the icon button's background color is defined with an [Ink]\nwidget whose child is an [IconButton]. The icon button's filled background\nis a light shade of blue, it's a filled circle, and it's as big as the\nbutton is." 507 | }, 508 | { 509 | "sourcePath": "lib/src/material/checkbox_list_tile.dart", 510 | "sourceLine": 250, 511 | "serial": "1", 512 | "package": "flutter", 513 | "library": "material", 514 | "element": "CheckboxListTile", 515 | "id": "material.CheckboxListTile.1", 516 | "file": "material.CheckboxListTile.1.dart", 517 | "description": "![CheckboxListTile sample](https://flutter.github.io/assets-for-api-docs/assets/material/checkbox_list_tile.png)\n\nThis widget shows a checkbox that, when checked, slows down all animations\n(including the animation of the checkbox itself getting checked!).\n\nThis sample requires that you also import 'package:flutter/scheduler.dart',\nso that you can reference [timeDilation]." 518 | } 519 | ] --------------------------------------------------------------------------------