├── .github └── FUNDING.yml ├── .gitignore ├── .metadata ├── CONTRIBUTING.md ├── LICENSE.txt ├── README.md ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── elearning │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── fonts │ ├── BoxIcons.ttf │ ├── RedHatDisplay-Black.ttf │ ├── RedHatDisplay-BlackItalic.ttf │ ├── RedHatDisplay-Bold.ttf │ ├── RedHatDisplay-BoldItalic.ttf │ ├── RedHatDisplay-Italic.ttf │ ├── RedHatDisplay-Medium.ttf │ ├── RedHatDisplay-MediumItalic.ttf │ └── RedHatDisplay-Regular.ttf └── images │ ├── 1.png │ ├── 2.png │ ├── Coin.png │ ├── CoinSmall.png │ ├── crown.png │ ├── logo.png │ ├── navwave.png │ ├── user.png │ ├── video.jpg │ └── wave.png ├── demo ├── Frame 1.png └── Screen │ ├── Calendar.png │ ├── Forum.png │ ├── Help.png │ ├── Home.png │ ├── Home │ ├── Overlay.png │ ├── Search.png │ └── Search │ │ └── Results.png │ ├── NavDrawer.png │ ├── Onboarding │ ├── 1.png │ ├── 2.png │ └── 3.png │ ├── Profile.png │ ├── Settings.png │ ├── Stats │ ├── Global.png │ └── Local.png │ ├── Subjects │ ├── Close.png │ └── Open.png │ ├── Test.png │ ├── Video │ └── Open.png │ └── Videos.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── analytics │ └── analytics_service.dart ├── auth │ └── google_auth.dart ├── global │ └── globals.dart ├── main.dart ├── routes │ ├── router.dart │ └── routing_constants.dart ├── theme │ ├── box_icons_icons.dart │ ├── config.dart │ ├── theme.dart │ └── themeModel.dart └── ui │ ├── pages │ ├── home.dart │ ├── leaderboard.dart │ ├── navmenu │ │ ├── dashboard.dart │ │ ├── menu.dart │ │ └── menu_dashboard_layout.dart │ ├── onboarding1.dart │ ├── planner.dart │ ├── undefinedScreen.dart │ ├── video.dart │ └── videos.dart │ └── widgets │ ├── card.dart │ ├── overlay.dart │ ├── sectionHeader.dart │ ├── statsCard.dart │ ├── topBar.dart │ └── videoCard.dart ├── pubspec.lock ├── pubspec.yaml └── test └── widget_test.dart /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | custom: ['https://www.buymeacoffee.com/HashStudios'] 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .flutter-plugins-dependencies 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | /build/ 32 | 33 | # Web related 34 | lib/generated_plugin_registrant.dart 35 | 36 | # Symbolication related 37 | app.*.symbols 38 | 39 | # Obfuscation related 40 | app.*.map.json 41 | 42 | # Exceptions to above rules. 43 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 44 | android/app/google-services.json -------------------------------------------------------------------------------- /.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: 1ad9baa8b99a2897c20f9e6e54d3b9b359ade314 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to e-learning-app 2 | We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: 3 | 4 | - Reporting a bug 5 | - Discussing the current state of the code 6 | - Submitting a fix 7 | - Proposing new features 8 | - Becoming a maintainer 9 | 10 | ## We Develop with Github 11 | We use github to host code, to track issues and feature requests, as well as accept pull requests. 12 | 13 | ## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests 14 | Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: 15 | 16 | 1. Fork the repo and create your branch from `master`. 17 | 2. If you've added code that should be tested, add tests. 18 | 3. If you've changed APIs, update the documentation. 19 | 4. Ensure the test suite passes. 20 | 5. Make sure your code lints. 21 | 6. Issue that pull request! 22 | 23 | ## Any contributions you make will be under the BSD-3 Software License 24 | In short, when you submit code changes, your submissions are understood to be under the same [BSD-3 License](https://choosealicense.com/licenses/bsd-3-clause/) that covers the project. Feel free to contact the maintainers if that's a concern. 25 | 26 | ## Report bugs using Github's [issues](https://github.com/Hash-Studios/e-learning-app/issues) 27 | We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/Hash-Studios/e-learning-app/issues/new); it's that easy! 28 | 29 | ## Write bug reports with detail, background, and sample code 30 | **Great Bug Reports** tend to have: 31 | 32 | - A quick summary and/or background 33 | - Steps to reproduce 34 | - Be specific! 35 | - Give sample code if you can. 36 | - What you expected would happen 37 | - What actually happens 38 | - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) 39 | 40 | People *love* thorough bug reports. We're not even kidding. 41 | 42 | ## Use a Consistent Coding Style 43 | * Use DART formatter 44 | 45 | ## License 46 | By contributing, you agree that your contributions will be licensed under its BSD-3 License. 47 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2020 Hash Studios 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # icon E-Learning 2 | 3 | E-Learn is a beautiful open-source education app for Android. It is built with Dart on top of Google's Flutter Framework. 4 | E-Learn UI Mockup 5 | 6 | ## List of Contents 7 | 8 | 1. [Demo](#demo) 9 | 2. [Support](#support) 10 | 3. [Dependencies](#dependencies) 11 | 4. [Usage](#usage) 12 | 5. [Contributing](#contributing) 13 | 6. [License](#license) 14 | 7. [Contributors](#contributors) 15 | 16 | ## Demo 17 | 18 | **Screens** 19 | 20 | | ![](demo/Screen/Home.png) | ![](demo/Screen/Calendar.png) | ![](demo/Screen/Home/Overlay.png) | ![](demo/Screen/Videos.png) | ![](demo/Screen/Stats/Local.png) | 21 | | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: | 22 | | Explore | Planner | Overlay | Videos | Leaderboard | 23 | 24 | 25 | | ![](demo/Screen/Stats/Global.png) | ![](demo/Screen/NavDrawer.png) | ![](demo/Screen/Home/Search.png) | ![](demo/Screen/Home/Search/Results.png) | ![](demo/Screen/Profile.png) | 26 | | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: | 27 | | Global Leaderboard | NavDrawer | Search | Search Results | Profile | 28 | 29 | 30 | | ![](demo/Screen/Onboarding/1.png) | ![](demo/Screen/Onboarding/2.png)| ![](demo/Screen/Onboarding/3.png) | ![](demo/Screen/Subjects/Close.png) | ![](demo/Screen/Subjects/Open.png)| 31 | | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: | 32 | | Onboarding 1 | Onboarding 2 | Sign-in Screen | Subjects Close | Subjects Close | 33 | 34 | | ![](demo/Screen/Video/Open.png) | ![](demo/Screen/Forum.png) | ![](demo/Screen/Help.png) | ![](demo/Screen/Settings.png) | ![](demo/Screen/Test.png) | 35 | | :-------------: | :-------------: | :-------------: | :-------------: | :-------------: | 36 | | Video Info | Forum | Help | Settings | Test | 37 | 38 | 39 | ## Support 40 | 41 | If you like what we do, and would want to help us continue doing it, consider sponsoring this project. 42 | 43 | Buy Me A Coffee 44 | 45 | ## Dependencies 46 | 47 | The following packages are needed for the development of this application. 48 | 49 | - `provider: ^4.1.3` for caching data, and state management 50 | - `fluttertoast: ^4.0.1` for toast notifications 51 | - `shared_preferences: ^0.5.7` for storing settings like app state 52 | - `firebase_core: ^0.4.4+3` for firebase core 53 | - `firebase_auth: ^0.16.0` for user auth 54 | - `google_sign_in: ^4.4.4` for Google sign in support 55 | - `flare_splash_screen: ^3.0.1` for the animated splash screen 56 | - `flutter_svg: 0.17.4` for svg assets 57 | - `firebase_analytics: ^5.0.16` for analytics 58 | 59 | More details about these can be found in the [`pubspec.yaml`](https://github.com/Hash-Studios/e-learning-app/tree/master/pubspec.yaml) file. 60 | 61 | ## Usage 62 | 63 | More information about the releases can be found in the [Release](https://github.com/Hash-Studios/e-learning-app/releases) tab. 64 | 65 | ## Contributing 66 | 67 | First off, thank you for considering contributing to e-learning app. It's people like you that make e-learning app such a great app. 68 | 69 | To start your lovely journey with e-learning app, first read the [`contributing guidelines`](https://github.com/Hash-Studios/e-learning-app/tree/master/CONTRIBUTING.md) and then fork the repo to start contributing! 70 | 71 | ## License 72 | 73 | This app is licensed under the [`BSD 3-Clause License`](https://github.com/Hash-Studios/e-learning-app/tree/master/LICENSE.txt). 74 | Any Usage of the source code must follow the below license. 75 | 76 | ``` 77 | BSD 3-Clause License 78 | 79 | Copyright (c) 2020 Hash Studios 80 | All rights reserved. 81 | 82 | Redistribution and use in source and binary forms, with or without 83 | modification, are permitted provided that the following conditions are met: 84 | 85 | 1. Redistributions of source code must retain the above copyright notice, this 86 | list of conditions and the following disclaimer. 87 | 88 | 2. Redistributions in binary form must reproduce the above copyright notice, 89 | this list of conditions and the following disclaimer in the documentation 90 | and/or other materials provided with the distribution. 91 | 92 | 3. Neither the name of the copyright holder nor the names of its 93 | contributors may be used to endorse or promote products derived from 94 | this software without specific prior written permission. 95 | 96 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 97 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 98 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 99 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 100 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 101 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 102 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 103 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 104 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 105 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 106 | ``` 107 | 108 | ``` 109 | DISCLAIMER: Google Play and the Google Play logo are trademarks of Google LLC. 110 | ``` 111 | 112 | ## Contributors 113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /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: 'com.google.gms.google-services' 26 | apply plugin: 'kotlin-android' 27 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 28 | 29 | android { 30 | compileSdkVersion 28 31 | 32 | sourceSets { 33 | main.java.srcDirs += 'src/main/kotlin' 34 | } 35 | 36 | lintOptions { 37 | disable 'InvalidPackage' 38 | } 39 | 40 | defaultConfig { 41 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 42 | applicationId "com.example.elearning" 43 | minSdkVersion 16 44 | targetSdkVersion 28 45 | versionCode flutterVersionCode.toInteger() 46 | versionName flutterVersionName 47 | multiDexEnabled true 48 | } 49 | 50 | buildTypes { 51 | release { 52 | // TODO: Add your own signing config for the release build. 53 | // Signing with the debug keys for now, so `flutter run --release` works. 54 | signingConfig signingConfigs.debug 55 | } 56 | } 57 | } 58 | 59 | flutter { 60 | source '../..' 61 | } 62 | 63 | dependencies { 64 | implementation 'com.google.firebase:firebase-analytics:17.2.2' 65 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 66 | } 67 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 12 | 19 | 23 | 27 | 32 | 36 | 37 | 38 | 39 | 40 | 41 | 43 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/elearning/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.elearning 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath 'com.google.gms:google-services:4.3.3' 11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 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 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableR8=true 3 | android.useAndroidX=true 4 | android.enableJetifier=true 5 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | // Copyright 2014 The Flutter Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | include ':app' 6 | 7 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 8 | def properties = new Properties() 9 | 10 | assert localPropertiesFile.exists() 11 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 12 | 13 | def flutterSdkPath = properties.getProperty("flutter.sdk") 14 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 15 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 16 | -------------------------------------------------------------------------------- /assets/fonts/BoxIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/BoxIcons.ttf -------------------------------------------------------------------------------- /assets/fonts/RedHatDisplay-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/RedHatDisplay-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/RedHatDisplay-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/RedHatDisplay-BlackItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/RedHatDisplay-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/RedHatDisplay-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/RedHatDisplay-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/RedHatDisplay-BoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/RedHatDisplay-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/RedHatDisplay-Italic.ttf -------------------------------------------------------------------------------- /assets/fonts/RedHatDisplay-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/RedHatDisplay-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/RedHatDisplay-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/RedHatDisplay-MediumItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/RedHatDisplay-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/fonts/RedHatDisplay-Regular.ttf -------------------------------------------------------------------------------- /assets/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/1.png -------------------------------------------------------------------------------- /assets/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/2.png -------------------------------------------------------------------------------- /assets/images/Coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/Coin.png -------------------------------------------------------------------------------- /assets/images/CoinSmall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/CoinSmall.png -------------------------------------------------------------------------------- /assets/images/crown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/crown.png -------------------------------------------------------------------------------- /assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/logo.png -------------------------------------------------------------------------------- /assets/images/navwave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/navwave.png -------------------------------------------------------------------------------- /assets/images/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/user.png -------------------------------------------------------------------------------- /assets/images/video.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/video.jpg -------------------------------------------------------------------------------- /assets/images/wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/assets/images/wave.png -------------------------------------------------------------------------------- /demo/Frame 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Frame 1.png -------------------------------------------------------------------------------- /demo/Screen/Calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Calendar.png -------------------------------------------------------------------------------- /demo/Screen/Forum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Forum.png -------------------------------------------------------------------------------- /demo/Screen/Help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Help.png -------------------------------------------------------------------------------- /demo/Screen/Home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Home.png -------------------------------------------------------------------------------- /demo/Screen/Home/Overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Home/Overlay.png -------------------------------------------------------------------------------- /demo/Screen/Home/Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Home/Search.png -------------------------------------------------------------------------------- /demo/Screen/Home/Search/Results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Home/Search/Results.png -------------------------------------------------------------------------------- /demo/Screen/NavDrawer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/NavDrawer.png -------------------------------------------------------------------------------- /demo/Screen/Onboarding/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Onboarding/1.png -------------------------------------------------------------------------------- /demo/Screen/Onboarding/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Onboarding/2.png -------------------------------------------------------------------------------- /demo/Screen/Onboarding/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Onboarding/3.png -------------------------------------------------------------------------------- /demo/Screen/Profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Profile.png -------------------------------------------------------------------------------- /demo/Screen/Settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Settings.png -------------------------------------------------------------------------------- /demo/Screen/Stats/Global.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Stats/Global.png -------------------------------------------------------------------------------- /demo/Screen/Stats/Local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Stats/Local.png -------------------------------------------------------------------------------- /demo/Screen/Subjects/Close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Subjects/Close.png -------------------------------------------------------------------------------- /demo/Screen/Subjects/Open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Subjects/Open.png -------------------------------------------------------------------------------- /demo/Screen/Test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Test.png -------------------------------------------------------------------------------- /demo/Screen/Video/Open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Video/Open.png -------------------------------------------------------------------------------- /demo/Screen/Videos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/demo/Screen/Videos.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 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 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 97C146F11CF9000F007C117D /* Supporting Files */, 94 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 95 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 96 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 97 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 98 | ); 99 | path = Runner; 100 | sourceTree = ""; 101 | }; 102 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | ); 106 | name = "Supporting Files"; 107 | sourceTree = ""; 108 | }; 109 | /* End PBXGroup section */ 110 | 111 | /* Begin PBXNativeTarget section */ 112 | 97C146ED1CF9000F007C117D /* Runner */ = { 113 | isa = PBXNativeTarget; 114 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 115 | buildPhases = ( 116 | 9740EEB61CF901F6004384FC /* Run Script */, 117 | 97C146EA1CF9000F007C117D /* Sources */, 118 | 97C146EB1CF9000F007C117D /* Frameworks */, 119 | 97C146EC1CF9000F007C117D /* Resources */, 120 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 121 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 122 | ); 123 | buildRules = ( 124 | ); 125 | dependencies = ( 126 | ); 127 | name = Runner; 128 | productName = Runner; 129 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 130 | productType = "com.apple.product-type.application"; 131 | }; 132 | /* End PBXNativeTarget section */ 133 | 134 | /* Begin PBXProject section */ 135 | 97C146E61CF9000F007C117D /* Project object */ = { 136 | isa = PBXProject; 137 | attributes = { 138 | LastUpgradeCheck = 1020; 139 | ORGANIZATIONNAME = ""; 140 | TargetAttributes = { 141 | 97C146ED1CF9000F007C117D = { 142 | CreatedOnToolsVersion = 7.3.1; 143 | LastSwiftMigration = 1100; 144 | }; 145 | }; 146 | }; 147 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 148 | compatibilityVersion = "Xcode 9.3"; 149 | developmentRegion = en; 150 | hasScannedForEncodings = 0; 151 | knownRegions = ( 152 | en, 153 | Base, 154 | ); 155 | mainGroup = 97C146E51CF9000F007C117D; 156 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 157 | projectDirPath = ""; 158 | projectRoot = ""; 159 | targets = ( 160 | 97C146ED1CF9000F007C117D /* Runner */, 161 | ); 162 | }; 163 | /* End PBXProject section */ 164 | 165 | /* Begin PBXResourcesBuildPhase section */ 166 | 97C146EC1CF9000F007C117D /* Resources */ = { 167 | isa = PBXResourcesBuildPhase; 168 | buildActionMask = 2147483647; 169 | files = ( 170 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 171 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 172 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 173 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 174 | ); 175 | runOnlyForDeploymentPostprocessing = 0; 176 | }; 177 | /* End PBXResourcesBuildPhase section */ 178 | 179 | /* Begin PBXShellScriptBuildPhase section */ 180 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 181 | isa = PBXShellScriptBuildPhase; 182 | buildActionMask = 2147483647; 183 | files = ( 184 | ); 185 | inputPaths = ( 186 | ); 187 | name = "Thin Binary"; 188 | outputPaths = ( 189 | ); 190 | runOnlyForDeploymentPostprocessing = 0; 191 | shellPath = /bin/sh; 192 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 193 | }; 194 | 9740EEB61CF901F6004384FC /* Run Script */ = { 195 | isa = PBXShellScriptBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | ); 199 | inputPaths = ( 200 | ); 201 | name = "Run Script"; 202 | outputPaths = ( 203 | ); 204 | runOnlyForDeploymentPostprocessing = 0; 205 | shellPath = /bin/sh; 206 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 207 | }; 208 | /* End PBXShellScriptBuildPhase section */ 209 | 210 | /* Begin PBXSourcesBuildPhase section */ 211 | 97C146EA1CF9000F007C117D /* Sources */ = { 212 | isa = PBXSourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 216 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | /* End PBXSourcesBuildPhase section */ 221 | 222 | /* Begin PBXVariantGroup section */ 223 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C146FB1CF9000F007C117D /* Base */, 227 | ); 228 | name = Main.storyboard; 229 | sourceTree = ""; 230 | }; 231 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 232 | isa = PBXVariantGroup; 233 | children = ( 234 | 97C147001CF9000F007C117D /* Base */, 235 | ); 236 | name = LaunchScreen.storyboard; 237 | sourceTree = ""; 238 | }; 239 | /* End PBXVariantGroup section */ 240 | 241 | /* Begin XCBuildConfiguration section */ 242 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 243 | isa = XCBuildConfiguration; 244 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 245 | buildSettings = { 246 | ALWAYS_SEARCH_USER_PATHS = NO; 247 | CLANG_ANALYZER_NONNULL = YES; 248 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 249 | CLANG_CXX_LIBRARY = "libc++"; 250 | CLANG_ENABLE_MODULES = YES; 251 | CLANG_ENABLE_OBJC_ARC = YES; 252 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 253 | CLANG_WARN_BOOL_CONVERSION = YES; 254 | CLANG_WARN_COMMA = YES; 255 | CLANG_WARN_CONSTANT_CONVERSION = YES; 256 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 257 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 258 | CLANG_WARN_EMPTY_BODY = YES; 259 | CLANG_WARN_ENUM_CONVERSION = YES; 260 | CLANG_WARN_INFINITE_RECURSION = YES; 261 | CLANG_WARN_INT_CONVERSION = YES; 262 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 263 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 264 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 265 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 266 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 267 | CLANG_WARN_STRICT_PROTOTYPES = YES; 268 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 269 | CLANG_WARN_UNREACHABLE_CODE = YES; 270 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 271 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 272 | COPY_PHASE_STRIP = NO; 273 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 274 | ENABLE_NS_ASSERTIONS = NO; 275 | ENABLE_STRICT_OBJC_MSGSEND = YES; 276 | GCC_C_LANGUAGE_STANDARD = gnu99; 277 | GCC_NO_COMMON_BLOCKS = YES; 278 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 279 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 280 | GCC_WARN_UNDECLARED_SELECTOR = YES; 281 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 282 | GCC_WARN_UNUSED_FUNCTION = YES; 283 | GCC_WARN_UNUSED_VARIABLE = YES; 284 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 285 | MTL_ENABLE_DEBUG_INFO = NO; 286 | SDKROOT = iphoneos; 287 | SUPPORTED_PLATFORMS = iphoneos; 288 | TARGETED_DEVICE_FAMILY = "1,2"; 289 | VALIDATE_PRODUCT = YES; 290 | }; 291 | name = Profile; 292 | }; 293 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 294 | isa = XCBuildConfiguration; 295 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 296 | buildSettings = { 297 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 298 | CLANG_ENABLE_MODULES = YES; 299 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 300 | ENABLE_BITCODE = NO; 301 | FRAMEWORK_SEARCH_PATHS = ( 302 | "$(inherited)", 303 | "$(PROJECT_DIR)/Flutter", 304 | ); 305 | INFOPLIST_FILE = Runner/Info.plist; 306 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 307 | LIBRARY_SEARCH_PATHS = ( 308 | "$(inherited)", 309 | "$(PROJECT_DIR)/Flutter", 310 | ); 311 | PRODUCT_BUNDLE_IDENTIFIER = com.example.elearning; 312 | PRODUCT_NAME = "$(TARGET_NAME)"; 313 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 314 | SWIFT_VERSION = 5.0; 315 | VERSIONING_SYSTEM = "apple-generic"; 316 | }; 317 | name = Profile; 318 | }; 319 | 97C147031CF9000F007C117D /* Debug */ = { 320 | isa = XCBuildConfiguration; 321 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 322 | buildSettings = { 323 | ALWAYS_SEARCH_USER_PATHS = NO; 324 | CLANG_ANALYZER_NONNULL = YES; 325 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 326 | CLANG_CXX_LIBRARY = "libc++"; 327 | CLANG_ENABLE_MODULES = YES; 328 | CLANG_ENABLE_OBJC_ARC = YES; 329 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 330 | CLANG_WARN_BOOL_CONVERSION = YES; 331 | CLANG_WARN_COMMA = YES; 332 | CLANG_WARN_CONSTANT_CONVERSION = YES; 333 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 334 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 335 | CLANG_WARN_EMPTY_BODY = YES; 336 | CLANG_WARN_ENUM_CONVERSION = YES; 337 | CLANG_WARN_INFINITE_RECURSION = YES; 338 | CLANG_WARN_INT_CONVERSION = YES; 339 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 340 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 341 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 342 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 343 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 344 | CLANG_WARN_STRICT_PROTOTYPES = YES; 345 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 346 | CLANG_WARN_UNREACHABLE_CODE = YES; 347 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 348 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 349 | COPY_PHASE_STRIP = NO; 350 | DEBUG_INFORMATION_FORMAT = dwarf; 351 | ENABLE_STRICT_OBJC_MSGSEND = YES; 352 | ENABLE_TESTABILITY = YES; 353 | GCC_C_LANGUAGE_STANDARD = gnu99; 354 | GCC_DYNAMIC_NO_PIC = NO; 355 | GCC_NO_COMMON_BLOCKS = YES; 356 | GCC_OPTIMIZATION_LEVEL = 0; 357 | GCC_PREPROCESSOR_DEFINITIONS = ( 358 | "DEBUG=1", 359 | "$(inherited)", 360 | ); 361 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 362 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 363 | GCC_WARN_UNDECLARED_SELECTOR = YES; 364 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 365 | GCC_WARN_UNUSED_FUNCTION = YES; 366 | GCC_WARN_UNUSED_VARIABLE = YES; 367 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 368 | MTL_ENABLE_DEBUG_INFO = YES; 369 | ONLY_ACTIVE_ARCH = YES; 370 | SDKROOT = iphoneos; 371 | TARGETED_DEVICE_FAMILY = "1,2"; 372 | }; 373 | name = Debug; 374 | }; 375 | 97C147041CF9000F007C117D /* Release */ = { 376 | isa = XCBuildConfiguration; 377 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 378 | buildSettings = { 379 | ALWAYS_SEARCH_USER_PATHS = NO; 380 | CLANG_ANALYZER_NONNULL = YES; 381 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 382 | CLANG_CXX_LIBRARY = "libc++"; 383 | CLANG_ENABLE_MODULES = YES; 384 | CLANG_ENABLE_OBJC_ARC = YES; 385 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 386 | CLANG_WARN_BOOL_CONVERSION = YES; 387 | CLANG_WARN_COMMA = YES; 388 | CLANG_WARN_CONSTANT_CONVERSION = YES; 389 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 390 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 391 | CLANG_WARN_EMPTY_BODY = YES; 392 | CLANG_WARN_ENUM_CONVERSION = YES; 393 | CLANG_WARN_INFINITE_RECURSION = YES; 394 | CLANG_WARN_INT_CONVERSION = YES; 395 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 396 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 397 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 398 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 399 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 400 | CLANG_WARN_STRICT_PROTOTYPES = YES; 401 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 402 | CLANG_WARN_UNREACHABLE_CODE = YES; 403 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 404 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 405 | COPY_PHASE_STRIP = NO; 406 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 407 | ENABLE_NS_ASSERTIONS = NO; 408 | ENABLE_STRICT_OBJC_MSGSEND = YES; 409 | GCC_C_LANGUAGE_STANDARD = gnu99; 410 | GCC_NO_COMMON_BLOCKS = YES; 411 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 412 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 413 | GCC_WARN_UNDECLARED_SELECTOR = YES; 414 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 415 | GCC_WARN_UNUSED_FUNCTION = YES; 416 | GCC_WARN_UNUSED_VARIABLE = YES; 417 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 418 | MTL_ENABLE_DEBUG_INFO = NO; 419 | SDKROOT = iphoneos; 420 | SUPPORTED_PLATFORMS = iphoneos; 421 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 422 | TARGETED_DEVICE_FAMILY = "1,2"; 423 | VALIDATE_PRODUCT = YES; 424 | }; 425 | name = Release; 426 | }; 427 | 97C147061CF9000F007C117D /* Debug */ = { 428 | isa = XCBuildConfiguration; 429 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 430 | buildSettings = { 431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 432 | CLANG_ENABLE_MODULES = YES; 433 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 434 | ENABLE_BITCODE = NO; 435 | FRAMEWORK_SEARCH_PATHS = ( 436 | "$(inherited)", 437 | "$(PROJECT_DIR)/Flutter", 438 | ); 439 | INFOPLIST_FILE = Runner/Info.plist; 440 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 441 | LIBRARY_SEARCH_PATHS = ( 442 | "$(inherited)", 443 | "$(PROJECT_DIR)/Flutter", 444 | ); 445 | PRODUCT_BUNDLE_IDENTIFIER = com.example.elearning; 446 | PRODUCT_NAME = "$(TARGET_NAME)"; 447 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 448 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 449 | SWIFT_VERSION = 5.0; 450 | VERSIONING_SYSTEM = "apple-generic"; 451 | }; 452 | name = Debug; 453 | }; 454 | 97C147071CF9000F007C117D /* Release */ = { 455 | isa = XCBuildConfiguration; 456 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 457 | buildSettings = { 458 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 459 | CLANG_ENABLE_MODULES = YES; 460 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 461 | ENABLE_BITCODE = NO; 462 | FRAMEWORK_SEARCH_PATHS = ( 463 | "$(inherited)", 464 | "$(PROJECT_DIR)/Flutter", 465 | ); 466 | INFOPLIST_FILE = Runner/Info.plist; 467 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 468 | LIBRARY_SEARCH_PATHS = ( 469 | "$(inherited)", 470 | "$(PROJECT_DIR)/Flutter", 471 | ); 472 | PRODUCT_BUNDLE_IDENTIFIER = com.example.elearning; 473 | PRODUCT_NAME = "$(TARGET_NAME)"; 474 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 475 | SWIFT_VERSION = 5.0; 476 | VERSIONING_SYSTEM = "apple-generic"; 477 | }; 478 | name = Release; 479 | }; 480 | /* End XCBuildConfiguration section */ 481 | 482 | /* Begin XCConfigurationList section */ 483 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 484 | isa = XCConfigurationList; 485 | buildConfigurations = ( 486 | 97C147031CF9000F007C117D /* Debug */, 487 | 97C147041CF9000F007C117D /* Release */, 488 | 249021D3217E4FDB00AE95B9 /* Profile */, 489 | ); 490 | defaultConfigurationIsVisible = 0; 491 | defaultConfigurationName = Release; 492 | }; 493 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 494 | isa = XCConfigurationList; 495 | buildConfigurations = ( 496 | 97C147061CF9000F007C117D /* Debug */, 497 | 97C147071CF9000F007C117D /* Release */, 498 | 249021D4217E4FDB00AE95B9 /* Profile */, 499 | ); 500 | defaultConfigurationIsVisible = 0; 501 | defaultConfigurationName = Release; 502 | }; 503 | /* End XCConfigurationList section */ 504 | }; 505 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 506 | } 507 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hash-Studios/e-learning-app/e12ad55fc78c352aae351916a08bee35e524c807/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | elearning 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/analytics/analytics_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_analytics/firebase_analytics.dart'; 2 | import 'package:firebase_analytics/observer.dart'; 3 | 4 | final FirebaseAnalytics analytics = FirebaseAnalytics(); 5 | FirebaseAnalyticsObserver observer = 6 | FirebaseAnalyticsObserver(analytics: analytics); 7 | -------------------------------------------------------------------------------- /lib/auth/google_auth.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:elearning/analytics/analytics_service.dart'; 4 | import 'package:cloud_firestore/cloud_firestore.dart'; 5 | import 'package:firebase_auth/firebase_auth.dart'; 6 | import 'package:google_sign_in/google_sign_in.dart'; 7 | import 'package:shared_preferences/shared_preferences.dart'; 8 | import 'package:elearning/main.dart' as main; 9 | 10 | class GoogleAuth { 11 | final FirebaseAuth _auth = FirebaseAuth.instance; 12 | final GoogleSignIn googleSignIn = GoogleSignIn(); 13 | 14 | String? name; 15 | String? email; 16 | String? imageUrl; 17 | String errorMsg = ""; 18 | bool isLoggedIn = false; 19 | bool isLoading = false; 20 | 21 | Future signInWithGoogle() async { 22 | // try { 23 | isLoading = true; 24 | final GoogleSignInAccount googleSignInAccount = 25 | await (googleSignIn.signIn() as FutureOr); 26 | final GoogleSignInAuthentication googleSignInAuthentication = 27 | await googleSignInAccount.authentication; 28 | 29 | final AuthCredential credential = GoogleAuthProvider.credential( 30 | accessToken: googleSignInAuthentication.accessToken, 31 | idToken: googleSignInAuthentication.idToken, 32 | ); 33 | 34 | final UserCredential authResult = 35 | await _auth.signInWithCredential(credential); 36 | final User? user = authResult.user!; 37 | assert(user?.email != null); 38 | assert(user?.displayName != null); 39 | assert(user?.photoURL != null); 40 | name = user?.displayName; 41 | email = user?.email; 42 | if (user != null) { 43 | final QuerySnapshot result = await FirebaseFirestore.instance 44 | .collection('users') 45 | .where('id', isEqualTo: user.uid) 46 | .get(); 47 | final List documents = result.docs; 48 | if (documents.length == 0) { 49 | FirebaseFirestore.instance.collection('users').doc(user.uid).set({ 50 | 'name': user.displayName, 51 | 'email': user.email, 52 | 'id': user.uid, 53 | 'createdAt': DateTime.now().toIso8601String(), 54 | 'premium': false, 55 | }); 56 | await main.prefs.setString('id', user.uid); 57 | await main.prefs.setString('name', user.displayName!); 58 | await main.prefs.setString('email', user.email!); 59 | await main.prefs.setString('logged', "true"); 60 | await main.prefs.setBool('premium', false); 61 | } else { 62 | await main.prefs.setString('id', documents[0]['id']); 63 | await main.prefs.setString('name', documents[0]['name']); 64 | await main.prefs.setString('email', documents[0]['email']); 65 | await main.prefs.setString('logged', "true"); 66 | await main.prefs.setBool('premium', documents[0]['premium'] ?? false); 67 | } 68 | isLoading = false; 69 | } 70 | SharedPreferences.getInstance().then((value) { 71 | value.setString('googlename', user?.displayName ?? ""); 72 | value.setString('googleemail', user?.email ?? ""); 73 | value.setString('googleimage', user?.photoURL ?? ""); 74 | }); 75 | if (user != null) { 76 | assert(!user.isAnonymous); 77 | assert(await user.getIdToken() != null); 78 | } 79 | final User currentUser = _auth.currentUser!; 80 | assert(user?.uid == currentUser.uid); 81 | analytics.logLogin(); 82 | return 'signInWithGoogle succeeded: $user'; 83 | } 84 | 85 | void signOutGoogle() async { 86 | await googleSignIn.signOut(); 87 | SharedPreferences.getInstance().then((value) { 88 | value.setString('googlename', ""); 89 | value.setString('googleemail', ""); 90 | value.setString('googleimage', ""); 91 | value.setString('id', ""); 92 | value.setString('name', ""); 93 | value.setString('email', ""); 94 | value.setString('logged', "false"); 95 | value.setBool('premium', false); 96 | }); 97 | print("User Sign Out"); 98 | } 99 | 100 | Future isSignedIn() async { 101 | return await googleSignIn.isSignedIn(); 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /lib/global/globals.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/auth/google_auth.dart'; 2 | 3 | var gAuth = GoogleAuth(); 4 | 5 | // var updateAvailable = false; 6 | // var versionInfo = {}; 7 | // var noNewNotification = false; 8 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/ui/pages/onboarding1.dart'; 2 | import 'package:elearning/ui/pages/undefinedScreen.dart'; 3 | import 'package:firebase_core/firebase_core.dart'; 4 | import 'package:flutter/cupertino.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter/services.dart'; 7 | import 'package:elearning/global/globals.dart' as globals; 8 | import 'package:elearning/routes/router.dart' as router; 9 | import 'package:shared_preferences/shared_preferences.dart'; 10 | 11 | late SharedPreferences prefs; 12 | void main() async { 13 | WidgetsFlutterBinding.ensureInitialized(); 14 | await Firebase.initializeApp(); 15 | SharedPreferences.getInstance().then((prefs) { 16 | SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) 17 | .then((value) => runApp( 18 | RestartWidget( 19 | child: MyApp(), 20 | ), 21 | )); 22 | }); 23 | } 24 | 25 | class MyApp extends StatefulWidget { 26 | @override 27 | _MyAppState createState() => _MyAppState(); 28 | } 29 | 30 | class _MyAppState extends State { 31 | void getLoginStatus() async { 32 | prefs = await SharedPreferences.getInstance(); 33 | globals.gAuth.googleSignIn.isSignedIn().then((value) { 34 | prefs.setBool("isLoggedin", value); 35 | }); 36 | } 37 | 38 | @override 39 | void initState() { 40 | getLoginStatus(); 41 | super.initState(); 42 | } 43 | 44 | @override 45 | Widget build(BuildContext context) { 46 | return CupertinoApp( 47 | onGenerateRoute: router.generateRoute, 48 | onUnknownRoute: (settings) => CupertinoPageRoute( 49 | builder: (context) => UndefinedScreen( 50 | name: settings.name, 51 | )), 52 | // theme: Provider.of(context).currentTheme, 53 | debugShowCheckedModeBanner: false, 54 | home: Onboarding(), 55 | ); 56 | } 57 | } 58 | 59 | class RestartWidget extends StatefulWidget { 60 | RestartWidget({this.child}); 61 | 62 | final Widget? child; 63 | 64 | static void restartApp(BuildContext context) { 65 | context.findAncestorStateOfType<_RestartWidgetState>()!.restartApp(); 66 | } 67 | 68 | @override 69 | _RestartWidgetState createState() => _RestartWidgetState(); 70 | } 71 | 72 | class _RestartWidgetState extends State { 73 | Key key = UniqueKey(); 74 | 75 | void restartApp() { 76 | setState(() { 77 | key = UniqueKey(); 78 | }); 79 | } 80 | 81 | @override 82 | Widget build(BuildContext context) { 83 | return KeyedSubtree( 84 | key: key, 85 | child: widget.child!, 86 | ); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /lib/routes/router.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/routes/routing_constants.dart'; 2 | import 'package:elearning/ui/pages/home.dart'; 3 | import 'package:elearning/ui/pages/undefinedScreen.dart'; 4 | import 'package:flutter/cupertino.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:elearning/analytics/analytics_service.dart'; 7 | 8 | List navStack = ["Home"]; 9 | Route generateRoute(RouteSettings settings) { 10 | switch (settings.name) { 11 | case HomeRoute: 12 | navStack.add("Splash"); 13 | print(navStack); 14 | analytics.setCurrentScreen(screenName: HomeRoute); 15 | return CupertinoPageRoute(builder: (context) => Home()); 16 | // case SearchRoute: 17 | // navStack.add("Search"); 18 | // print(navStack); 19 | // analytics.setCurrentScreen(screenName: SearchRoute); 20 | // return PageRouteBuilder( 21 | // pageBuilder: (context, animation1, animation2) => SearchScreen()); 22 | default: 23 | navStack.add("undefined"); 24 | print(navStack); 25 | analytics.setCurrentScreen(screenName: "/undefined"); 26 | return CupertinoPageRoute( 27 | builder: (context) => UndefinedScreen( 28 | name: settings.name, 29 | ), 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/routes/routing_constants.dart: -------------------------------------------------------------------------------- 1 | const String HomeRoute = '/'; 2 | const String SearchRoute = '/search'; 3 | -------------------------------------------------------------------------------- /lib/theme/config.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class App { 4 | late BuildContext _context; 5 | late double _height; 6 | late double _width; 7 | late double _heightPadding; 8 | late double _widthPadding; 9 | 10 | App(_context) { 11 | this._context = _context; 12 | MediaQueryData _queryData = MediaQuery.of(this._context); 13 | _height = _queryData.size.height / 100.0; 14 | _width = _queryData.size.width / 100.0; 15 | _heightPadding = _height - 16 | ((_queryData.padding.top + _queryData.padding.bottom) / 100.0); 17 | _widthPadding = 18 | _width - (_queryData.padding.left + _queryData.padding.right) / 100.0; 19 | } 20 | 21 | double appHeight(double v) { 22 | return _height * v; 23 | } 24 | 25 | double appWidth(double v) { 26 | return _width * v; 27 | } 28 | 29 | double appVerticalPadding(double v) { 30 | return _heightPadding * v; 31 | } 32 | 33 | double appHorizontalPadding(double v) { 34 | return _widthPadding * v; 35 | } 36 | } 37 | 38 | class Colors { 39 | Color _mainColor = Color(0xFFFFFFFF); 40 | Color _secondColor = Color(0xFFF5F6FC); 41 | Color _accentColor = Color(0xFF03A9F4); 42 | // Color _mainDarkColor = Color(0xFF181818); 43 | // Color _secondDarkColor = Color(0xFF2F2F2F); 44 | // Color _accentDarkColor = Color(0xFFF0F0F0); 45 | 46 | LinearGradient waves = LinearGradient( 47 | colors: [Color(0xFF0396FF), Color(0xFFABDCFF)], 48 | begin: Alignment.bottomRight, 49 | end: Alignment.topLeft, 50 | ); 51 | 52 | LinearGradient deepSpace = LinearGradient( 53 | colors: [Color(0xFF4CA1AF), Color(0xFF2C3E50)], 54 | begin: Alignment.topRight, 55 | end: Alignment.bottomLeft, 56 | ); 57 | LinearGradient peachy = LinearGradient( 58 | colors: [Color(0xFFFFB382), Color(0xFFF07590)], 59 | begin: Alignment.topRight, 60 | end: Alignment.bottomLeft, 61 | ); 62 | LinearGradient nebula = LinearGradient( 63 | colors: [Color(0xFFA1A3FF), Color(0xFF6D63EF)], 64 | begin: Alignment.topRight, 65 | end: Alignment.bottomLeft, 66 | ); 67 | LinearGradient mildSea = LinearGradient( 68 | colors: [Color(0xFF96EFA6), Color(0xFF26A6B5)], 69 | begin: Alignment.topRight, 70 | end: Alignment.bottomLeft, 71 | ); 72 | LinearGradient mildSeaRev = LinearGradient( 73 | colors: [Color(0xFF26A6B5), Color(0xFF96EFA6)], 74 | begin: Alignment.topRight, 75 | end: Alignment.bottomLeft, 76 | ); 77 | LinearGradient purplin = LinearGradient( 78 | colors: [Color(0xFFA044FF), Color(0xFF6A3093)], 79 | begin: Alignment.topRight, 80 | end: Alignment.bottomLeft, 81 | ); 82 | 83 | LinearGradient easyMed = LinearGradient( 84 | colors: [Color(0xFF45B649), Color(0xFFDCE35B)], 85 | begin: Alignment.topRight, 86 | end: Alignment.bottomLeft, 87 | ); 88 | 89 | LinearGradient disco = LinearGradient( 90 | colors: [Color(0xFFB06AB3), Color(0xFF4568DC)], 91 | begin: Alignment.topRight, 92 | end: Alignment.bottomLeft, 93 | ); 94 | 95 | LinearGradient aqua = LinearGradient( 96 | colors: [Color(0xFF5B86E5), Color(0xFF36D1DC)], 97 | begin: Alignment.topRight, 98 | end: Alignment.bottomLeft, 99 | ); 100 | 101 | LinearGradient alive = LinearGradient( 102 | colors: [Color(0xFFBD3F32), Color(0xFFCB356B)], 103 | begin: Alignment.topRight, 104 | end: Alignment.bottomLeft, 105 | ); 106 | 107 | Color mainColor(double opacity) { 108 | return this._mainColor.withOpacity(opacity); 109 | } 110 | 111 | Color secondColor(double opacity) { 112 | return this._secondColor.withOpacity(opacity); 113 | } 114 | 115 | Color accentColor(double opacity) { 116 | return this._accentColor.withOpacity(opacity); 117 | } 118 | 119 | // Color mainDarkColor(double opacity) { 120 | // return this._mainDarkColor.withOpacity(opacity); 121 | // } 122 | 123 | // Color secondDarkColor(double opacity) { 124 | // return this._secondDarkColor.withOpacity(opacity); 125 | // } 126 | 127 | // Color accentDarkColor(double opacity) { 128 | // return this._accentDarkColor.withOpacity(opacity); 129 | // } 130 | } 131 | -------------------------------------------------------------------------------- /lib/theme/theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:elearning/theme/config.dart' as config; 3 | 4 | var kLightTheme = ThemeData( 5 | canvasColor: Colors.transparent, 6 | primaryColor: Colors.white, 7 | brightness: Brightness.light, 8 | accentColor: config.Colors().accentColor(1), 9 | focusColor: config.Colors().mainColor(1), 10 | hintColor: config.Colors().secondColor(1), 11 | accentTextTheme: 12 | TextTheme(headline6: TextStyle(fontFamily: "Red Hat Display")), 13 | textTheme: TextTheme( 14 | button: TextStyle( 15 | fontFamily: 'Red Hat Display', 16 | fontSize: 16, 17 | fontWeight: FontWeight.w800, 18 | color: Color(0xFFFFFFFF), 19 | ), 20 | headline5: TextStyle( 21 | fontSize: 16.0, 22 | color: Colors.white.withOpacity(1), 23 | fontFamily: "Red Hat Display", 24 | ), 25 | headline4: TextStyle( 26 | fontSize: 16, 27 | fontFamily: "Red Hat Display", 28 | fontWeight: FontWeight.w500, 29 | color: config.Colors().accentColor(1)), 30 | headline3: TextStyle( 31 | fontSize: 20, 32 | fontFamily: "Red Hat Display", 33 | fontWeight: FontWeight.w500, 34 | color: Colors.black), 35 | headline2: TextStyle( 36 | fontSize: 24, 37 | fontFamily: "Red Hat Display", 38 | fontWeight: FontWeight.w500, 39 | color: Colors.black), 40 | headline1: TextStyle( 41 | fontFamily: 'Red Hat Display', 42 | color: config.Colors().accentColor(1), 43 | fontSize: 50, 44 | fontWeight: FontWeight.w600, 45 | ), 46 | subtitle1: TextStyle( 47 | fontSize: 20, 48 | fontWeight: FontWeight.w900, 49 | color: config.Colors().secondColor(1), 50 | fontFamily: "Roboto", 51 | ), 52 | headline6: TextStyle( 53 | fontSize: 13.0, 54 | color: Colors.white.withOpacity(.85), 55 | fontFamily: "Red Hat Display", 56 | ), 57 | bodyText2: TextStyle( 58 | fontFamily: 'Red Hat Display', 59 | fontSize: 14, 60 | fontWeight: FontWeight.w500, 61 | color: Colors.white.withOpacity(.75), 62 | ), 63 | bodyText1: TextStyle( 64 | fontFamily: 'Red Hat Display', 65 | fontSize: 24, 66 | fontWeight: FontWeight.w500, 67 | color: Colors.white.withOpacity(1), 68 | ), 69 | caption: TextStyle( 70 | fontFamily: 'Roboto', 71 | fontSize: 16, 72 | fontWeight: FontWeight.w400, 73 | color: config.Colors().accentColor(1), 74 | ), 75 | ), 76 | ); 77 | 78 | // var kDarkTheme = ThemeData( 79 | // canvasColor: Colors.transparent, 80 | // primaryColor: Color(0xFF181818), 81 | // brightness: Brightness.dark, 82 | // accentColor: config.Colors().accentDarkColor(1), 83 | // focusColor: config.Colors().mainDarkColor(1), 84 | // hintColor: config.Colors().secondDarkColor(1), 85 | // accentTextTheme: TextTheme(headline6: TextStyle(fontFamily: "Red Hat Display")), 86 | // textTheme: TextTheme( 87 | // button: TextStyle( 88 | // fontFamily: 'Red Hat Display', 89 | // fontSize: 16, 90 | // fontWeight: FontWeight.w800, 91 | // color: Color(0xFF181818), 92 | // ), 93 | // headline5: TextStyle( 94 | // fontSize: 16.0, 95 | // color: config.Colors().accentDarkColor(1), 96 | // fontFamily: "Red Hat Display", 97 | // ), 98 | // headline4: TextStyle( 99 | // fontSize: 16, 100 | // fontFamily: "Red Hat Display", 101 | // fontWeight: FontWeight.w500, 102 | // color: config.Colors().accentDarkColor(1)), 103 | // headline3: TextStyle( 104 | // fontSize: 20, 105 | // fontFamily: "Red Hat Display", 106 | // fontWeight: FontWeight.w500, 107 | // color: Colors.white), 108 | // headline2: TextStyle( 109 | // fontSize: 24, 110 | // fontFamily: "Red Hat Display", 111 | // fontWeight: FontWeight.w500, 112 | // color: Colors.white), 113 | // headline1: TextStyle( 114 | // fontFamily: 'Red Hat Display', 115 | // color: config.Colors().accentDarkColor(1), 116 | // fontSize: 50, 117 | // fontWeight: FontWeight.w600, 118 | // ), 119 | // subtitle1: TextStyle( 120 | // fontSize: 20, 121 | // fontWeight: FontWeight.w900, 122 | // color: config.Colors().secondDarkColor(1), 123 | // fontFamily: "Roboto", 124 | // ), 125 | // headline6: TextStyle( 126 | // fontSize: 14.0, 127 | // color: config.Colors().accentDarkColor(.85), 128 | // fontFamily: "Red Hat Display", 129 | // ), 130 | // bodyText2: TextStyle( 131 | // fontFamily: 'Red Hat Display', 132 | // fontSize: 14, 133 | // fontWeight: FontWeight.w500, 134 | // color: config.Colors().accentDarkColor(.85), 135 | // ), 136 | // bodyText1: TextStyle( 137 | // fontFamily: 'Red Hat Display', 138 | // fontSize: 22, 139 | // fontWeight: FontWeight.w500, 140 | // color: config.Colors().accentDarkColor(1), 141 | // ), 142 | // caption: TextStyle( 143 | // fontFamily: 'Roboto', 144 | // fontSize: 16, 145 | // fontWeight: FontWeight.w400, 146 | // color: config.Colors().accentDarkColor(1), 147 | // ), 148 | // ), 149 | // ); 150 | -------------------------------------------------------------------------------- /lib/theme/themeModel.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:elearning/theme/theme.dart'; 3 | // import 'package:elearning/main.dart' as main; 4 | 5 | enum ThemeType { Light, Dark } 6 | 7 | class ThemeModel extends ChangeNotifier { 8 | ThemeData currentTheme = kLightTheme; 9 | ThemeType themeType = ThemeType.Dark; 10 | 11 | ThemeModel(this.currentTheme, this.themeType); 12 | 13 | // toggleTheme() { 14 | // if (this.themeType == ThemeType.Dark) { 15 | // main.prefs.setBool("darkMode", false); 16 | // this.currentTheme = kLightTheme; 17 | // this.themeType = ThemeType.Light; 18 | // print(main.prefs.getBool("darkMode")); 19 | // return notifyListeners(); 20 | // } 21 | 22 | // if (this.themeType == ThemeType.Light) { 23 | // main.prefs.setBool("darkMode", true); 24 | // this.currentTheme = kDarkTheme; 25 | // this.themeType = ThemeType.Dark; 26 | // print(main.prefs.getBool("darkMode")); 27 | // return notifyListeners(); 28 | // } 29 | // } 30 | 31 | returnTheme() { 32 | return themeType; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/ui/pages/home.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | import 'package:elearning/ui/widgets/overlay.dart'; 3 | import 'package:elearning/theme/box_icons_icons.dart'; 4 | import 'package:elearning/theme/config.dart'; 5 | import 'package:elearning/ui/pages/leaderboard.dart'; 6 | import 'package:elearning/ui/pages/planner.dart'; 7 | import 'package:elearning/ui/pages/videos.dart'; 8 | import 'package:elearning/ui/widgets/sectionHeader.dart'; 9 | import 'package:elearning/ui/widgets/topBar.dart'; 10 | import 'package:elearning/ui/widgets/videoCard.dart'; 11 | import 'package:flutter/cupertino.dart'; 12 | import 'package:flutter/material.dart' as material; 13 | 14 | class Home extends StatefulWidget { 15 | final onMenuTap; 16 | Home({this.onMenuTap}); 17 | @override 18 | _HomeState createState() => _HomeState(); 19 | } 20 | 21 | class _HomeState extends State { 22 | int tabNo = 0; 23 | late bool overlayVisible; 24 | CupertinoTabController? controller; 25 | @override 26 | void initState() { 27 | overlayVisible = false; 28 | controller = CupertinoTabController(initialIndex: 0); 29 | super.initState(); 30 | } 31 | 32 | @override 33 | Widget build(BuildContext context) { 34 | return Stack( 35 | alignment: Alignment.center, 36 | children: [ 37 | CupertinoTabScaffold( 38 | backgroundColor: Colors().secondColor(1), 39 | controller: controller, 40 | tabBar: CupertinoTabBar( 41 | onTap: (value) { 42 | setState(() { 43 | tabNo = value; 44 | }); 45 | }, 46 | activeColor: material.Colors.lightBlue, 47 | inactiveColor: Color(0xFFADADAD), 48 | items: [ 49 | BottomNavigationBarItem( 50 | icon: Icon(BoxIcons.bx_home_circle), 51 | title: tabNo == 0 ? Text("Home") : Container()), 52 | BottomNavigationBarItem( 53 | icon: Icon(BoxIcons.bx_calendar), 54 | title: tabNo == 1 ? Text("Planner") : Container()), 55 | BottomNavigationBarItem(icon: Container()), 56 | BottomNavigationBarItem( 57 | icon: Icon(BoxIcons.bxs_videos), 58 | title: tabNo == 3 ? Text("Videos") : Container()), 59 | BottomNavigationBarItem( 60 | icon: Icon(BoxIcons.bx_stats), 61 | title: tabNo == 4 ? Text("Leaderboard") : Container()), 62 | ], 63 | ), 64 | tabBuilder: (context, index) => (index == 0) 65 | ? HomePage( 66 | onMenuTap: widget.onMenuTap, 67 | ) 68 | : (index == 1) 69 | ? PlannerPage( 70 | onMenuTap: widget.onMenuTap, 71 | ) 72 | : (index == 2) 73 | ? Container( 74 | color: CupertinoColors.activeOrange, 75 | ) 76 | : (index == 3) 77 | ? VideosPage( 78 | onMenuTap: widget.onMenuTap, 79 | ) 80 | : LeaderboardPage( 81 | onMenuTap: widget.onMenuTap, 82 | ), 83 | ), 84 | Positioned( 85 | bottom: 0, 86 | child: GestureDetector( 87 | child: SizedBox( 88 | height: 60, 89 | width: 80, 90 | child: Text(""), 91 | ), 92 | onTap: () {}, 93 | )), 94 | overlayVisible ? OverlayWidget() : Container(), 95 | Positioned( 96 | bottom: 20, 97 | child: Container( 98 | decoration: BoxDecoration( 99 | gradient: LinearGradient( 100 | colors: [ 101 | Color(0xFFABDCFF), 102 | Color(0xFF0396FF), 103 | ], 104 | begin: Alignment.topLeft, 105 | end: Alignment.bottomRight, 106 | ), 107 | boxShadow: [ 108 | BoxShadow( 109 | blurRadius: 25, 110 | color: Color(0xFF03A9F4).withOpacity(0.4), 111 | offset: Offset(0, 4)) 112 | ], 113 | borderRadius: BorderRadius.circular(500)), 114 | child: material.FloatingActionButton( 115 | elevation: 0, 116 | highlightElevation: 0, 117 | backgroundColor: material.Colors.transparent, 118 | child: overlayVisible 119 | ? Icon(material.Icons.close) 120 | : Icon(BoxIcons.bx_pencil), 121 | onPressed: () { 122 | setState(() { 123 | overlayVisible = !overlayVisible; 124 | }); 125 | }), 126 | )), 127 | ], 128 | ); 129 | } 130 | } 131 | 132 | class HomePage extends StatelessWidget { 133 | final onMenuTap; 134 | HomePage({ 135 | Key? key, 136 | required this.onMenuTap, 137 | }) : super(key: key); 138 | 139 | TextEditingController controller = TextEditingController(); 140 | @override 141 | Widget build(BuildContext context) { 142 | return CupertinoPageScaffold( 143 | backgroundColor: Colors().secondColor(1), 144 | child: Stack( 145 | alignment: Alignment.center, 146 | children: [ 147 | SafeArea( 148 | child: CustomScrollView( 149 | slivers: [ 150 | SliverFixedExtentList( 151 | delegate: SliverChildListDelegate.fixed([Container()]), 152 | itemExtent: MediaQuery.of(context).size.height * 0.32), 153 | SliverToBoxAdapter( 154 | child: SectionHeader( 155 | text: 'Recommended Lectures', 156 | onPressed: () {}, 157 | ), 158 | ), 159 | SliverToBoxAdapter( 160 | child: Container( 161 | width: MediaQuery.of(context).size.width, 162 | height: 245, 163 | child: ListView.builder( 164 | scrollDirection: Axis.horizontal, 165 | itemCount: 4, 166 | itemBuilder: (context, index) { 167 | return VideoCard(long: false); 168 | }, 169 | ), 170 | ), 171 | ), 172 | SliverToBoxAdapter( 173 | child: SectionHeader( 174 | text: 'Revision Lectures', 175 | onPressed: () {}, 176 | ), 177 | ), 178 | SliverToBoxAdapter( 179 | child: Container( 180 | width: MediaQuery.of(context).size.width, 181 | height: 245, 182 | child: ListView.builder( 183 | scrollDirection: Axis.horizontal, 184 | itemCount: 4, 185 | itemBuilder: (context, index) { 186 | return VideoCard(long: false); 187 | }, 188 | ), 189 | ), 190 | ), 191 | ], 192 | ), 193 | ), 194 | Positioned( 195 | top: 0, 196 | child: TopBar( 197 | controller: controller, 198 | expanded: true, 199 | onMenuTap: onMenuTap, 200 | ), 201 | ) 202 | ], 203 | ), 204 | ); 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /lib/ui/pages/leaderboard.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/config.dart' as config; 2 | import 'package:elearning/ui/widgets/card.dart'; 3 | import 'package:elearning/ui/widgets/sectionHeader.dart'; 4 | import 'package:elearning/ui/widgets/statsCard.dart'; 5 | import 'package:elearning/ui/widgets/topBar.dart'; 6 | import 'package:flutter/cupertino.dart'; 7 | import 'package:flutter/material.dart' as material; 8 | 9 | class LeaderboardPage extends StatefulWidget { 10 | LeaderboardPage({ 11 | Key? key, 12 | required this.onMenuTap, 13 | }) : super(key: key); 14 | final Function? onMenuTap; 15 | 16 | @override 17 | _LeaderboardPageState createState() => _LeaderboardPageState(); 18 | } 19 | 20 | class _LeaderboardPageState extends State { 21 | TextEditingController controller = TextEditingController(); 22 | late bool local; 23 | final List names = [ 24 | 'Sarvesh Mehta', 25 | 'Karanjeet Gill', 26 | 'Rahul Bose', 27 | 'ABCDEF', 28 | 'ABCDEF', 29 | 'ABCDEF', 30 | 'ABCDEF', 31 | 'ABCDEF', 32 | 'ABCDEF', 33 | 'ABCDEF' 34 | ]; 35 | 36 | final List coins = [ 37 | '3895', 38 | '3678', 39 | '3675', 40 | '3456', 41 | '3455', 42 | '3454', 43 | '3453', 44 | '3452', 45 | '3451', 46 | '3450' 47 | ]; 48 | 49 | final List colors = [ 50 | Color(0xFFFFD700), 51 | Color(0xFFC0C0C0), 52 | Color(0xFFCD7F32), 53 | Color(0xFF0396FF), 54 | Color(0xFF0396FF), 55 | Color(0xFF0396FF), 56 | Color(0xFF0396FF), 57 | Color(0xFF0396FF), 58 | Color(0xFF0396FF), 59 | Color(0xFF0396FF) 60 | ]; 61 | @override 62 | void initState() { 63 | local = true; 64 | super.initState(); 65 | } 66 | 67 | @override 68 | Widget build(BuildContext context) { 69 | return CupertinoPageScaffold( 70 | backgroundColor: config.Colors().secondColor(1), 71 | child: Stack( 72 | alignment: Alignment.center, 73 | children: [ 74 | SafeArea( 75 | child: local 76 | ? CustomScrollView( 77 | slivers: [ 78 | SliverFixedExtentList( 79 | delegate: 80 | SliverChildListDelegate.fixed([Container()]), 81 | itemExtent: 82 | MediaQuery.of(context).size.height * 0.23), 83 | SliverToBoxAdapter( 84 | child: SectionHeader( 85 | text: 'Google Leaderboard', 86 | onPressed: () {}, 87 | ), 88 | ), 89 | SliverToBoxAdapter( 90 | child: Stack( 91 | children: [ 92 | Container( 93 | width: MediaQuery.of(context).size.width, 94 | height: 240, 95 | child: ListView.builder( 96 | physics: NeverScrollableScrollPhysics(), 97 | itemCount: 3, 98 | itemBuilder: (context, index) { 99 | return Padding( 100 | padding: const EdgeInsets.symmetric( 101 | vertical: 8.0, horizontal: 14), 102 | child: CardWidget( 103 | gradient: false, 104 | button: false, 105 | child: Row( 106 | children: [ 107 | Padding( 108 | padding: const EdgeInsets.all(8.0), 109 | child: Text( 110 | "${index + 1}.", 111 | style: TextStyle( 112 | fontFamily: 'Red Hat Display', 113 | fontSize: 18, 114 | color: Color(0xFF585858)), 115 | ), 116 | ), 117 | Padding( 118 | padding: const EdgeInsets.all(8.0), 119 | child: Text( 120 | "${names[index]}", 121 | style: TextStyle( 122 | fontFamily: 'Red Hat Display', 123 | fontSize: 18, 124 | color: Color(0xFF585858)), 125 | ), 126 | ), 127 | Spacer(), 128 | Container( 129 | width: MediaQuery.of(context) 130 | .size 131 | .width * 132 | 0.3, 133 | decoration: BoxDecoration( 134 | borderRadius: BorderRadius.only( 135 | topLeft: Radius.elliptical( 136 | 10, 50), 137 | bottomLeft: 138 | Radius.elliptical( 139 | 10, 50)), 140 | gradient: LinearGradient( 141 | colors: [ 142 | material.Colors.white, 143 | colors[index] 144 | ], 145 | begin: Alignment.topLeft, 146 | end: 147 | Alignment.bottomRight)), 148 | child: Padding( 149 | padding: 150 | const EdgeInsets.all(8.0), 151 | child: Row( 152 | mainAxisAlignment: 153 | MainAxisAlignment 154 | .spaceEvenly, 155 | children: [ 156 | Image.asset( 157 | 'assets/images/CoinSmall.png', 158 | width: 50, 159 | ), 160 | Text( 161 | "${coins[index]}", 162 | style: TextStyle( 163 | fontFamily: 164 | 'Red Hat Display', 165 | fontSize: 18, 166 | color: 167 | Color(0xFF585858)), 168 | ), 169 | ], 170 | ), 171 | ), 172 | ) 173 | ], 174 | ), 175 | height: 60, 176 | ), 177 | ); 178 | }, 179 | ), 180 | ), 181 | Positioned( 182 | top: -5, 183 | left: -4, 184 | child: Image.asset('assets/images/crown.png')) 185 | ], 186 | ), 187 | ), 188 | SliverToBoxAdapter( 189 | child: SectionHeader( 190 | text: 'My Statistics', 191 | onPressed: () {}, 192 | ), 193 | ), 194 | SliverToBoxAdapter( 195 | child: Container( 196 | width: MediaQuery.of(context).size.width, 197 | height: 245, 198 | child: StatsCard(), 199 | ), 200 | ), 201 | ], 202 | ) 203 | : CustomScrollView( 204 | slivers: [ 205 | SliverFixedExtentList( 206 | delegate: 207 | SliverChildListDelegate.fixed([Container()]), 208 | itemExtent: 209 | MediaQuery.of(context).size.height * 0.23), 210 | SliverToBoxAdapter( 211 | child: SectionHeader( 212 | text: 'Leaderboard', 213 | onPressed: () {}, 214 | ), 215 | ), 216 | SliverToBoxAdapter( 217 | child: Stack( 218 | children: [ 219 | Container( 220 | width: MediaQuery.of(context).size.width, 221 | height: MediaQuery.of(context).size.height, 222 | child: ListView.builder( 223 | physics: NeverScrollableScrollPhysics(), 224 | itemCount: 10, 225 | itemBuilder: (context, index) { 226 | return Padding( 227 | padding: const EdgeInsets.symmetric( 228 | vertical: 8.0, horizontal: 14), 229 | child: CardWidget( 230 | gradient: false, 231 | button: false, 232 | child: Row( 233 | children: [ 234 | Padding( 235 | padding: const EdgeInsets.all(8.0), 236 | child: Text( 237 | "${index + 1}.", 238 | style: TextStyle( 239 | fontFamily: 'Red Hat Display', 240 | fontSize: 18, 241 | color: Color(0xFF585858)), 242 | ), 243 | ), 244 | Padding( 245 | padding: const EdgeInsets.all(8.0), 246 | child: Text( 247 | "${names[index]}", 248 | style: TextStyle( 249 | fontFamily: 'Red Hat Display', 250 | fontSize: 18, 251 | color: Color(0xFF585858)), 252 | ), 253 | ), 254 | Spacer(), 255 | Container( 256 | width: MediaQuery.of(context) 257 | .size 258 | .width * 259 | 0.3, 260 | decoration: BoxDecoration( 261 | borderRadius: BorderRadius.only( 262 | topLeft: Radius.elliptical( 263 | 10, 50), 264 | bottomLeft: 265 | Radius.elliptical( 266 | 10, 50)), 267 | gradient: LinearGradient( 268 | colors: [ 269 | material.Colors.white, 270 | colors[index] 271 | ], 272 | begin: Alignment.topLeft, 273 | end: 274 | Alignment.bottomRight)), 275 | child: Padding( 276 | padding: 277 | const EdgeInsets.all(8.0), 278 | child: Row( 279 | mainAxisAlignment: 280 | MainAxisAlignment 281 | .spaceEvenly, 282 | children: [ 283 | Image.asset( 284 | 'assets/images/CoinSmall.png', 285 | width: 50, 286 | ), 287 | Text( 288 | "${coins[index]}", 289 | style: TextStyle( 290 | fontFamily: 291 | 'Red Hat Display', 292 | fontSize: 18, 293 | color: 294 | Color(0xFF585858)), 295 | ), 296 | ], 297 | ), 298 | ), 299 | ) 300 | ], 301 | ), 302 | height: 60, 303 | ), 304 | ); 305 | }, 306 | ), 307 | ), 308 | Positioned( 309 | top: -5, 310 | left: -4, 311 | child: Image.asset('assets/images/crown.png')) 312 | ], 313 | ), 314 | ), 315 | ], 316 | ), 317 | ), 318 | Positioned( 319 | top: 0, 320 | child: Stack( 321 | alignment: Alignment.center, 322 | children: [ 323 | Column( 324 | children: [ 325 | TopBar( 326 | controller: controller, 327 | expanded: false, 328 | onMenuTap: widget.onMenuTap, 329 | ), 330 | Container( 331 | width: MediaQuery.of(context).size.width, 332 | height: MediaQuery.of(context).size.height * 0.07, 333 | color: material.Colors.white, 334 | child: Row( 335 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 336 | children: [ 337 | CupertinoButton( 338 | onPressed: () { 339 | setState(() { 340 | local = true; 341 | }); 342 | }, 343 | child: Text( 344 | "Local", 345 | style: TextStyle( 346 | color: Color(0xFF343434), 347 | fontSize: 20, 348 | fontFamily: 'Red Hat Display', 349 | fontWeight: material.FontWeight.w600), 350 | ), 351 | ), 352 | CupertinoButton( 353 | onPressed: () { 354 | setState(() { 355 | local = false; 356 | }); 357 | }, 358 | child: Text( 359 | "Global", 360 | style: TextStyle( 361 | color: Color(0xFF343434), 362 | fontSize: 20, 363 | fontFamily: 'Red Hat Display', 364 | fontWeight: material.FontWeight.w600), 365 | ), 366 | ) 367 | ]), 368 | ) 369 | ], 370 | ), 371 | Positioned( 372 | bottom: 0, 373 | left: 0, 374 | child: AnimatedContainer( 375 | margin: local 376 | ? EdgeInsets.only( 377 | left: MediaQuery.of(context).size.width * 0.33 - 35) 378 | : EdgeInsets.only( 379 | left: 380 | MediaQuery.of(context).size.width * 0.67 - 10), 381 | width: 40, 382 | height: 4, 383 | duration: Duration(milliseconds: 300), 384 | decoration: BoxDecoration( 385 | color: Color(0xFF03A9F4), 386 | borderRadius: BorderRadius.circular(500)), 387 | ), 388 | ) 389 | ], 390 | ), 391 | ) 392 | ], 393 | ), 394 | ); 395 | } 396 | } 397 | -------------------------------------------------------------------------------- /lib/ui/pages/navmenu/dashboard.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class Dashboard extends StatelessWidget { 4 | final bool? isCollapsed; 5 | final double? screenWidth; 6 | final Duration? duration; 7 | final Animation? scaleAnimation; 8 | final Function? onMenuTap; 9 | final Widget? child; 10 | 11 | const Dashboard( 12 | {Key? key, 13 | this.isCollapsed, 14 | this.screenWidth, 15 | this.duration, 16 | this.scaleAnimation, 17 | this.onMenuTap, 18 | this.child}) 19 | : super(key: key); 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return AnimatedPositioned( 24 | duration: duration!, 25 | top: 0, 26 | bottom: 0, 27 | left: isCollapsed! ? 0 : 0.6 * screenWidth!, 28 | right: isCollapsed! ? 0 : -0.6 * screenWidth!, 29 | child: ScaleTransition( 30 | scale: scaleAnimation!, 31 | child: Container( 32 | decoration: BoxDecoration( 33 | boxShadow: [ 34 | BoxShadow( 35 | blurRadius: 20, 36 | offset: Offset(0, 10), 37 | color: Color(0x2A636363), 38 | ), 39 | ], 40 | ), 41 | child: ClipRRect( 42 | borderRadius: isCollapsed! 43 | ? BorderRadius.zero 44 | : BorderRadius.all(Radius.circular(20)), 45 | child: Material( 46 | animationDuration: duration!, 47 | child: child, 48 | ), 49 | ), 50 | ), 51 | ), 52 | ); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /lib/ui/pages/navmenu/menu.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/box_icons_icons.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class Menu extends StatelessWidget { 5 | final Animation? slideAnimation; 6 | final Animation? menuAnimation; 7 | final int? selectedIndex; 8 | final Function onMenuItemClicked; 9 | final onMenuTap; 10 | 11 | const Menu( 12 | {Key? key, 13 | required this.onMenuTap, 14 | this.slideAnimation, 15 | this.menuAnimation, 16 | this.selectedIndex, 17 | required this.onMenuItemClicked}) 18 | : super(key: key); 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return Stack( 23 | children: [ 24 | Align( 25 | alignment: Alignment.centerRight, 26 | child: Container( 27 | width: MediaQuery.of(context).size.width * 0.33, 28 | height: MediaQuery.of(context).size.height * 0.67, 29 | decoration: BoxDecoration( 30 | color: Color(0x80FFFFFF), 31 | borderRadius: BorderRadius.circular(10), 32 | ), 33 | ), 34 | ), 35 | Align( 36 | alignment: Alignment.bottomCenter, 37 | child: Container( 38 | width: MediaQuery.of(context).size.width, 39 | height: 135, 40 | decoration: BoxDecoration( 41 | image: DecorationImage( 42 | image: AssetImage("assets/images/navwave.png"), 43 | fit: BoxFit.fitWidth), 44 | ), 45 | ), 46 | ), 47 | Align( 48 | alignment: Alignment.topRight, 49 | child: Padding( 50 | padding: const EdgeInsets.fromLTRB(0, 28, 10, 0), 51 | child: IconButton( 52 | icon: Icon( 53 | Icons.close, 54 | color: Colors.white, 55 | ), 56 | onPressed: onMenuTap, 57 | ), 58 | )), 59 | SlideTransition( 60 | position: slideAnimation!, 61 | child: ScaleTransition( 62 | scale: menuAnimation!, 63 | child: Padding( 64 | padding: const EdgeInsets.only(left: 20.0, top: 30), 65 | child: Align( 66 | alignment: Alignment.centerLeft, 67 | child: Column( 68 | // mainAxisSize: MainAxisSize.min, 69 | mainAxisAlignment: MainAxisAlignment.start, 70 | crossAxisAlignment: CrossAxisAlignment.start, 71 | children: [ 72 | Row( 73 | children: [ 74 | CircleAvatar( 75 | radius: 30, 76 | backgroundImage: AssetImage('assets/images/user.png'), 77 | ), 78 | Padding( 79 | padding: const EdgeInsets.only(left: 16.0), 80 | child: Column( 81 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 82 | crossAxisAlignment: CrossAxisAlignment.start, 83 | children: [ 84 | Text( 85 | "Akshay Maurya", 86 | maxLines: 1, 87 | overflow: TextOverflow.fade, 88 | style: TextStyle( 89 | fontFamily: "Red Hat Display", 90 | color: Colors.white, 91 | fontWeight: FontWeight.w600, 92 | fontSize: 24, 93 | ), 94 | ), 95 | Text( 96 | "Student", 97 | maxLines: 1, 98 | overflow: TextOverflow.fade, 99 | style: TextStyle( 100 | fontFamily: "Red Hat Display", 101 | color: Colors.white, 102 | fontWeight: FontWeight.w400, 103 | fontSize: 14, 104 | ), 105 | ), 106 | ], 107 | ), 108 | ) 109 | ], 110 | ), 111 | Spacer( 112 | flex: 3, 113 | ), 114 | Row( 115 | children: [ 116 | Padding( 117 | padding: const EdgeInsets.only(right: 20.0), 118 | child: Icon( 119 | BoxIcons.bx_home_circle, 120 | color: Colors.white, 121 | ), 122 | ), 123 | Text( 124 | "Home", 125 | maxLines: 1, 126 | overflow: TextOverflow.fade, 127 | style: TextStyle( 128 | fontFamily: "Red Hat Display", 129 | color: Colors.white, 130 | fontWeight: FontWeight.bold, 131 | fontSize: 20, 132 | ), 133 | ), 134 | ], 135 | ), 136 | Spacer(flex: 2), 137 | Row( 138 | children: [ 139 | Padding( 140 | padding: const EdgeInsets.only(right: 20.0), 141 | child: Icon( 142 | BoxIcons.bx_edit, 143 | color: Colors.white, 144 | ), 145 | ), 146 | Text( 147 | "Todo", 148 | maxLines: 1, 149 | overflow: TextOverflow.fade, 150 | style: TextStyle( 151 | fontFamily: "Red Hat Display", 152 | color: Colors.white, 153 | fontWeight: FontWeight.normal, 154 | fontSize: 20, 155 | ), 156 | ), 157 | ], 158 | ), 159 | Spacer(flex: 2), 160 | Row( 161 | children: [ 162 | Padding( 163 | padding: const EdgeInsets.only(right: 20.0), 164 | child: Icon( 165 | BoxIcons.bx_book_alt, 166 | color: Colors.white, 167 | ), 168 | ), 169 | Text( 170 | "Subjects", 171 | maxLines: 1, 172 | overflow: TextOverflow.fade, 173 | style: TextStyle( 174 | fontFamily: "Red Hat Display", 175 | color: Colors.white, 176 | fontWeight: FontWeight.normal, 177 | fontSize: 20, 178 | ), 179 | ), 180 | ], 181 | ), 182 | Spacer(flex: 2), 183 | Row( 184 | children: [ 185 | Padding( 186 | padding: const EdgeInsets.only(right: 20.0), 187 | child: Icon( 188 | BoxIcons.bx_chat, 189 | color: Colors.white, 190 | ), 191 | ), 192 | Text( 193 | "Forum", 194 | maxLines: 1, 195 | overflow: TextOverflow.fade, 196 | style: TextStyle( 197 | fontFamily: "Red Hat Display", 198 | color: Colors.white, 199 | fontWeight: FontWeight.normal, 200 | fontSize: 20, 201 | ), 202 | ), 203 | ], 204 | ), 205 | Spacer(flex: 2), 206 | Row( 207 | children: [ 208 | Padding( 209 | padding: const EdgeInsets.only(right: 20.0), 210 | child: Icon( 211 | BoxIcons.bx_calendar, 212 | color: Colors.white, 213 | ), 214 | ), 215 | Text( 216 | "Schedule", 217 | maxLines: 1, 218 | overflow: TextOverflow.fade, 219 | style: TextStyle( 220 | fontFamily: "Red Hat Display", 221 | color: Colors.white, 222 | fontWeight: FontWeight.normal, 223 | fontSize: 20, 224 | ), 225 | ), 226 | ], 227 | ), 228 | Spacer(flex: 2), 229 | SizedBox( 230 | height: 1, 231 | width: 200, 232 | child: Container( 233 | color: Colors.white54, 234 | ), 235 | ), 236 | Spacer(flex: 2), 237 | Row( 238 | children: [ 239 | Padding( 240 | padding: const EdgeInsets.only(right: 20.0), 241 | child: Icon( 242 | BoxIcons.bx_cog, 243 | color: Colors.white, 244 | ), 245 | ), 246 | Text( 247 | "Settings", 248 | maxLines: 1, 249 | overflow: TextOverflow.fade, 250 | style: TextStyle( 251 | fontFamily: "Red Hat Display", 252 | color: Colors.white, 253 | fontWeight: FontWeight.normal, 254 | fontSize: 20, 255 | ), 256 | ), 257 | ], 258 | ), 259 | Spacer(flex: 2), 260 | Row( 261 | children: [ 262 | Padding( 263 | padding: const EdgeInsets.only(right: 20.0), 264 | child: Icon( 265 | BoxIcons.bx_help_circle, 266 | color: Colors.white, 267 | ), 268 | ), 269 | Text( 270 | "Help", 271 | maxLines: 1, 272 | overflow: TextOverflow.fade, 273 | style: TextStyle( 274 | fontFamily: "Red Hat Display", 275 | color: Colors.white, 276 | fontWeight: FontWeight.normal, 277 | fontSize: 20, 278 | ), 279 | ), 280 | ], 281 | ), 282 | Spacer(flex: 5), 283 | ], 284 | ), 285 | ), 286 | ), 287 | ), 288 | ), 289 | ], 290 | ); 291 | } 292 | } 293 | -------------------------------------------------------------------------------- /lib/ui/pages/navmenu/menu_dashboard_layout.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/config.dart' as config; 2 | import 'package:elearning/ui/pages/home.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:elearning/ui/pages/navmenu/dashboard.dart'; 5 | 6 | import 'menu.dart'; 7 | 8 | final Color backgroundColor = Colors.lightBlue; 9 | 10 | class MenuDashboardLayout extends StatefulWidget { 11 | @override 12 | _MenuDashboardLayoutState createState() => _MenuDashboardLayoutState(); 13 | } 14 | 15 | class _MenuDashboardLayoutState extends State 16 | with SingleTickerProviderStateMixin { 17 | bool isCollapsed = true; 18 | double? screenWidth, screenHeight; 19 | final Duration duration = const Duration(milliseconds: 200); 20 | late AnimationController _controller; 21 | Animation? _scaleAnimation; 22 | Animation? _menuScaleAnimation; 23 | Animation? _slideAnimation; 24 | 25 | @override 26 | void initState() { 27 | super.initState(); 28 | _controller = AnimationController(vsync: this, duration: duration); 29 | _scaleAnimation = Tween(begin: 1, end: 0.75).animate(_controller); 30 | _menuScaleAnimation = 31 | Tween(begin: 0.5, end: 1).animate(_controller); 32 | _slideAnimation = Tween(begin: Offset(-1, 0), end: Offset(0, 0)) 33 | .animate(_controller); 34 | } 35 | 36 | @override 37 | void dispose() { 38 | _controller.dispose(); 39 | super.dispose(); 40 | } 41 | 42 | void onMenuTap() { 43 | setState(() { 44 | if (isCollapsed) 45 | _controller.forward(); 46 | else 47 | _controller.reverse(); 48 | 49 | isCollapsed = !isCollapsed; 50 | }); 51 | } 52 | 53 | void onMenuItemClicked() { 54 | setState(() { 55 | _controller.reverse(); 56 | }); 57 | 58 | isCollapsed = !isCollapsed; 59 | } 60 | 61 | @override 62 | Widget build(BuildContext context) { 63 | Size size = MediaQuery.of(context).size; 64 | screenHeight = size.height; 65 | screenWidth = size.width; 66 | 67 | return Scaffold( 68 | backgroundColor: backgroundColor, 69 | body: Stack( 70 | children: [ 71 | Container( 72 | width: MediaQuery.of(context).size.width, 73 | height: MediaQuery.of(context).size.height, 74 | decoration: BoxDecoration( 75 | gradient: config.Colors().waves, 76 | ), 77 | ), 78 | Menu( 79 | onMenuTap: onMenuTap, 80 | slideAnimation: _slideAnimation, 81 | menuAnimation: _menuScaleAnimation, 82 | onMenuItemClicked: onMenuItemClicked), 83 | Dashboard( 84 | duration: duration, 85 | onMenuTap: onMenuTap, 86 | scaleAnimation: _scaleAnimation, 87 | isCollapsed: isCollapsed, 88 | screenWidth: screenWidth, 89 | child: Home(onMenuTap: onMenuTap), 90 | ), 91 | ], 92 | ), 93 | ); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /lib/ui/pages/onboarding1.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/box_icons_icons.dart'; 2 | import 'package:elearning/ui/pages/navmenu/menu_dashboard_layout.dart'; 3 | import 'package:flutter/cupertino.dart'; 4 | 5 | class Onboarding extends StatefulWidget { 6 | @override 7 | _OnboardingState createState() => _OnboardingState(); 8 | } 9 | 10 | class _OnboardingState extends State { 11 | final PageController controller = PageController(initialPage: 0); 12 | int? pageNumber; 13 | List widgets = []; 14 | @override 15 | void initState() { 16 | pageNumber = 0; 17 | super.initState(); 18 | } 19 | 20 | void createWidgets() { 21 | widgets.addAll([ 22 | Column( 23 | mainAxisAlignment: MainAxisAlignment.center, 24 | children: [ 25 | Image.asset('assets/images/1.png'), 26 | Container( 27 | width: MediaQuery.of(context).size.width * 0.6, 28 | child: Text( 29 | "Easy access to video lectures, & reading materials.", 30 | textAlign: TextAlign.center, 31 | style: TextStyle( 32 | fontFamily: 'Red Hat Display', 33 | fontSize: 14, 34 | color: Color(0xFFFFFFFF)), 35 | ), 36 | ) 37 | ], 38 | ), 39 | Column( 40 | mainAxisAlignment: MainAxisAlignment.center, 41 | children: [ 42 | Image.asset('assets/images/2.png'), 43 | Container( 44 | width: MediaQuery.of(context).size.width * 0.6, 45 | child: Text( 46 | "Ask questions, earn coins and dominate the global leaderboard.", 47 | textAlign: TextAlign.center, 48 | style: TextStyle( 49 | fontFamily: 'Red Hat Display', 50 | fontSize: 14, 51 | color: Color(0xFFFFFFFF)), 52 | ), 53 | ) 54 | ], 55 | ), 56 | Column( 57 | mainAxisAlignment: MainAxisAlignment.center, 58 | children: [ 59 | Image.asset('assets/images/logo.png'), 60 | Container( 61 | width: MediaQuery.of(context).size.width * 0.6, 62 | child: Text( 63 | "E-Learn", 64 | textAlign: TextAlign.center, 65 | style: TextStyle( 66 | fontFamily: 'Red Hat Display', 67 | fontSize: 28, 68 | color: Color(0xFFFFFFFF)), 69 | ), 70 | ), 71 | SizedBox( 72 | height: MediaQuery.of(context).size.height * 0.3, 73 | ), 74 | Container( 75 | width: MediaQuery.of(context).size.width * 0.6, 76 | child: Text( 77 | "The complete E-learning solution for students of all ages!\n\n\nJoin for FREE now!", 78 | textAlign: TextAlign.center, 79 | style: TextStyle( 80 | fontFamily: 'Red Hat Display', 81 | fontSize: 14, 82 | color: Color(0xFFFFFFFF)), 83 | ), 84 | ), 85 | SizedBox( 86 | height: MediaQuery.of(context).size.height * 0.05, 87 | ), 88 | CupertinoButton( 89 | color: Color(0xFFFFFFFF), 90 | child: Row( 91 | mainAxisAlignment: MainAxisAlignment.center, 92 | mainAxisSize: MainAxisSize.min, 93 | children: [ 94 | Text( 95 | "Sign in with Google ➡", 96 | style: TextStyle( 97 | fontFamily: 'Red Hat Display', 98 | fontSize: 16, 99 | color: Color(0xFF0083BE), 100 | fontWeight: FontWeight.bold), 101 | ), 102 | ], 103 | ), 104 | onPressed: () { 105 | Navigator.pushReplacement( 106 | context, 107 | CupertinoPageRoute( 108 | builder: (context) => MenuDashboardLayout())); 109 | }) 110 | ], 111 | ), 112 | ]); 113 | } 114 | 115 | @override 116 | Widget build(BuildContext context) { 117 | createWidgets(); 118 | return CupertinoPageScaffold( 119 | child: Stack( 120 | children: [ 121 | Container( 122 | decoration: BoxDecoration( 123 | gradient: LinearGradient(colors: [ 124 | Color(0xFFABDCFF), 125 | Color(0xFF0396FF), 126 | ], begin: Alignment.topLeft, end: Alignment.bottomRight), 127 | ), 128 | ), 129 | Positioned( 130 | top: 0, left: 0, child: Image.asset('assets/images/wave.png')), 131 | Align( 132 | alignment: Alignment.center, 133 | child: PageView.builder( 134 | controller: controller, 135 | onPageChanged: (value) { 136 | setState(() { 137 | pageNumber = value; 138 | }); 139 | }, 140 | itemCount: 3, 141 | itemBuilder: (context, index) => widgets[index]), 142 | ), 143 | pageNumber == 2 144 | ? Container() 145 | : Positioned( 146 | bottom: 10, 147 | right: 10, 148 | child: CupertinoButton( 149 | child: Icon( 150 | pageNumber == 1 151 | ? BoxIcons.bx_check 152 | : BoxIcons.bx_chevron_right, 153 | color: Color(0xFFFFFFFF), 154 | size: 30, 155 | ), 156 | onPressed: () { 157 | controller.nextPage( 158 | duration: Duration(milliseconds: 300), 159 | curve: Curves.fastOutSlowIn); 160 | }, 161 | )) 162 | ], 163 | ), 164 | ); 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /lib/ui/pages/planner.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/config.dart' as config; 2 | import 'package:elearning/ui/widgets/card.dart'; 3 | import 'package:elearning/ui/widgets/sectionHeader.dart'; 4 | import 'package:elearning/ui/widgets/topBar.dart'; 5 | import 'package:elearning/ui/widgets/videoCard.dart'; 6 | import 'package:flutter/cupertino.dart'; 7 | import 'package:flutter_calendar_carousel/flutter_calendar_carousel.dart'; 8 | import 'package:flutter/material.dart' as material; 9 | 10 | class PlannerPage extends StatelessWidget { 11 | PlannerPage({ 12 | Key? key, 13 | required this.onMenuTap, 14 | }) : super(key: key); 15 | final Function? onMenuTap; 16 | 17 | TextEditingController controller = TextEditingController(); 18 | @override 19 | Widget build(BuildContext context) { 20 | return CupertinoPageScaffold( 21 | backgroundColor: config.Colors().secondColor(1), 22 | child: Stack( 23 | alignment: Alignment.center, 24 | children: [ 25 | SafeArea( 26 | child: CustomScrollView( 27 | slivers: [ 28 | SliverFixedExtentList( 29 | delegate: SliverChildListDelegate.fixed([Container()]), 30 | itemExtent: MediaQuery.of(context).size.height * 0.16), 31 | SliverToBoxAdapter( 32 | child: SectionHeader( 33 | text: 'Today\'s Work', 34 | onPressed: () {}, 35 | ), 36 | ), 37 | SliverToBoxAdapter( 38 | child: Container( 39 | width: MediaQuery.of(context).size.width, 40 | height: 240, 41 | child: ListView.builder( 42 | scrollDirection: Axis.horizontal, 43 | itemCount: 2, 44 | itemBuilder: (context, index) { 45 | return VideoCard(long: true); 46 | }, 47 | ), 48 | ), 49 | ), 50 | SliverToBoxAdapter( 51 | child: SectionHeader( 52 | text: 'Calendar', 53 | onPressed: () {}, 54 | ), 55 | ), 56 | SliverToBoxAdapter( 57 | child: Container( 58 | width: MediaQuery.of(context).size.width, 59 | height: 450, 60 | child: CardWidget( 61 | button: false, 62 | gradient: false, 63 | child: material.Material( 64 | child: CalendarCarousel( 65 | isScrollable: false, 66 | todayButtonColor: material.Colors.lightBlue, 67 | ), 68 | ), 69 | ), 70 | ), 71 | ), 72 | SliverToBoxAdapter( 73 | child: SizedBox( 74 | height: 70, 75 | child: Text(""), 76 | ), 77 | ) 78 | ], 79 | ), 80 | ), 81 | Positioned( 82 | top: 0, 83 | child: TopBar( 84 | controller: controller, 85 | expanded: false, 86 | onMenuTap: onMenuTap, 87 | ), 88 | ) 89 | ], 90 | ), 91 | ); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /lib/ui/pages/undefinedScreen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class UndefinedScreen extends StatelessWidget { 4 | final String? name; 5 | const UndefinedScreen({Key? key, this.name}) : super(key: key); 6 | @override 7 | Widget build(BuildContext context) { 8 | return Scaffold( 9 | body: Center( 10 | child: Text('Route for $name is not defined'), 11 | ), 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/ui/pages/video.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/box_icons_icons.dart'; 2 | import 'package:elearning/theme/config.dart'; 3 | import 'package:elearning/ui/widgets/card.dart'; 4 | import 'package:flutter/cupertino.dart'; 5 | import 'package:flutter/material.dart' as material; 6 | 7 | class VideoPage extends StatefulWidget { 8 | @override 9 | _VideoPageState createState() => _VideoPageState(); 10 | } 11 | 12 | class _VideoPageState extends State { 13 | @override 14 | Widget build(BuildContext context) { 15 | return CupertinoPageScaffold( 16 | backgroundColor: Colors().secondColor(1), 17 | navigationBar: CupertinoNavigationBar( 18 | automaticallyImplyLeading: true, 19 | previousPageTitle: "Back", 20 | trailing: CupertinoButton( 21 | padding: EdgeInsets.all(0), 22 | child: Icon(BoxIcons.bx_share_alt), 23 | onPressed: () {}, 24 | ), 25 | ), 26 | child: Stack( 27 | alignment: Alignment.center, 28 | children: [ 29 | Container( 30 | height: MediaQuery.of(context).size.height, 31 | child: SingleChildScrollView( 32 | child: Stack( 33 | alignment: Alignment.center, 34 | children: [ 35 | Container( 36 | child: Column( 37 | children: [ 38 | Container( 39 | width: MediaQuery.of(context).size.width, 40 | height: MediaQuery.of(context).size.height * 0.5, 41 | child: Image( 42 | image: ResizeImage( 43 | AssetImage('assets/images/video.jpg'), 44 | height: MediaQuery.of(context).size.width ~/ 2, 45 | width: 46 | (MediaQuery.of(context).size.height * 0.5) ~/ 2, 47 | ), 48 | fit: BoxFit.cover, 49 | ), 50 | ), 51 | Container( 52 | width: MediaQuery.of(context).size.width, 53 | child: Column( 54 | mainAxisAlignment: MainAxisAlignment.center, 55 | mainAxisSize: MainAxisSize.min, 56 | children: [ 57 | Padding( 58 | padding: const EdgeInsets.fromLTRB(24, 10, 8, 8.0), 59 | child: Row( 60 | children: [ 61 | Container( 62 | width: 4, 63 | height: 30, 64 | decoration: BoxDecoration( 65 | borderRadius: BorderRadius.circular(500), 66 | color: Color(0xFF343434)), 67 | child: Text(""), 68 | ), 69 | Padding( 70 | padding: const EdgeInsets.all(8.0), 71 | child: Text( 72 | "Revision - Kinematics", 73 | style: TextStyle( 74 | color: Color(0xFF343434), 75 | fontFamily: 'Red Hat Display', 76 | fontSize: 24), 77 | ), 78 | ) 79 | ], 80 | ), 81 | ), 82 | Padding( 83 | padding: 84 | const EdgeInsets.symmetric(horizontal: 16.0), 85 | child: Row( 86 | children: [ 87 | Padding( 88 | padding: const EdgeInsets.symmetric( 89 | horizontal: 8.0), 90 | child: Icon(BoxIcons.bx_bar_chart_alt_2, 91 | size: 20, color: Color(0xFFADADAD)), 92 | ), 93 | Text( 94 | "Beginner", 95 | style: TextStyle( 96 | color: Color(0xFFADADAD), 97 | fontFamily: 'Red Hat Display', 98 | fontSize: 14), 99 | ), 100 | Spacer(), 101 | Text( 102 | "12 mins", 103 | style: TextStyle( 104 | color: Color(0xFFADADAD), 105 | fontFamily: 'Red Hat Display', 106 | fontSize: 14), 107 | ), 108 | Padding( 109 | padding: const EdgeInsets.symmetric( 110 | horizontal: 8.0), 111 | child: Icon(BoxIcons.bx_timer, 112 | size: 20, color: Color(0xFFADADAD)), 113 | ), 114 | ], 115 | ), 116 | ), 117 | Container( 118 | padding: EdgeInsets.all(8), 119 | width: MediaQuery.of(context).size.width * 0.9, 120 | child: Text( 121 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ut odio id urna ornare rhoncus. Fusce egestas tellus vitae elit pellentesque, sit amet gravida metus consectetur. Sed in hendrerit elit. Phasellus ullamcorper vulputate ex quis consequat. Aenean fringilla vulputate egestas. Aenean nec mattis turpis. Aenean a faucibus purus, in pulvinar velit. Nulla efficitur erat commodo.", 122 | style: TextStyle( 123 | color: Color(0xFF343434), 124 | fontFamily: 'Red Hat Display', 125 | fontSize: 16), 126 | )) 127 | ], 128 | ), 129 | ), 130 | ], 131 | )), 132 | Positioned( 133 | right: 30, 134 | top: MediaQuery.of(context).size.height * 0.465, 135 | child: Container( 136 | decoration: BoxDecoration( 137 | gradient: LinearGradient( 138 | colors: [ 139 | Color(0xFFABDCFF), 140 | Color(0xFF0396FF), 141 | ], 142 | begin: Alignment.topLeft, 143 | end: Alignment.bottomRight, 144 | ), 145 | boxShadow: [ 146 | BoxShadow( 147 | blurRadius: 25, 148 | color: Color(0xFF03A9F4).withOpacity(0.4), 149 | offset: Offset(0, 4)) 150 | ], 151 | borderRadius: BorderRadius.circular(500)), 152 | child: material.FloatingActionButton( 153 | heroTag: "video", 154 | elevation: 0, 155 | highlightElevation: 0, 156 | backgroundColor: material.Colors.transparent, 157 | child: Icon(BoxIcons.bx_play, size: 40), 158 | onPressed: () {}), 159 | )), 160 | ], 161 | )), 162 | ), 163 | Positioned( 164 | bottom: 0, 165 | left: 0, 166 | child: CardWidget( 167 | button: true, 168 | gradient: true, 169 | height: 60, 170 | width: MediaQuery.of(context).size.width, 171 | child: Row( 172 | mainAxisAlignment: MainAxisAlignment.center, 173 | children: [ 174 | Text( 175 | "Attempt Test", 176 | style: TextStyle( 177 | color: material.Colors.white, 178 | fontFamily: 'Red Hat Display', 179 | fontSize: 18), 180 | ), 181 | Padding( 182 | padding: const EdgeInsets.all(8.0), 183 | child: 184 | Icon(BoxIcons.bx_pencil, color: material.Colors.white), 185 | ), 186 | ], 187 | ), 188 | ), 189 | ) 190 | ], 191 | ), 192 | ); 193 | } 194 | } 195 | -------------------------------------------------------------------------------- /lib/ui/pages/videos.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/config.dart' as config; 2 | import 'package:elearning/ui/widgets/sectionHeader.dart'; 3 | import 'package:elearning/ui/widgets/topBar.dart'; 4 | import 'package:elearning/ui/widgets/videoCard.dart'; 5 | import 'package:flutter/cupertino.dart'; 6 | 7 | class VideosPage extends StatelessWidget { 8 | VideosPage({ 9 | Key? key, 10 | required this.onMenuTap, 11 | }) : super(key: key); 12 | final Function? onMenuTap; 13 | 14 | TextEditingController controller = TextEditingController(); 15 | @override 16 | Widget build(BuildContext context) { 17 | return CupertinoPageScaffold( 18 | backgroundColor: config.Colors().secondColor(1), 19 | child: Stack( 20 | alignment: Alignment.center, 21 | children: [ 22 | SafeArea( 23 | child: CustomScrollView( 24 | slivers: [ 25 | SliverFixedExtentList( 26 | delegate: SliverChildListDelegate.fixed([Container()]), 27 | itemExtent: MediaQuery.of(context).size.height * 0.16), 28 | SliverToBoxAdapter( 29 | child: SectionHeader( 30 | text: 'Best of Physics', 31 | onPressed: () {}, 32 | ), 33 | ), 34 | SliverToBoxAdapter( 35 | child: Container( 36 | width: MediaQuery.of(context).size.width, 37 | height: 245, 38 | child: ListView.builder( 39 | scrollDirection: Axis.horizontal, 40 | itemCount: 4, 41 | itemBuilder: (context, index) { 42 | return VideoCard(long: false); 43 | }, 44 | ), 45 | ), 46 | ), 47 | SliverToBoxAdapter( 48 | child: SectionHeader( 49 | text: 'Best of Chemistry', 50 | onPressed: () {}, 51 | ), 52 | ), 53 | SliverToBoxAdapter( 54 | child: Container( 55 | width: MediaQuery.of(context).size.width, 56 | height: 245, 57 | child: ListView.builder( 58 | scrollDirection: Axis.horizontal, 59 | itemCount: 4, 60 | itemBuilder: (context, index) { 61 | return VideoCard(long: false); 62 | }, 63 | ), 64 | ), 65 | ), 66 | SliverToBoxAdapter( 67 | child: SectionHeader( 68 | text: 'Best of Maths', 69 | onPressed: () {}, 70 | ), 71 | ), 72 | SliverToBoxAdapter( 73 | child: Container( 74 | width: MediaQuery.of(context).size.width, 75 | height: 245, 76 | child: ListView.builder( 77 | scrollDirection: Axis.horizontal, 78 | itemCount: 4, 79 | itemBuilder: (context, index) { 80 | return VideoCard(long: false); 81 | }, 82 | ), 83 | ), 84 | ), 85 | SliverToBoxAdapter( 86 | child: SectionHeader( 87 | text: 'Best of Biology', 88 | onPressed: () {}, 89 | ), 90 | ), 91 | SliverToBoxAdapter( 92 | child: Container( 93 | width: MediaQuery.of(context).size.width, 94 | height: 245, 95 | child: ListView.builder( 96 | scrollDirection: Axis.horizontal, 97 | itemCount: 4, 98 | itemBuilder: (context, index) { 99 | return VideoCard(long: false); 100 | }, 101 | ), 102 | ), 103 | ), 104 | ], 105 | ), 106 | ), 107 | Positioned( 108 | top: 0, 109 | child: TopBar( 110 | controller: controller, 111 | expanded: false, 112 | onMenuTap: onMenuTap, 113 | ), 114 | ) 115 | ], 116 | ), 117 | ); 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /lib/ui/widgets/card.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | import 'package:elearning/theme/config.dart'; 4 | import 'package:flutter/material.dart' as material; 5 | 6 | class CardWidget extends StatelessWidget { 7 | final bool gradient; 8 | final bool button; 9 | final Color? color; 10 | final double? width; 11 | final double? height; 12 | final Widget child; 13 | final int? duration; 14 | final Border? border; 15 | final func; 16 | CardWidget({ 17 | required this.gradient, 18 | required this.button, 19 | this.color, 20 | this.width, 21 | this.height, 22 | required this.child, 23 | this.duration, 24 | this.func, 25 | this.border, 26 | }); 27 | @override 28 | Widget build(BuildContext context) { 29 | return Container( 30 | decoration: material.BoxDecoration( 31 | boxShadow: [ 32 | BoxShadow( 33 | blurRadius: 25, 34 | offset: Offset(0, 10), 35 | color: Color(0x1A636363), 36 | ), 37 | ], 38 | ), 39 | child: ClipPath( 40 | clipper: ShapeBorderClipper( 41 | shape: RoundedRectangleBorder( 42 | borderRadius: BorderRadius.circular(10), 43 | ), 44 | ), 45 | child: material.AnimatedContainer( 46 | duration: Duration(milliseconds: duration ?? 500), 47 | width: width, 48 | height: height, 49 | decoration: BoxDecoration( 50 | border: border ?? 51 | Border.all( 52 | color: material.Colors.white, 53 | width: 0, 54 | ), 55 | // borderRadius: BorderRadius.circular(10), 56 | color: color ?? Colors().mainColor(1), 57 | gradient: gradient 58 | ? Colors().waves 59 | : LinearGradient(colors: [ 60 | color ?? Colors().mainColor(1), 61 | color ?? Colors().mainColor(1) 62 | ]), 63 | ), 64 | child: button 65 | ? ClipRRect( 66 | borderRadius: material.BorderRadius.circular(10), 67 | child: material.MaterialButton( 68 | padding: material.EdgeInsets.zero, 69 | elevation: 0, 70 | child: child, 71 | onPressed: func, 72 | ), 73 | ) 74 | : child, 75 | ), 76 | ), 77 | ); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /lib/ui/widgets/overlay.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:elearning/theme/box_icons_icons.dart'; 4 | import 'package:elearning/ui/widgets/card.dart'; 5 | import 'package:flutter/cupertino.dart'; 6 | import 'package:intl/intl.dart'; 7 | 8 | class OverlayWidget extends StatelessWidget { 9 | OverlayWidget({ 10 | Key? key, 11 | }) : super(key: key); 12 | String getStrToday() { 13 | var today = DateFormat().add_yMMMMd().format(DateTime.now()); 14 | var strDay = today.split(" ")[1].replaceFirst(',', ''); 15 | if (strDay == '1') { 16 | strDay = strDay + "st"; 17 | } else if (strDay == '2') { 18 | strDay = strDay + "nd"; 19 | } else if (strDay == '3') { 20 | strDay = strDay + "rd"; 21 | } else { 22 | strDay = strDay + "th"; 23 | } 24 | var strMonth = today.split(" ")[0]; 25 | var strYear = today.split(" ")[2]; 26 | return "$strDay $strMonth $strYear"; 27 | } 28 | 29 | final List names = [ 30 | 'Revision - Kinematics', 31 | '3D Geometry', 32 | 'Revision - Organic Bonds', 33 | 'Plants and Life' 34 | ]; 35 | final List times = ['5pm-6pm', '6pm-7pm', '7pm-8pm', '8pm-9pm']; 36 | final List colors = [ 37 | Color(0xFFFF0000), 38 | Color(0xFF0000FF), 39 | Color(0xFFFFFF00), 40 | Color(0xFF00FF00) 41 | ]; 42 | 43 | @override 44 | Widget build(BuildContext context) { 45 | return BackdropFilter( 46 | filter: ImageFilter.blur(sigmaX: 4, sigmaY: 4), 47 | child: Container( 48 | width: MediaQuery.of(context).size.width, 49 | height: MediaQuery.of(context).size.height, 50 | color: Color(0xFFEDEDED).withOpacity(0.65), 51 | child: Column( 52 | mainAxisAlignment: MainAxisAlignment.start, 53 | mainAxisSize: MainAxisSize.min, 54 | children: [ 55 | Padding( 56 | padding: 57 | const EdgeInsets.symmetric(vertical: 48.0, horizontal: 10), 58 | child: Container( 59 | width: MediaQuery.of(context).size.width, 60 | child: Row( 61 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 62 | mainAxisSize: MainAxisSize.min, 63 | children: [ 64 | Text( 65 | "Today", 66 | style: TextStyle( 67 | fontFamily: 'Red Hat Display', 68 | fontSize: 24, 69 | color: Color(0xFF343434), 70 | fontWeight: FontWeight.bold), 71 | ), 72 | Text( 73 | getStrToday(), 74 | style: TextStyle( 75 | fontFamily: 'Red Hat Display', 76 | fontSize: 24, 77 | color: Color(0xFF343434), 78 | fontWeight: FontWeight.bold), 79 | ) 80 | ], 81 | ), 82 | ), 83 | ), 84 | Container( 85 | width: MediaQuery.of(context).size.width, 86 | height: MediaQuery.of(context).size.height * 0.8, 87 | child: ListView.builder( 88 | physics: ScrollPhysics(), 89 | itemCount: 5, 90 | itemBuilder: (context, index) { 91 | return index == 4 92 | ? Padding( 93 | padding: const EdgeInsets.symmetric( 94 | vertical: 8.0, horizontal: 14), 95 | child: CardWidget( 96 | gradient: true, 97 | button: true, 98 | child: Row( 99 | mainAxisAlignment: MainAxisAlignment.center, 100 | children: [ 101 | Padding( 102 | padding: const EdgeInsets.all(8), 103 | child: Icon( 104 | BoxIcons.bx_plus, 105 | color: Color(0xFFFFFFFF), 106 | )), 107 | Padding( 108 | padding: const EdgeInsets.all(8), 109 | child: Text( 110 | "Add reminder", 111 | style: TextStyle( 112 | fontFamily: 'Red Hat Display', 113 | fontSize: 18, 114 | color: Color(0xFFFFFFFF)), 115 | ), 116 | ), 117 | ], 118 | ), 119 | height: 80, 120 | ), 121 | ) 122 | : Padding( 123 | padding: const EdgeInsets.symmetric( 124 | vertical: 8.0, horizontal: 14), 125 | child: CardWidget( 126 | gradient: false, 127 | button: false, 128 | child: Row( 129 | children: [ 130 | Column( 131 | mainAxisAlignment: MainAxisAlignment.center, 132 | crossAxisAlignment: CrossAxisAlignment.start, 133 | children: [ 134 | Padding( 135 | padding: 136 | const EdgeInsets.fromLTRB(8, 8, 8, 2), 137 | child: Text( 138 | "${names[index]}.", 139 | style: TextStyle( 140 | fontFamily: 'Red Hat Display', 141 | fontSize: 18, 142 | color: Color(0xFF585858)), 143 | ), 144 | ), 145 | Padding( 146 | padding: 147 | const EdgeInsets.fromLTRB(8, 2, 8, 8), 148 | child: Text( 149 | "${times[index]}", 150 | style: TextStyle( 151 | fontFamily: 'Red Hat Display', 152 | fontSize: 14, 153 | color: Color(0xFF585858)), 154 | ), 155 | ), 156 | ], 157 | ), 158 | Spacer(), 159 | Container( 160 | width: 161 | MediaQuery.of(context).size.width * 0.3, 162 | decoration: BoxDecoration( 163 | borderRadius: BorderRadius.only( 164 | topLeft: Radius.elliptical(10, 50), 165 | bottomLeft: 166 | Radius.elliptical(10, 50)), 167 | gradient: LinearGradient( 168 | colors: [ 169 | Color(0xFFFFFFFF), 170 | colors[index] 171 | ], 172 | begin: Alignment.topLeft, 173 | end: Alignment.bottomRight)), 174 | child: SizedBox( 175 | height: 80, 176 | )) 177 | ], 178 | ), 179 | height: 80, 180 | ), 181 | ); 182 | }, 183 | ), 184 | ), 185 | ], 186 | ), 187 | ), 188 | ); 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /lib/ui/widgets/sectionHeader.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/box_icons_icons.dart'; 2 | import 'package:flutter/cupertino.dart'; 3 | import 'package:flutter/material.dart' as material; 4 | 5 | class SectionHeader extends StatelessWidget { 6 | const SectionHeader({ 7 | Key? key, 8 | required this.text, 9 | required this.onPressed, 10 | }) : super(key: key); 11 | final String text; 12 | final Function onPressed; 13 | @override 14 | Widget build(BuildContext context) { 15 | return Row( 16 | mainAxisAlignment: MainAxisAlignment.center, 17 | children: [ 18 | Container( 19 | height: 20, 20 | width: 4, 21 | margin: EdgeInsets.all(8), 22 | decoration: BoxDecoration( 23 | borderRadius: BorderRadius.circular(500), 24 | color: Color(0xFF343434)), 25 | ), 26 | Text( 27 | text, 28 | style: TextStyle().copyWith( 29 | fontSize: 17.0, 30 | ), 31 | ), 32 | Spacer(), 33 | CupertinoButton( 34 | child: 35 | Icon(BoxIcons.bx_chevron_right, color: material.Colors.lightBlue), 36 | onPressed: onPressed as void Function()?, 37 | ) 38 | ], 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/ui/widgets/statsCard.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/box_icons_icons.dart'; 2 | import 'package:elearning/theme/config.dart'; 3 | import 'package:elearning/ui/pages/video.dart'; 4 | import 'package:elearning/ui/widgets/card.dart'; 5 | import 'package:flutter/cupertino.dart'; 6 | import 'package:flutter/material.dart' as material; 7 | 8 | class StatsCard extends material.StatelessWidget { 9 | const StatsCard({ 10 | material.Key? key, 11 | }) : super(key: key); 12 | 13 | @override 14 | material.Widget build(material.BuildContext context) { 15 | return material.Padding( 16 | padding: const material.EdgeInsets.all(10.0), 17 | child: CardWidget( 18 | gradient: false, 19 | button: true, 20 | width: 360, 21 | child: material.Column( 22 | mainAxisAlignment: material.MainAxisAlignment.start, 23 | children: [ 24 | material.Padding( 25 | padding: const material.EdgeInsets.only(bottom: 6.0), 26 | child: material.GestureDetector( 27 | child: material.Container( 28 | padding: material.EdgeInsets.fromLTRB(0, 14, 0, 14), 29 | decoration: material.BoxDecoration(gradient: Colors().waves), 30 | child: material.Padding( 31 | padding: const EdgeInsets.all(8.0), 32 | child: material.Row( 33 | mainAxisAlignment: MainAxisAlignment.center, 34 | children: [ 35 | Padding( 36 | padding: const EdgeInsets.all(8.0), 37 | child: Text( 38 | "3489", 39 | style: TextStyle( 40 | fontFamily: 'Red Hat Display', 41 | fontSize: 18, 42 | color: Color(0xFFFFFFFF)), 43 | ), 44 | ), 45 | Image.asset( 46 | 'assets/images/CoinSmall.png', 47 | width: 50, 48 | ), 49 | ], 50 | ), 51 | ), 52 | ), 53 | onTap: () { 54 | material.Navigator.push( 55 | context, 56 | CupertinoPageRoute( 57 | builder: (context) => VideoPage(), 58 | ), 59 | ); 60 | }, 61 | ), 62 | ), 63 | material.Padding( 64 | padding: const material.EdgeInsets.all(8.0), 65 | child: material.Text( 66 | "Statistics", 67 | overflow: material.TextOverflow.ellipsis, 68 | maxLines: 2, 69 | style: material.TextStyle( 70 | color: material.Color(0xFF535353), 71 | fontFamily: 'Red Hat Display', 72 | fontSize: 16), 73 | ), 74 | ), 75 | material.Padding( 76 | padding: const material.EdgeInsets.symmetric(horizontal: 8.0), 77 | child: material.Row( 78 | children: [ 79 | material.Icon(BoxIcons.bx_question_mark, size: 16), 80 | material.Text( 81 | "23 Questions asked", 82 | style: material.TextStyle( 83 | color: material.Color(0xFFADADAD), 84 | fontFamily: 'Red Hat Display', 85 | fontSize: 10), 86 | ), 87 | material.Spacer(), 88 | material.Text( 89 | "12 days Streak", 90 | style: material.TextStyle( 91 | color: material.Color(0xFFADADAD), 92 | fontFamily: 'Red Hat Display', 93 | fontSize: 10), 94 | ), 95 | material.Icon(BoxIcons.bxs_flame, size: 16), 96 | ], 97 | ), 98 | ), 99 | material.Padding( 100 | padding: const material.EdgeInsets.symmetric(horizontal: 8.0), 101 | child: material.Row( 102 | children: [ 103 | material.Icon(BoxIcons.bx_pen, size: 16), 104 | material.Text( 105 | "89 Questions answered", 106 | style: material.TextStyle( 107 | color: material.Color(0xFFADADAD), 108 | fontFamily: 'Red Hat Display', 109 | fontSize: 10), 110 | ), 111 | material.Spacer(), 112 | material.Text( 113 | "25 topics revised", 114 | style: material.TextStyle( 115 | color: material.Color(0xFFADADAD), 116 | fontFamily: 'Red Hat Display', 117 | fontSize: 10), 118 | ), 119 | material.Icon(BoxIcons.bx_book_open, size: 16), 120 | ], 121 | ), 122 | ), 123 | material.Spacer(), 124 | ], 125 | ), 126 | ), 127 | ); 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /lib/ui/widgets/topBar.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/box_icons_icons.dart'; 2 | import 'package:elearning/ui/widgets/card.dart'; 3 | import 'package:flutter/cupertino.dart'; 4 | import 'package:flutter/material.dart' as material; 5 | import 'package:flutter/services.dart'; 6 | 7 | class TopBar extends StatefulWidget { 8 | const TopBar({ 9 | Key? key, 10 | required this.controller, 11 | required this.expanded, 12 | required this.onMenuTap, 13 | }) : super(key: key); 14 | 15 | final TextEditingController controller; 16 | final bool expanded; 17 | final onMenuTap; 18 | 19 | @override 20 | _TopBarState createState() => _TopBarState(); 21 | } 22 | 23 | class _TopBarState extends State { 24 | int tab = 0; 25 | @override 26 | Widget build(BuildContext context) { 27 | return Container( 28 | color: CupertinoColors.white, 29 | width: MediaQuery.of(context).size.width, 30 | height: widget.expanded 31 | ? MediaQuery.of(context).size.height * 0.35 32 | : MediaQuery.of(context).size.height * 0.19, 33 | child: Column( 34 | mainAxisSize: MainAxisSize.min, 35 | children: [ 36 | Padding( 37 | padding: 38 | EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.04), 39 | child: Row( 40 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 41 | children: [ 42 | Padding( 43 | padding: const EdgeInsets.symmetric(horizontal: 15), 44 | child: Text( 45 | "Hi, Akshay.", 46 | style: TextStyle( 47 | color: Color(0xFF343434), 48 | fontSize: 24, 49 | fontFamily: 'Red Hat Display', 50 | fontWeight: material.FontWeight.w600), 51 | ), 52 | ), 53 | Padding( 54 | padding: const EdgeInsets.symmetric(horizontal: 15), 55 | child: GestureDetector( 56 | child: material.CircleAvatar( 57 | backgroundImage: AssetImage('assets/images/user.png'), 58 | ), 59 | onTap: widget.onMenuTap, 60 | ), 61 | ), 62 | ], 63 | ), 64 | ), 65 | Padding( 66 | padding: const EdgeInsets.all(15.0), 67 | child: CupertinoTextField( 68 | decoration: BoxDecoration( 69 | borderRadius: BorderRadius.circular(10), 70 | color: material.Colors.white, 71 | boxShadow: [ 72 | BoxShadow( 73 | blurRadius: 25, 74 | offset: Offset(0, 10), 75 | color: Color(0x1A636363), 76 | ), 77 | ]), 78 | padding: EdgeInsets.all(10), 79 | style: TextStyle( 80 | color: Color(0xFF343434), 81 | fontSize: 18, 82 | fontFamily: 'Red Hat Display'), 83 | enableInteractiveSelection: true, 84 | controller: widget.controller, 85 | expands: false, 86 | inputFormatters: [ 87 | BlacklistingTextInputFormatter.singleLineFormatter 88 | ], 89 | keyboardType: TextInputType.text, 90 | suffix: Padding( 91 | padding: const EdgeInsets.symmetric(horizontal: 8.0), 92 | child: Icon( 93 | BoxIcons.bx_search, 94 | color: Color(0xFFADADAD), 95 | ), 96 | ), 97 | textInputAction: TextInputAction.search, 98 | textCapitalization: TextCapitalization.words, 99 | placeholder: "Search", 100 | placeholderStyle: TextStyle( 101 | color: Color(0xFFADADAD), 102 | fontSize: 18, 103 | fontFamily: 'Red Hat Display'), 104 | ), 105 | ), 106 | widget.expanded 107 | ? Container( 108 | width: MediaQuery.of(context).size.width, 109 | height: MediaQuery.of(context).size.height * 0.165, 110 | child: ListView.builder( 111 | scrollDirection: Axis.horizontal, 112 | itemCount: 4, 113 | itemBuilder: (context, index) { 114 | return Padding( 115 | padding: const EdgeInsets.fromLTRB(15, 15, 10, 30), 116 | child: CardWidget( 117 | gradient: false, 118 | button: true, 119 | duration: 200, 120 | border: tab == index 121 | ? Border( 122 | bottom: BorderSide( 123 | color: tab == 0 124 | ? Color(0xFF2828FF) 125 | : tab == 1 126 | ? Color(0xFFFF2E2E) 127 | : tab == 2 128 | ? Color(0xFFFFD700) 129 | : Color(0xFF33FF33), 130 | width: 5), 131 | ) 132 | : null, 133 | child: Center( 134 | child: Column( 135 | mainAxisAlignment: 136 | material.MainAxisAlignment.spaceEvenly, 137 | children: [ 138 | Icon(index == 0 139 | ? BoxIcons.bx_shape_circle 140 | : index == 1 141 | ? BoxIcons.bx_shape_polygon 142 | : index == 2 143 | ? BoxIcons.bx_shape_square 144 | : BoxIcons.bx_shape_triangle), 145 | Text(index == 0 146 | ? "Maths" 147 | : index == 1 148 | ? "Physics" 149 | : index == 2 ? "Chemistry" : "Biology") 150 | ], 151 | ), 152 | ), 153 | func: () { 154 | setState(() { 155 | tab = index; 156 | }); 157 | }, 158 | ), 159 | ); 160 | }, 161 | ), 162 | ) 163 | : Container(), 164 | ], 165 | ), 166 | ); 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /lib/ui/widgets/videoCard.dart: -------------------------------------------------------------------------------- 1 | import 'package:elearning/theme/box_icons_icons.dart'; 2 | import 'package:elearning/theme/config.dart'; 3 | import 'package:elearning/ui/pages/video.dart'; 4 | import 'package:elearning/ui/widgets/card.dart'; 5 | import 'package:flutter/cupertino.dart'; 6 | import 'package:flutter/material.dart' as material; 7 | 8 | class VideoCard extends material.StatelessWidget { 9 | final bool long; 10 | const VideoCard({ 11 | required this.long, 12 | material.Key? key, 13 | }) : super(key: key); 14 | 15 | @override 16 | material.Widget build(material.BuildContext context) { 17 | return material.Padding( 18 | padding: const material.EdgeInsets.all(10.0), 19 | child: CardWidget( 20 | gradient: false, 21 | button: true, 22 | width: long ? 360 : 180, 23 | child: material.Column( 24 | mainAxisAlignment: material.MainAxisAlignment.start, 25 | children: [ 26 | material.Container( 27 | width: long ? 360 : 180, 28 | height: 87, 29 | decoration: material.BoxDecoration( 30 | image: material.DecorationImage( 31 | image: material.AssetImage('assets/images/video.jpg'), 32 | fit: material.BoxFit.cover), 33 | borderRadius: material.BorderRadius.only( 34 | topLeft: material.Radius.circular(10), 35 | topRight: material.Radius.circular(10), 36 | ), 37 | ), 38 | child: material.Text(""), 39 | ), 40 | material.Padding( 41 | padding: const material.EdgeInsets.all(8.0), 42 | child: material.Text( 43 | "Stars - What are they made up of ?", 44 | overflow: material.TextOverflow.ellipsis, 45 | maxLines: 2, 46 | style: material.TextStyle( 47 | color: material.Color(0xFF535353), 48 | fontFamily: 'Red Hat Display', 49 | fontSize: 16), 50 | ), 51 | ), 52 | material.Padding( 53 | padding: const material.EdgeInsets.symmetric(horizontal: 8.0), 54 | child: material.Row( 55 | children: [ 56 | material.Icon(BoxIcons.bx_bar_chart_alt_2, size: 16), 57 | material.Text( 58 | "Beginner", 59 | style: material.TextStyle( 60 | color: material.Color(0xFFADADAD), 61 | fontFamily: 'Red Hat Display', 62 | fontSize: 10), 63 | ), 64 | material.Spacer(), 65 | material.Text( 66 | "12 mins", 67 | style: material.TextStyle( 68 | color: material.Color(0xFFADADAD), 69 | fontFamily: 'Red Hat Display', 70 | fontSize: 10), 71 | ), 72 | material.Icon(BoxIcons.bx_timer, size: 16), 73 | ], 74 | ), 75 | ), 76 | material.Spacer(), 77 | material.Padding( 78 | padding: const material.EdgeInsets.only(top: 6.0), 79 | child: material.GestureDetector( 80 | child: material.Container( 81 | padding: material.EdgeInsets.fromLTRB(0, 14, 0, 14), 82 | decoration: material.BoxDecoration(gradient: Colors().waves), 83 | child: material.Row( 84 | mainAxisAlignment: material.MainAxisAlignment.spaceEvenly, 85 | children: [ 86 | material.Icon(BoxIcons.bx_play_circle, 87 | color: material.Colors.white), 88 | material.Text( 89 | "Watch Lecture", 90 | style: material.TextStyle( 91 | color: material.Colors.white, 92 | fontFamily: 'Red Hat Display', 93 | fontSize: 18), 94 | ) 95 | ], 96 | ), 97 | ), 98 | onTap: () { 99 | Navigator.push( 100 | context, 101 | CupertinoPageRoute( 102 | builder: (context) => VideoPage(), 103 | ), 104 | ); 105 | }, 106 | ), 107 | ), 108 | ], 109 | ), 110 | ), 111 | ); 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.8.1" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.1.0" 18 | characters: 19 | dependency: transitive 20 | description: 21 | name: characters 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.1.0" 25 | charcode: 26 | dependency: transitive 27 | description: 28 | name: charcode 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.3.1" 32 | clock: 33 | dependency: transitive 34 | description: 35 | name: clock 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.0" 39 | cloud_firestore: 40 | dependency: "direct main" 41 | description: 42 | name: cloud_firestore 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "2.5.4" 46 | cloud_firestore_platform_interface: 47 | dependency: transitive 48 | description: 49 | name: cloud_firestore_platform_interface 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "5.4.3" 53 | cloud_firestore_web: 54 | dependency: transitive 55 | description: 56 | name: cloud_firestore_web 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.4.4" 60 | collection: 61 | dependency: transitive 62 | description: 63 | name: collection 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.15.0" 67 | cupertino_icons: 68 | dependency: "direct main" 69 | description: 70 | name: cupertino_icons 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "1.0.3" 74 | fake_async: 75 | dependency: transitive 76 | description: 77 | name: fake_async 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.2.0" 81 | ffi: 82 | dependency: transitive 83 | description: 84 | name: ffi 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "1.1.2" 88 | file: 89 | dependency: transitive 90 | description: 91 | name: file 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "6.1.2" 95 | firebase: 96 | dependency: transitive 97 | description: 98 | name: firebase 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "9.0.2" 102 | firebase_analytics: 103 | dependency: "direct main" 104 | description: 105 | name: firebase_analytics 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "8.3.4" 109 | firebase_analytics_platform_interface: 110 | dependency: transitive 111 | description: 112 | name: firebase_analytics_platform_interface 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "2.0.1" 116 | firebase_analytics_web: 117 | dependency: transitive 118 | description: 119 | name: firebase_analytics_web 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "0.3.0+1" 123 | firebase_auth: 124 | dependency: "direct main" 125 | description: 126 | name: firebase_auth 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "3.1.4" 130 | firebase_auth_platform_interface: 131 | dependency: transitive 132 | description: 133 | name: firebase_auth_platform_interface 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "6.1.2" 137 | firebase_auth_web: 138 | dependency: transitive 139 | description: 140 | name: firebase_auth_web 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "3.1.3" 144 | firebase_core: 145 | dependency: transitive 146 | description: 147 | name: firebase_core 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "1.8.0" 151 | firebase_core_platform_interface: 152 | dependency: transitive 153 | description: 154 | name: firebase_core_platform_interface 155 | url: "https://pub.dartlang.org" 156 | source: hosted 157 | version: "4.0.1" 158 | firebase_core_web: 159 | dependency: transitive 160 | description: 161 | name: firebase_core_web 162 | url: "https://pub.dartlang.org" 163 | source: hosted 164 | version: "1.1.0" 165 | flutter: 166 | dependency: "direct main" 167 | description: flutter 168 | source: sdk 169 | version: "0.0.0" 170 | flutter_calendar_carousel: 171 | dependency: "direct main" 172 | description: 173 | name: flutter_calendar_carousel 174 | url: "https://pub.dartlang.org" 175 | source: hosted 176 | version: "2.0.3" 177 | flutter_test: 178 | dependency: "direct dev" 179 | description: flutter 180 | source: sdk 181 | version: "0.0.0" 182 | flutter_web_plugins: 183 | dependency: transitive 184 | description: flutter 185 | source: sdk 186 | version: "0.0.0" 187 | google_sign_in: 188 | dependency: "direct main" 189 | description: 190 | name: google_sign_in 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "5.2.0" 194 | google_sign_in_platform_interface: 195 | dependency: transitive 196 | description: 197 | name: google_sign_in_platform_interface 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "2.1.0" 201 | google_sign_in_web: 202 | dependency: transitive 203 | description: 204 | name: google_sign_in_web 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "0.10.0+3" 208 | http: 209 | dependency: transitive 210 | description: 211 | name: http 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "0.13.4" 215 | http_parser: 216 | dependency: transitive 217 | description: 218 | name: http_parser 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "4.0.0" 222 | intl: 223 | dependency: transitive 224 | description: 225 | name: intl 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "0.17.0" 229 | js: 230 | dependency: transitive 231 | description: 232 | name: js 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "0.6.3" 236 | matcher: 237 | dependency: transitive 238 | description: 239 | name: matcher 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "0.12.10" 243 | meta: 244 | dependency: transitive 245 | description: 246 | name: meta 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "1.7.0" 250 | nested: 251 | dependency: transitive 252 | description: 253 | name: nested 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "1.0.0" 257 | path: 258 | dependency: transitive 259 | description: 260 | name: path 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "1.8.0" 264 | path_provider_linux: 265 | dependency: transitive 266 | description: 267 | name: path_provider_linux 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "2.1.0" 271 | path_provider_platform_interface: 272 | dependency: transitive 273 | description: 274 | name: path_provider_platform_interface 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "2.0.1" 278 | path_provider_windows: 279 | dependency: transitive 280 | description: 281 | name: path_provider_windows 282 | url: "https://pub.dartlang.org" 283 | source: hosted 284 | version: "2.0.3" 285 | platform: 286 | dependency: transitive 287 | description: 288 | name: platform 289 | url: "https://pub.dartlang.org" 290 | source: hosted 291 | version: "3.0.2" 292 | plugin_platform_interface: 293 | dependency: transitive 294 | description: 295 | name: plugin_platform_interface 296 | url: "https://pub.dartlang.org" 297 | source: hosted 298 | version: "2.0.2" 299 | process: 300 | dependency: transitive 301 | description: 302 | name: process 303 | url: "https://pub.dartlang.org" 304 | source: hosted 305 | version: "4.2.4" 306 | provider: 307 | dependency: "direct main" 308 | description: 309 | name: provider 310 | url: "https://pub.dartlang.org" 311 | source: hosted 312 | version: "6.0.1" 313 | quiver: 314 | dependency: transitive 315 | description: 316 | name: quiver 317 | url: "https://pub.dartlang.org" 318 | source: hosted 319 | version: "3.0.1+1" 320 | shared_preferences: 321 | dependency: "direct main" 322 | description: 323 | name: shared_preferences 324 | url: "https://pub.dartlang.org" 325 | source: hosted 326 | version: "2.0.8" 327 | shared_preferences_linux: 328 | dependency: transitive 329 | description: 330 | name: shared_preferences_linux 331 | url: "https://pub.dartlang.org" 332 | source: hosted 333 | version: "2.0.2" 334 | shared_preferences_macos: 335 | dependency: transitive 336 | description: 337 | name: shared_preferences_macos 338 | url: "https://pub.dartlang.org" 339 | source: hosted 340 | version: "2.0.2" 341 | shared_preferences_platform_interface: 342 | dependency: transitive 343 | description: 344 | name: shared_preferences_platform_interface 345 | url: "https://pub.dartlang.org" 346 | source: hosted 347 | version: "2.0.0" 348 | shared_preferences_web: 349 | dependency: transitive 350 | description: 351 | name: shared_preferences_web 352 | url: "https://pub.dartlang.org" 353 | source: hosted 354 | version: "2.0.2" 355 | shared_preferences_windows: 356 | dependency: transitive 357 | description: 358 | name: shared_preferences_windows 359 | url: "https://pub.dartlang.org" 360 | source: hosted 361 | version: "2.0.2" 362 | sky_engine: 363 | dependency: transitive 364 | description: flutter 365 | source: sdk 366 | version: "0.0.99" 367 | source_span: 368 | dependency: transitive 369 | description: 370 | name: source_span 371 | url: "https://pub.dartlang.org" 372 | source: hosted 373 | version: "1.8.1" 374 | stack_trace: 375 | dependency: transitive 376 | description: 377 | name: stack_trace 378 | url: "https://pub.dartlang.org" 379 | source: hosted 380 | version: "1.10.0" 381 | stream_channel: 382 | dependency: transitive 383 | description: 384 | name: stream_channel 385 | url: "https://pub.dartlang.org" 386 | source: hosted 387 | version: "2.1.0" 388 | string_scanner: 389 | dependency: transitive 390 | description: 391 | name: string_scanner 392 | url: "https://pub.dartlang.org" 393 | source: hosted 394 | version: "1.1.0" 395 | term_glyph: 396 | dependency: transitive 397 | description: 398 | name: term_glyph 399 | url: "https://pub.dartlang.org" 400 | source: hosted 401 | version: "1.2.0" 402 | test_api: 403 | dependency: transitive 404 | description: 405 | name: test_api 406 | url: "https://pub.dartlang.org" 407 | source: hosted 408 | version: "0.4.2" 409 | typed_data: 410 | dependency: transitive 411 | description: 412 | name: typed_data 413 | url: "https://pub.dartlang.org" 414 | source: hosted 415 | version: "1.3.0" 416 | vector_math: 417 | dependency: transitive 418 | description: 419 | name: vector_math 420 | url: "https://pub.dartlang.org" 421 | source: hosted 422 | version: "2.1.0" 423 | win32: 424 | dependency: transitive 425 | description: 426 | name: win32 427 | url: "https://pub.dartlang.org" 428 | source: hosted 429 | version: "2.2.10" 430 | xdg_directories: 431 | dependency: transitive 432 | description: 433 | name: xdg_directories 434 | url: "https://pub.dartlang.org" 435 | source: hosted 436 | version: "0.2.0" 437 | sdks: 438 | dart: ">=2.14.0 <3.0.0" 439 | flutter: ">=2.5.0" 440 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: elearning 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: "none" # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: '>=2.12.0 <3.0.0' 22 | 23 | dependencies: 24 | cloud_firestore: ^2.5.4 25 | cupertino_icons: ^1.0.3 26 | firebase_analytics: ^8.3.4 27 | firebase_auth: ^3.1.4 28 | flutter: 29 | sdk: flutter 30 | flutter_calendar_carousel: ^2.0.3 31 | google_sign_in: ^5.2.0 32 | provider: ^6.0.1 33 | shared_preferences: ^2.0.8 34 | 35 | dev_dependencies: 36 | flutter_test: 37 | sdk: flutter 38 | 39 | # For information on the generic Dart part of this file, see the 40 | # following page: https://dart.dev/tools/pub/pubspec 41 | # The following section is specific to Flutter. 42 | flutter: 43 | # The following line ensures that the Material Icons font is 44 | # included with your application, so that you can use the icons in 45 | # the material Icons class. 46 | uses-material-design: true 47 | 48 | # To add assets to your application, add an assets section, like this: 49 | assets: 50 | - assets/images/ 51 | # - images/a_dot_ham.jpeg 52 | # An image asset can refer to one or more resolution-specific "variants", see 53 | # https://flutter.dev/assets-and-images/#resolution-aware. 54 | # For details regarding adding assets from package dependencies, see 55 | # https://flutter.dev/assets-and-images/#from-packages 56 | # To add custom fonts to your application, add a fonts section here, 57 | # in this "flutter" section. Each entry in this list should have a 58 | # "family" key with the font family name, and a "fonts" key with a 59 | # list giving the asset and other descriptors for the font. For 60 | # example: 61 | fonts: 62 | - family: Red Hat Display 63 | fonts: 64 | - asset: assets/fonts/RedHatDisplay-Regular.ttf 65 | - asset: assets/fonts/RedHatDisplay-Italic.ttf 66 | style: italic 67 | - asset: assets/fonts/RedHatDisplay-Bold.ttf 68 | weight: 700 69 | - asset: assets/fonts/RedHatDisplay-Black.ttf 70 | weight: 900 71 | - asset: assets/fonts/RedHatDisplay-BlackItalic.ttf 72 | style: italic 73 | weight: 900 74 | - asset: assets/fonts/RedHatDisplay-BoldItalic.ttf 75 | style: italic 76 | weight: 700 77 | - asset: assets/fonts/RedHatDisplay-Medium.ttf 78 | weight: 600 79 | - asset: assets/fonts/RedHatDisplay-MediumItalic.ttf 80 | style: italic 81 | weight: 600 82 | - family: BoxIcons 83 | fonts: 84 | - asset: assets/fonts/BoxIcons.ttf 85 | # For details regarding fonts from package dependencies, 86 | # see https://flutter.dev/custom-fonts/#from-packages 87 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:elearning/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 | --------------------------------------------------------------------------------