├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── flutter_iot_ben │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── fonts │ ├── OFL.txt │ ├── Poppins-Black.ttf │ ├── Poppins-Bold.ttf │ ├── Poppins-ExtraBold.ttf │ ├── Poppins-ExtraLight.ttf │ ├── Poppins-Light.ttf │ ├── Poppins-Medium.ttf │ ├── Poppins-Regular.ttf │ ├── Poppins-SemiBold.ttf │ └── Poppins-Thin.ttf ├── images │ ├── app_icon │ │ └── flutter.png │ └── user.webp ├── screenshots │ ├── home.png │ └── panel.png └── svg │ ├── ac.svg │ ├── bright.svg │ ├── clock.svg │ ├── drop.svg │ ├── light.svg │ ├── snow.svg │ ├── speaker.svg │ └── tv.svg ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── main.dart ├── model │ └── device_model.dart ├── pages │ ├── control_view │ │ ├── control_panel_page.dart │ │ ├── options_enum.dart │ │ └── widgets │ │ │ ├── option_widget.dart │ │ │ ├── power_widget.dart │ │ │ ├── slider │ │ │ ├── custom_arc.dart │ │ │ └── slider_widget.dart │ │ │ ├── speed_widget.dart │ │ │ └── temp_widget.dart │ └── home │ │ ├── home_page.dart │ │ └── widgets │ │ └── devices.dart ├── repository │ └── devices.dart ├── resources │ └── color-manager.dart ├── utils │ ├── slider_utils.dart │ └── string_to_color.dart └── widgets │ ├── custom_appbar.dart │ └── transparent_card.dart ├── pubspec.lock ├── pubspec.yaml └── test └── widget_test.dart /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Web related 36 | lib/generated_plugin_registrant.dart 37 | 38 | # Symbolication related 39 | app.*.symbols 40 | 41 | # Obfuscation related 42 | app.*.map.json 43 | 44 | # Android Studio will place build artifacts here 45 | /android/app/debug 46 | /android/app/profile 47 | /android/app/release 48 | -------------------------------------------------------------------------------- /.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. 5 | 6 | version: 7 | revision: 676cefaaff197f27424942307668886253e1ec35 8 | channel: stable 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: 676cefaaff197f27424942307668886253e1ec35 17 | base_revision: 676cefaaff197f27424942307668886253e1ec35 18 | - platform: android 19 | create_revision: 676cefaaff197f27424942307668886253e1ec35 20 | base_revision: 676cefaaff197f27424942307668886253e1ec35 21 | - platform: ios 22 | create_revision: 676cefaaff197f27424942307668886253e1ec35 23 | base_revision: 676cefaaff197f27424942307668886253e1ec35 24 | 25 | # User provided section 26 | 27 | # List of Local paths (relative to this file) that should be 28 | # ignored by the migrate tool. 29 | # 30 | # Files that are not part of the templates will be ignored by default. 31 | unmanaged_files: 32 | - 'lib/main.dart' 33 | - 'ios/Runner.xcodeproj/project.pbxproj' 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flutter IoT App by Ben 2 | UI Inspired by dribble designs 3 | 4 | ## Features of the app 5 | - Add devices 6 | - Toggle devices on and off 7 | - Set temperature 8 | - Animations 9 | - Toggle on and off 10 | - Pagination 11 | - Widget testing 12 | 13 | ## Screenshots 14 | |Home|Control Page| 15 | |:-:|:-:| 16 | ||| 17 | 18 | ## Steps to build the app 19 | - Clone repo (build files are included) 20 | - Run flutter pub get 21 | - Click on Run 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion flutter.compileSdkVersion 30 | ndkVersion flutter.ndkVersion 31 | 32 | compileOptions { 33 | sourceCompatibility JavaVersion.VERSION_1_8 34 | targetCompatibility JavaVersion.VERSION_1_8 35 | } 36 | 37 | kotlinOptions { 38 | jvmTarget = '1.8' 39 | } 40 | 41 | sourceSets { 42 | main.java.srcDirs += 'src/main/kotlin' 43 | } 44 | 45 | defaultConfig { 46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 47 | applicationId "com.example.flutter_iot_ben" 48 | // You can update the following values to match your application needs. 49 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. 50 | minSdkVersion flutter.minSdkVersion 51 | targetSdkVersion flutter.targetSdkVersion 52 | versionCode flutterVersionCode.toInteger() 53 | versionName flutterVersionName 54 | } 55 | 56 | buildTypes { 57 | release { 58 | // TODO: Add your own signing config for the release build. 59 | // Signing with the debug keys for now, so `flutter run --release` works. 60 | signingConfig signingConfigs.debug 61 | } 62 | } 63 | } 64 | 65 | flutter { 66 | source '../..' 67 | } 68 | 69 | dependencies { 70 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 71 | } 72 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/flutter_iot_ben/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.flutter_iot_ben 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.6.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.1.2' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/fonts/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2020 The Poppins Project Authors (https://github.com/itfoundry/Poppins) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /assets/fonts/Poppins-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-ExtraBold.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-ExtraLight.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-SemiBold.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/fonts/Poppins-Thin.ttf -------------------------------------------------------------------------------- /assets/images/app_icon/flutter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/images/app_icon/flutter.png -------------------------------------------------------------------------------- /assets/images/user.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/images/user.webp -------------------------------------------------------------------------------- /assets/screenshots/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/screenshots/home.png -------------------------------------------------------------------------------- /assets/screenshots/panel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/assets/screenshots/panel.png -------------------------------------------------------------------------------- /assets/svg/ac.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 14 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /assets/svg/bright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 15 | 16 | -------------------------------------------------------------------------------- /assets/svg/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/svg/drop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/svg/light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /assets/svg/snow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /assets/svg/speaker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 13 | 17 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /assets/svg/tv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 9.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'Runner' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for Runner 9 | 10 | end 11 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODFILE CHECKSUM: 145db09314730361a62c5d7f3d6085f6bbd43761 2 | 3 | COCOAPODS: 1.11.3 4 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 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 | BE2A387DF89D88DB05526724 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF3AE510D047749BAD7125B1 /* Pods_Runner.framework */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXCopyFilesBuildPhase section */ 20 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 21 | isa = PBXCopyFilesBuildPhase; 22 | buildActionMask = 2147483647; 23 | dstPath = ""; 24 | dstSubfolderSpec = 10; 25 | files = ( 26 | ); 27 | name = "Embed Frameworks"; 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 34 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 35 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 36 | 4EC747E0262C4CC0D881C73C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 37 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 38 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 39 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 40 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 41 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 42 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 44 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 45 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 46 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | BF3AE510D047749BAD7125B1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | D7996FFC5A2272641E1378DD /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 49 | E23BB24DBE874ECF453FEC94 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | BE2A387DF89D88DB05526724 /* Pods_Runner.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXFrameworksBuildPhase section */ 62 | 63 | /* Begin PBXGroup section */ 64 | 63D186D003A241399EB677E8 /* Pods */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 4EC747E0262C4CC0D881C73C /* Pods-Runner.debug.xcconfig */, 68 | D7996FFC5A2272641E1378DD /* Pods-Runner.release.xcconfig */, 69 | E23BB24DBE874ECF453FEC94 /* Pods-Runner.profile.xcconfig */, 70 | ); 71 | name = Pods; 72 | path = Pods; 73 | sourceTree = ""; 74 | }; 75 | 9740EEB11CF90186004384FC /* Flutter */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 79 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 80 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 81 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 82 | ); 83 | name = Flutter; 84 | sourceTree = ""; 85 | }; 86 | 97C146E51CF9000F007C117D = { 87 | isa = PBXGroup; 88 | children = ( 89 | 9740EEB11CF90186004384FC /* Flutter */, 90 | 97C146F01CF9000F007C117D /* Runner */, 91 | 97C146EF1CF9000F007C117D /* Products */, 92 | 63D186D003A241399EB677E8 /* Pods */, 93 | 9B65E124732E41226C3DE993 /* Frameworks */, 94 | ); 95 | sourceTree = ""; 96 | }; 97 | 97C146EF1CF9000F007C117D /* Products */ = { 98 | isa = PBXGroup; 99 | children = ( 100 | 97C146EE1CF9000F007C117D /* Runner.app */, 101 | ); 102 | name = Products; 103 | sourceTree = ""; 104 | }; 105 | 97C146F01CF9000F007C117D /* Runner */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 109 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 110 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 111 | 97C147021CF9000F007C117D /* Info.plist */, 112 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 113 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 114 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 115 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 116 | ); 117 | path = Runner; 118 | sourceTree = ""; 119 | }; 120 | 9B65E124732E41226C3DE993 /* Frameworks */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | BF3AE510D047749BAD7125B1 /* Pods_Runner.framework */, 124 | ); 125 | name = Frameworks; 126 | sourceTree = ""; 127 | }; 128 | /* End PBXGroup section */ 129 | 130 | /* Begin PBXNativeTarget section */ 131 | 97C146ED1CF9000F007C117D /* Runner */ = { 132 | isa = PBXNativeTarget; 133 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 134 | buildPhases = ( 135 | B6697ACA282648F629BAA3EC /* [CP] Check Pods Manifest.lock */, 136 | 9740EEB61CF901F6004384FC /* Run Script */, 137 | 97C146EA1CF9000F007C117D /* Sources */, 138 | 97C146EB1CF9000F007C117D /* Frameworks */, 139 | 97C146EC1CF9000F007C117D /* Resources */, 140 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 141 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 142 | ); 143 | buildRules = ( 144 | ); 145 | dependencies = ( 146 | ); 147 | name = Runner; 148 | productName = Runner; 149 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 150 | productType = "com.apple.product-type.application"; 151 | }; 152 | /* End PBXNativeTarget section */ 153 | 154 | /* Begin PBXProject section */ 155 | 97C146E61CF9000F007C117D /* Project object */ = { 156 | isa = PBXProject; 157 | attributes = { 158 | LastUpgradeCheck = 1300; 159 | ORGANIZATIONNAME = ""; 160 | TargetAttributes = { 161 | 97C146ED1CF9000F007C117D = { 162 | CreatedOnToolsVersion = 7.3.1; 163 | LastSwiftMigration = 1100; 164 | }; 165 | }; 166 | }; 167 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 168 | compatibilityVersion = "Xcode 9.3"; 169 | developmentRegion = en; 170 | hasScannedForEncodings = 0; 171 | knownRegions = ( 172 | en, 173 | Base, 174 | ); 175 | mainGroup = 97C146E51CF9000F007C117D; 176 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 177 | projectDirPath = ""; 178 | projectRoot = ""; 179 | targets = ( 180 | 97C146ED1CF9000F007C117D /* Runner */, 181 | ); 182 | }; 183 | /* End PBXProject section */ 184 | 185 | /* Begin PBXResourcesBuildPhase section */ 186 | 97C146EC1CF9000F007C117D /* Resources */ = { 187 | isa = PBXResourcesBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 191 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 192 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 193 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | /* End PBXResourcesBuildPhase section */ 198 | 199 | /* Begin PBXShellScriptBuildPhase section */ 200 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 201 | isa = PBXShellScriptBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | ); 205 | inputPaths = ( 206 | ); 207 | name = "Thin Binary"; 208 | outputPaths = ( 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | shellPath = /bin/sh; 212 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 213 | }; 214 | 9740EEB61CF901F6004384FC /* Run Script */ = { 215 | isa = PBXShellScriptBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | ); 219 | inputPaths = ( 220 | ); 221 | name = "Run Script"; 222 | outputPaths = ( 223 | ); 224 | runOnlyForDeploymentPostprocessing = 0; 225 | shellPath = /bin/sh; 226 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 227 | }; 228 | B6697ACA282648F629BAA3EC /* [CP] Check Pods Manifest.lock */ = { 229 | isa = PBXShellScriptBuildPhase; 230 | buildActionMask = 2147483647; 231 | files = ( 232 | ); 233 | inputFileListPaths = ( 234 | ); 235 | inputPaths = ( 236 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 237 | "${PODS_ROOT}/Manifest.lock", 238 | ); 239 | name = "[CP] Check Pods Manifest.lock"; 240 | outputFileListPaths = ( 241 | ); 242 | outputPaths = ( 243 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 244 | ); 245 | runOnlyForDeploymentPostprocessing = 0; 246 | shellPath = /bin/sh; 247 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 248 | showEnvVarsInLog = 0; 249 | }; 250 | /* End PBXShellScriptBuildPhase section */ 251 | 252 | /* Begin PBXSourcesBuildPhase section */ 253 | 97C146EA1CF9000F007C117D /* Sources */ = { 254 | isa = PBXSourcesBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 258 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 259 | ); 260 | runOnlyForDeploymentPostprocessing = 0; 261 | }; 262 | /* End PBXSourcesBuildPhase section */ 263 | 264 | /* Begin PBXVariantGroup section */ 265 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 266 | isa = PBXVariantGroup; 267 | children = ( 268 | 97C146FB1CF9000F007C117D /* Base */, 269 | ); 270 | name = Main.storyboard; 271 | sourceTree = ""; 272 | }; 273 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 274 | isa = PBXVariantGroup; 275 | children = ( 276 | 97C147001CF9000F007C117D /* Base */, 277 | ); 278 | name = LaunchScreen.storyboard; 279 | sourceTree = ""; 280 | }; 281 | /* End PBXVariantGroup section */ 282 | 283 | /* Begin XCBuildConfiguration section */ 284 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | buildSettings = { 287 | ALWAYS_SEARCH_USER_PATHS = NO; 288 | CLANG_ANALYZER_NONNULL = YES; 289 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 290 | CLANG_CXX_LIBRARY = "libc++"; 291 | CLANG_ENABLE_MODULES = YES; 292 | CLANG_ENABLE_OBJC_ARC = YES; 293 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 294 | CLANG_WARN_BOOL_CONVERSION = YES; 295 | CLANG_WARN_COMMA = YES; 296 | CLANG_WARN_CONSTANT_CONVERSION = YES; 297 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 298 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 299 | CLANG_WARN_EMPTY_BODY = YES; 300 | CLANG_WARN_ENUM_CONVERSION = YES; 301 | CLANG_WARN_INFINITE_RECURSION = YES; 302 | CLANG_WARN_INT_CONVERSION = YES; 303 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 304 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 305 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 306 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 307 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 308 | CLANG_WARN_STRICT_PROTOTYPES = YES; 309 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 310 | CLANG_WARN_UNREACHABLE_CODE = YES; 311 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 312 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 313 | COPY_PHASE_STRIP = NO; 314 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 315 | ENABLE_NS_ASSERTIONS = NO; 316 | ENABLE_STRICT_OBJC_MSGSEND = YES; 317 | GCC_C_LANGUAGE_STANDARD = gnu99; 318 | GCC_NO_COMMON_BLOCKS = YES; 319 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 320 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 321 | GCC_WARN_UNDECLARED_SELECTOR = YES; 322 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 323 | GCC_WARN_UNUSED_FUNCTION = YES; 324 | GCC_WARN_UNUSED_VARIABLE = YES; 325 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 326 | MTL_ENABLE_DEBUG_INFO = NO; 327 | SDKROOT = iphoneos; 328 | SUPPORTED_PLATFORMS = iphoneos; 329 | TARGETED_DEVICE_FAMILY = "1,2"; 330 | VALIDATE_PRODUCT = YES; 331 | }; 332 | name = Profile; 333 | }; 334 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 335 | isa = XCBuildConfiguration; 336 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 337 | buildSettings = { 338 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 339 | CLANG_ENABLE_MODULES = YES; 340 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 341 | DEVELOPMENT_TEAM = MAN2RSGAJ5; 342 | ENABLE_BITCODE = NO; 343 | INFOPLIST_FILE = Runner/Info.plist; 344 | LD_RUNPATH_SEARCH_PATHS = ( 345 | "$(inherited)", 346 | "@executable_path/Frameworks", 347 | ); 348 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterIotBen; 349 | PRODUCT_NAME = "$(TARGET_NAME)"; 350 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 351 | SWIFT_VERSION = 5.0; 352 | VERSIONING_SYSTEM = "apple-generic"; 353 | }; 354 | name = Profile; 355 | }; 356 | 97C147031CF9000F007C117D /* Debug */ = { 357 | isa = XCBuildConfiguration; 358 | buildSettings = { 359 | ALWAYS_SEARCH_USER_PATHS = NO; 360 | CLANG_ANALYZER_NONNULL = YES; 361 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 362 | CLANG_CXX_LIBRARY = "libc++"; 363 | CLANG_ENABLE_MODULES = YES; 364 | CLANG_ENABLE_OBJC_ARC = YES; 365 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 366 | CLANG_WARN_BOOL_CONVERSION = YES; 367 | CLANG_WARN_COMMA = YES; 368 | CLANG_WARN_CONSTANT_CONVERSION = YES; 369 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 370 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 371 | CLANG_WARN_EMPTY_BODY = YES; 372 | CLANG_WARN_ENUM_CONVERSION = YES; 373 | CLANG_WARN_INFINITE_RECURSION = YES; 374 | CLANG_WARN_INT_CONVERSION = YES; 375 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 376 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 377 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 378 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 379 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 380 | CLANG_WARN_STRICT_PROTOTYPES = YES; 381 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 382 | CLANG_WARN_UNREACHABLE_CODE = YES; 383 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 384 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 385 | COPY_PHASE_STRIP = NO; 386 | DEBUG_INFORMATION_FORMAT = dwarf; 387 | ENABLE_STRICT_OBJC_MSGSEND = YES; 388 | ENABLE_TESTABILITY = YES; 389 | GCC_C_LANGUAGE_STANDARD = gnu99; 390 | GCC_DYNAMIC_NO_PIC = NO; 391 | GCC_NO_COMMON_BLOCKS = YES; 392 | GCC_OPTIMIZATION_LEVEL = 0; 393 | GCC_PREPROCESSOR_DEFINITIONS = ( 394 | "DEBUG=1", 395 | "$(inherited)", 396 | ); 397 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 398 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 399 | GCC_WARN_UNDECLARED_SELECTOR = YES; 400 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 401 | GCC_WARN_UNUSED_FUNCTION = YES; 402 | GCC_WARN_UNUSED_VARIABLE = YES; 403 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 404 | MTL_ENABLE_DEBUG_INFO = YES; 405 | ONLY_ACTIVE_ARCH = YES; 406 | SDKROOT = iphoneos; 407 | TARGETED_DEVICE_FAMILY = "1,2"; 408 | }; 409 | name = Debug; 410 | }; 411 | 97C147041CF9000F007C117D /* Release */ = { 412 | isa = XCBuildConfiguration; 413 | buildSettings = { 414 | ALWAYS_SEARCH_USER_PATHS = NO; 415 | CLANG_ANALYZER_NONNULL = YES; 416 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 417 | CLANG_CXX_LIBRARY = "libc++"; 418 | CLANG_ENABLE_MODULES = YES; 419 | CLANG_ENABLE_OBJC_ARC = YES; 420 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 421 | CLANG_WARN_BOOL_CONVERSION = YES; 422 | CLANG_WARN_COMMA = YES; 423 | CLANG_WARN_CONSTANT_CONVERSION = YES; 424 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 425 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 426 | CLANG_WARN_EMPTY_BODY = YES; 427 | CLANG_WARN_ENUM_CONVERSION = YES; 428 | CLANG_WARN_INFINITE_RECURSION = YES; 429 | CLANG_WARN_INT_CONVERSION = YES; 430 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 431 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 432 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 433 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 434 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 435 | CLANG_WARN_STRICT_PROTOTYPES = YES; 436 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 437 | CLANG_WARN_UNREACHABLE_CODE = YES; 438 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 439 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 440 | COPY_PHASE_STRIP = NO; 441 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 442 | ENABLE_NS_ASSERTIONS = NO; 443 | ENABLE_STRICT_OBJC_MSGSEND = YES; 444 | GCC_C_LANGUAGE_STANDARD = gnu99; 445 | GCC_NO_COMMON_BLOCKS = YES; 446 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 447 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 448 | GCC_WARN_UNDECLARED_SELECTOR = YES; 449 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 450 | GCC_WARN_UNUSED_FUNCTION = YES; 451 | GCC_WARN_UNUSED_VARIABLE = YES; 452 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 453 | MTL_ENABLE_DEBUG_INFO = NO; 454 | SDKROOT = iphoneos; 455 | SUPPORTED_PLATFORMS = iphoneos; 456 | SWIFT_COMPILATION_MODE = wholemodule; 457 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 458 | TARGETED_DEVICE_FAMILY = "1,2"; 459 | VALIDATE_PRODUCT = YES; 460 | }; 461 | name = Release; 462 | }; 463 | 97C147061CF9000F007C117D /* Debug */ = { 464 | isa = XCBuildConfiguration; 465 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 466 | buildSettings = { 467 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 468 | CLANG_ENABLE_MODULES = YES; 469 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 470 | DEVELOPMENT_TEAM = MAN2RSGAJ5; 471 | ENABLE_BITCODE = NO; 472 | INFOPLIST_FILE = Runner/Info.plist; 473 | LD_RUNPATH_SEARCH_PATHS = ( 474 | "$(inherited)", 475 | "@executable_path/Frameworks", 476 | ); 477 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterIotBen; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 480 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 481 | SWIFT_VERSION = 5.0; 482 | VERSIONING_SYSTEM = "apple-generic"; 483 | }; 484 | name = Debug; 485 | }; 486 | 97C147071CF9000F007C117D /* Release */ = { 487 | isa = XCBuildConfiguration; 488 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 489 | buildSettings = { 490 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 491 | CLANG_ENABLE_MODULES = YES; 492 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 493 | DEVELOPMENT_TEAM = MAN2RSGAJ5; 494 | ENABLE_BITCODE = NO; 495 | INFOPLIST_FILE = Runner/Info.plist; 496 | LD_RUNPATH_SEARCH_PATHS = ( 497 | "$(inherited)", 498 | "@executable_path/Frameworks", 499 | ); 500 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterIotBen; 501 | PRODUCT_NAME = "$(TARGET_NAME)"; 502 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 503 | SWIFT_VERSION = 5.0; 504 | VERSIONING_SYSTEM = "apple-generic"; 505 | }; 506 | name = Release; 507 | }; 508 | /* End XCBuildConfiguration section */ 509 | 510 | /* Begin XCConfigurationList section */ 511 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 512 | isa = XCConfigurationList; 513 | buildConfigurations = ( 514 | 97C147031CF9000F007C117D /* Debug */, 515 | 97C147041CF9000F007C117D /* Release */, 516 | 249021D3217E4FDB00AE95B9 /* Profile */, 517 | ); 518 | defaultConfigurationIsVisible = 0; 519 | defaultConfigurationName = Release; 520 | }; 521 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 522 | isa = XCConfigurationList; 523 | buildConfigurations = ( 524 | 97C147061CF9000F007C117D /* Debug */, 525 | 97C147071CF9000F007C117D /* Release */, 526 | 249021D4217E4FDB00AE95B9 /* Profile */, 527 | ); 528 | defaultConfigurationIsVisible = 0; 529 | defaultConfigurationName = Release; 530 | }; 531 | /* End XCConfigurationList section */ 532 | }; 533 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 534 | } 535 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benthemobileguy/flutter-iot-ben/262e724aaa6809d6ed46a58cdf5978a33df69c3d/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 | CFBundleDisplayName 8 | Flutter Iot Ben 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | flutter_iot_ben 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_iot_ben/pages/home/home_page.dart'; 3 | 4 | void main() { 5 | runApp(const MyApp()); 6 | } 7 | 8 | class MyApp extends StatefulWidget { 9 | const MyApp({Key? key}) : super(key: key); 10 | 11 | @override 12 | State createState() => _MyAppState(); 13 | } 14 | 15 | class _MyAppState extends State { 16 | @override 17 | Widget build(BuildContext context) { 18 | return MaterialApp( 19 | debugShowCheckedModeBanner: false, 20 | title: 'Flutter IOT Ben', 21 | theme: ThemeData( 22 | fontFamily: "Poppins", 23 | sliderTheme: const SliderThemeData( 24 | trackShape: RectangularSliderTrackShape(), 25 | trackHeight: 2.5, 26 | thumbShape: RoundSliderThumbShape(enabledThumbRadius: 8.0), 27 | overlayShape: RoundSliderOverlayShape(overlayRadius: 15.0), 28 | )), 29 | home: const HomePage(), 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/model/device_model.dart: -------------------------------------------------------------------------------- 1 | class DeviceModel { 2 | String name= ""; 3 | String color= ""; 4 | bool isActive = false; 5 | String icon = ""; 6 | 7 | DeviceModel({required this.name,required this.color,required this.isActive,required this.icon}); 8 | 9 | DeviceModel.fromJson(Map json) { 10 | name = json['name']; 11 | color = json['color']; 12 | isActive = json['isActive']; 13 | icon = json['icon']; 14 | } 15 | 16 | Map toJson() { 17 | final Map data = new Map(); 18 | data['name'] = name; 19 | data['color'] = color; 20 | data['isActive'] = isActive; 21 | data['icon'] = icon; 22 | return data; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/pages/control_view/control_panel_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:animated_background/animated_background.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_iot_ben/pages/control_view/widgets/option_widget.dart'; 4 | import 'package:flutter_iot_ben/pages/control_view/options_enum.dart'; 5 | import 'package:flutter_iot_ben/pages/control_view/widgets/power_widget.dart'; 6 | import 'package:flutter_iot_ben/pages/control_view/widgets/slider/slider_widget.dart'; 7 | import 'package:flutter_iot_ben/pages/control_view/widgets/speed_widget.dart'; 8 | import 'package:flutter_iot_ben/pages/control_view/widgets/temp_widget.dart'; 9 | import 'package:flutter_iot_ben/utils/slider_utils.dart'; 10 | import 'package:flutter_iot_ben/widgets/custom_appbar.dart'; 11 | import 'package:rainbow_color/rainbow_color.dart'; 12 | 13 | class ControlPanelPage extends StatefulWidget { 14 | final String tag; 15 | final Color color; 16 | 17 | const ControlPanelPage({ 18 | Key? key, 19 | required this.tag, 20 | required this.color}) : super(key: key); 21 | @override 22 | _ControlPanelPageState createState() => _ControlPanelPageState(); 23 | } 24 | 25 | class _ControlPanelPageState extends State 26 | with TickerProviderStateMixin { 27 | Options option = Options.cooling; 28 | bool isActive = false; 29 | int speed = 1; 30 | double temp = 22.85; 31 | double progressVal = 0.49; 32 | 33 | var activeColor = Rainbow(spectrum: [ 34 | const Color(0xFF33C0BA), 35 | const Color(0xFF1086D4), 36 | const Color(0xFF6D04E2), 37 | const Color(0xFFC421A0), 38 | const Color(0xFFE4262F) 39 | ], rangeStart: 0.0, rangeEnd: 1.0); 40 | 41 | @override 42 | void initState() { 43 | super.initState(); 44 | } 45 | 46 | @override 47 | void dispose() { 48 | super.dispose(); 49 | } 50 | 51 | @override 52 | Widget build(BuildContext context) { 53 | return Scaffold( 54 | body: Container( 55 | width: MediaQuery.of(context).size.width, 56 | height: MediaQuery.of(context).size.height, 57 | decoration: BoxDecoration( 58 | gradient: LinearGradient( 59 | begin: Alignment.topCenter, 60 | end: Alignment.bottomCenter, 61 | colors: [ 62 | Colors.white, 63 | activeColor[progressVal].withOpacity(0.5), 64 | activeColor[progressVal] 65 | ]), 66 | ), 67 | child: AnimatedBackground( 68 | behaviour: RandomParticleBehaviour( 69 | options: ParticleOptions( 70 | baseColor: const Color(0xFFFFFFFF), 71 | opacityChangeRate: 0.25, 72 | minOpacity: 0.1, 73 | maxOpacity: 0.3, 74 | spawnMinSpeed: speed * 60.0, 75 | spawnMaxSpeed: speed * 120, 76 | spawnMinRadius: 2.0, 77 | spawnMaxRadius: 5.0, 78 | particleCount: isActive ? speed * 150 : 0, 79 | )), 80 | vsync: this, 81 | child: SafeArea( 82 | child: Padding( 83 | padding: const EdgeInsets.fromLTRB(15, 15, 15, 0), 84 | child: Column( 85 | children: [ 86 | CustomAppBar(title: widget.tag), 87 | const SizedBox( 88 | height: 20, 89 | ), 90 | Expanded( 91 | child: Column( 92 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 93 | children: [ 94 | options(), 95 | slider(), 96 | controls(), 97 | ], 98 | ), 99 | ) 100 | ], 101 | ), 102 | ), 103 | ), 104 | ), 105 | ), 106 | 107 | ); 108 | } 109 | 110 | Widget options() { 111 | return Row( 112 | mainAxisAlignment: MainAxisAlignment.spaceAround, 113 | children: [ 114 | OptionWidget( 115 | icon: 'assets/svg/clock.svg', 116 | isSelected: option == Options.timer, 117 | onTap: () => setState(() { 118 | option = Options.timer; 119 | }), 120 | size: 32, 121 | ), 122 | OptionWidget( 123 | icon: 'assets/svg/snow.svg', 124 | isSelected: option == Options.cooling, 125 | onTap: () => setState(() { 126 | option = Options.cooling; 127 | }), 128 | size: 25, 129 | ), 130 | OptionWidget( 131 | icon: 'assets/svg/bright.svg', 132 | isSelected: option == Options.heat, 133 | onTap: () => setState(() { 134 | option = Options.heat; 135 | }), 136 | size: 35, 137 | ), 138 | OptionWidget( 139 | icon: 'assets/svg/drop.svg', 140 | isSelected: option == Options.dry, 141 | onTap: () => setState(() { 142 | option = Options.dry; 143 | }), 144 | size: 28, 145 | ), 146 | ], 147 | ); 148 | } 149 | 150 | Widget slider() { 151 | return SliderWidget( 152 | progressVal: progressVal, 153 | color: activeColor[progressVal], 154 | onChange: (value) { 155 | setState(() { 156 | temp = value; 157 | progressVal = normalize(value, kMinDegree, kMaxDegree); 158 | }); 159 | }, 160 | ); 161 | } 162 | 163 | Widget controls() { 164 | return Column( 165 | children: [ 166 | Row( 167 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 168 | children: [ 169 | Expanded( 170 | child: SpeedWidget( 171 | speed: speed, 172 | changeSpeed: (val) => setState(() { 173 | speed = val; 174 | })), 175 | ), 176 | const SizedBox( 177 | width: 15, 178 | ), 179 | Expanded( 180 | child: PowerWidget( 181 | isActive: isActive, 182 | onChanged: (val) => setState(() { 183 | isActive = val; 184 | })), 185 | ), 186 | ], 187 | ), 188 | const SizedBox( 189 | height: 15, 190 | ), 191 | TempWidget( 192 | temp: temp, 193 | changeTemp: (val) => setState(() { 194 | temp = val; 195 | 196 | progressVal = normalize(val, kMinDegree, kMaxDegree); 197 | })), 198 | const SizedBox( 199 | height: 15, 200 | ), 201 | ], 202 | ); 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /lib/pages/control_view/options_enum.dart: -------------------------------------------------------------------------------- 1 | enum Options { timer, cooling, heat, dry } 2 | -------------------------------------------------------------------------------- /lib/pages/control_view/widgets/option_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_svg/svg.dart'; 3 | 4 | class OptionWidget extends StatelessWidget { 5 | final String icon; 6 | final bool isSelected; 7 | final GestureTapCallback onTap; 8 | final double size; 9 | 10 | const OptionWidget({Key? key, required this.icon, required this.isSelected, required this.onTap, required this.size}) : super(key: key); 11 | 12 | 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | return InkWell( 17 | onTap: onTap, 18 | child: Container( 19 | width: 70, 20 | height: 70, 21 | decoration: BoxDecoration( 22 | borderRadius: const BorderRadius.all( 23 | Radius.circular(20.0), 24 | ), 25 | color: isSelected ? Colors.white : Colors.black.withOpacity(0.1), 26 | ), 27 | child: Center( 28 | child: SvgPicture.asset( 29 | icon, 30 | color: isSelected ? Colors.black : Colors.white, 31 | width: size, 32 | height: size, 33 | ), 34 | ), 35 | ), 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/pages/control_view/widgets/power_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_iot_ben/widgets/transparent_card.dart'; 4 | 5 | class PowerWidget extends StatelessWidget { 6 | final bool isActive; 7 | final Function(bool) onChanged; 8 | 9 | const PowerWidget({Key? key, required this.isActive, required this.onChanged}) 10 | : super(key: key); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return TransparentCard( 15 | child: Column( 16 | crossAxisAlignment: CrossAxisAlignment.start, 17 | children: [ 18 | const Text( 19 | "Power", 20 | style: TextStyle( 21 | fontSize: 15, color: Colors.white, fontWeight: FontWeight.w500), 22 | ), 23 | const SizedBox( 24 | height: 5, 25 | ), 26 | Row( 27 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 28 | crossAxisAlignment: CrossAxisAlignment.center, 29 | children: [ 30 | RichText( 31 | text: TextSpan( 32 | text: 'OFF', 33 | style: TextStyle( 34 | fontFamily: "Poppins", 35 | fontSize: 14, 36 | color: !isActive 37 | ? Colors.white 38 | : Colors.black.withOpacity(0.3), 39 | fontWeight: FontWeight.w500), 40 | children: [ 41 | TextSpan( 42 | text: '/', 43 | style: 44 | TextStyle(color: Colors.black.withOpacity(0.3))), 45 | TextSpan( 46 | text: 'ON', 47 | style: TextStyle( 48 | color: isActive 49 | ? Colors.white 50 | : Colors.black.withOpacity(0.3), 51 | ), 52 | ), 53 | ]), 54 | ), 55 | Transform.scale( 56 | alignment: Alignment.center, 57 | scaleY: 0.8, 58 | scaleX: 0.85, 59 | child: CupertinoSwitch( 60 | onChanged: onChanged, 61 | value: isActive, 62 | activeColor: Colors.white.withOpacity(0.5), 63 | trackColor: Colors.black.withOpacity(0.2), 64 | ), 65 | ), 66 | ], 67 | ), 68 | ], 69 | ), 70 | ); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /lib/pages/control_view/widgets/slider/custom_arc.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'dart:math' as math; 3 | 4 | class CustomArc extends StatelessWidget { 5 | final double? diameter; 6 | final double? sweepAngle; 7 | final Color? color; 8 | 9 | const CustomArc({ 10 | Key? key, 11 | this.diameter = 200, 12 | @required this.sweepAngle, 13 | @required this.color, 14 | }) : super(key: key); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return CustomPaint( 19 | painter: MyPainter(sweepAngle, color), 20 | size: Size(diameter!, diameter!), 21 | ); 22 | } 23 | } 24 | 25 | class MyPainter extends CustomPainter { 26 | MyPainter(this.sweepAngle, this.color); 27 | final double? sweepAngle; 28 | final Color? color; 29 | 30 | @override 31 | void paint(Canvas canvas, Size size) { 32 | final Paint paint = Paint() 33 | ..strokeWidth = 35.0 34 | ..style = PaintingStyle.stroke 35 | ..color = color!; 36 | 37 | double degToRad(num deg) => deg * (math.pi); 38 | 39 | final path = Path() 40 | ..arcTo( 41 | Rect.fromCenter( 42 | center: Offset(size.height / 2, size.width / 2), 43 | height: size.height, 44 | width: size.width, 45 | ), 46 | degToRad(1), 47 | degToRad(sweepAngle!), 48 | false); 49 | 50 | canvas.drawPath(path, paint); 51 | } 52 | 53 | @override 54 | bool shouldRepaint(CustomPainter oldDelegate) => false; 55 | } 56 | -------------------------------------------------------------------------------- /lib/pages/control_view/widgets/slider/slider_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_iot_ben/pages/control_view/widgets/slider/custom_arc.dart'; 3 | import 'package:flutter_iot_ben/utils/slider_utils.dart'; 4 | import 'package:sleek_circular_slider/sleek_circular_slider.dart'; 5 | 6 | class SliderWidget extends StatelessWidget { 7 | final double progressVal; 8 | final Color color; 9 | final Function(double) onChange; 10 | 11 | const SliderWidget( 12 | {Key? key, 13 | required this.progressVal, 14 | required this.color, 15 | required this.onChange}) 16 | : super(key: key); 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return SizedBox( 21 | width: kDiameter + 35, 22 | height: kDiameter + 35, 23 | child: Stack( 24 | alignment: Alignment.center, 25 | children: [ 26 | Container( 27 | width: kDiameter + 35, 28 | height: kDiameter + 35, 29 | decoration: BoxDecoration( 30 | color: Colors.white.withOpacity(0.2), 31 | shape: BoxShape.circle, 32 | ), 33 | ), 34 | Center( 35 | child: CustomArc( 36 | color:color, 37 | diameter: kDiameter, 38 | sweepAngle: progressVal), 39 | ), 40 | Center( 41 | child: Container( 42 | width: kDiameter - 20, 43 | height: kDiameter - 20, 44 | decoration: BoxDecoration( 45 | color: Colors.white, 46 | shape: BoxShape.circle, 47 | border: Border.all( 48 | color: Colors.white, 49 | width: 15, 50 | style: BorderStyle.solid, 51 | ), 52 | boxShadow: [ 53 | BoxShadow( 54 | color: Colors.grey.withOpacity(0.3), 55 | spreadRadius: 5, 56 | blurRadius: 7, 57 | offset: const Offset(0, 3), 58 | ), 59 | ]), 60 | child: SleekCircularSlider( 61 | min: kMinDegree, 62 | max: kMaxDegree, 63 | initialValue: angleRange(progressVal, kMinDegree, kMaxDegree), 64 | appearance: CircularSliderAppearance( 65 | spinnerMode: false, 66 | startAngle: 180, 67 | angleRange: 180, 68 | size: kDiameter - 30, 69 | customWidths: CustomSliderWidths( 70 | trackWidth: 20, 71 | shadowWidth: 0, 72 | progressBarWidth: 01, 73 | handlerSize: 5, 74 | ), 75 | customColors: CustomSliderColors( 76 | hideShadow: true, 77 | progressBarColor: Colors.transparent, 78 | trackColor: Colors.transparent, 79 | dotColor: color, 80 | ), 81 | ), 82 | onChange: onChange, 83 | innerWidget: (percentage) { 84 | return Center( 85 | child: Row( 86 | mainAxisAlignment: MainAxisAlignment.center, 87 | crossAxisAlignment: CrossAxisAlignment.start, 88 | children: [ 89 | Text( 90 | percentage.toInt().toString(), 91 | style: const TextStyle( 92 | height: 0, 93 | fontSize: 45, 94 | color: Colors.black, 95 | fontWeight: FontWeight.w500), 96 | ), 97 | Padding( 98 | padding: const EdgeInsets.only(top: 10), 99 | child: Row( 100 | children: const [ 101 | Text( 102 | "o", 103 | style: TextStyle( 104 | height: 0, 105 | letterSpacing: 2, 106 | fontSize: 12, 107 | color: Colors.black, 108 | fontWeight: FontWeight.normal), 109 | ), 110 | Text( 111 | "C", 112 | style: TextStyle( 113 | height: 0, 114 | fontSize: 16, 115 | color: Colors.black, 116 | fontWeight: FontWeight.w500), 117 | ), 118 | ], 119 | ), 120 | ), 121 | ], 122 | ), 123 | ); 124 | }, 125 | ), 126 | ), 127 | ), 128 | ], 129 | ), 130 | ); 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /lib/pages/control_view/widgets/speed_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_iot_ben/widgets/transparent_card.dart'; 3 | 4 | class SpeedWidget extends StatelessWidget { 5 | final int speed; 6 | final Function(int) changeSpeed; 7 | 8 | const SpeedWidget({Key? key, required this.speed, required this.changeSpeed}) 9 | : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return TransparentCard( 14 | child: Column( 15 | crossAxisAlignment: CrossAxisAlignment.start, 16 | children: [ 17 | const Text( 18 | "Speed", 19 | style: TextStyle( 20 | fontSize: 15, color: Colors.white, fontWeight: FontWeight.w500), 21 | ), 22 | const SizedBox( 23 | height: 5, 24 | ), 25 | Row( 26 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 27 | children: [ 28 | _button(1, speed == 1), 29 | _button(2, speed == 2), 30 | _button(3, speed == 3), 31 | ], 32 | ), 33 | ], 34 | ), 35 | ); 36 | } 37 | 38 | ElevatedButton _button(int _speed, bool isActive) { 39 | return ElevatedButton( 40 | style: ElevatedButton.styleFrom( 41 | onPrimary: isActive ? Colors.black : Colors.white, 42 | primary: isActive ? Colors.white : Colors.transparent, 43 | minimumSize: const Size(38, 38), 44 | padding: EdgeInsets.zero, 45 | shape: const CircleBorder(), 46 | side: BorderSide(color: Colors.white.withOpacity(0.4)), 47 | elevation: 0), 48 | onPressed: () => changeSpeed(_speed), 49 | child: Text(_speed.toString()), 50 | ); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /lib/pages/control_view/widgets/temp_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_iot_ben/widgets/transparent_card.dart'; 3 | 4 | class TempWidget extends StatelessWidget { 5 | final double temp; 6 | final Function(double) changeTemp; 7 | 8 | const TempWidget({Key? key, required this.temp, required this.changeTemp}) 9 | : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Center( 14 | child: TransparentCard( 15 | child: Column( 16 | crossAxisAlignment: CrossAxisAlignment.start, 17 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 18 | children: [ 19 | const Text( 20 | "Temp", 21 | style: TextStyle( 22 | fontSize: 15, 23 | color: Colors.white, 24 | fontWeight: FontWeight.w500), 25 | ), 26 | const SizedBox( 27 | height: 5, 28 | ), 29 | Row( 30 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 31 | children: [ 32 | const Text( 33 | '16°C', 34 | style: TextStyle(color: Colors.white), 35 | ), 36 | Expanded( 37 | child: Slider( 38 | min: 16, 39 | max: 30, 40 | value: temp, 41 | activeColor: Colors.white, 42 | inactiveColor: Colors.white30, 43 | onChanged: changeTemp), 44 | ), 45 | const Text( 46 | '30°C', 47 | style: TextStyle(color: Colors.white), 48 | ), 49 | ], 50 | ), 51 | const SizedBox( 52 | height: 12, 53 | ), 54 | ], 55 | ), 56 | ), 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/pages/home/home_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_iot_ben/pages/home/widgets/devices.dart'; 3 | import 'package:flutter_iot_ben/repository/devices.dart'; 4 | import 'package:flutter_iot_ben/utils/string_to_color.dart'; 5 | 6 | class HomePage extends StatefulWidget { 7 | const HomePage({Key? key}) : super(key: key); 8 | 9 | @override 10 | _HomePageState createState() => _HomePageState(); 11 | } 12 | 13 | class _HomePageState extends State { 14 | @override 15 | Widget build(BuildContext context) { 16 | return Scaffold( 17 | body: Container( 18 | width: MediaQuery.of(context).size.width, 19 | height: MediaQuery.of(context).size.height, 20 | decoration: const BoxDecoration( 21 | gradient: LinearGradient( 22 | begin: Alignment.topLeft, 23 | end: Alignment.bottomRight, 24 | colors: [Color(0xFFfce2e1), Colors.white]), 25 | ), 26 | child: Padding( 27 | padding: const EdgeInsets.fromLTRB(20, 15, 20, 0), 28 | child: SafeArea( 29 | child: Column( 30 | children: [ 31 | Row( 32 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 33 | crossAxisAlignment: CrossAxisAlignment.center, 34 | children: const [ 35 | Text( 36 | "Hi,Ben", 37 | style: TextStyle( 38 | fontSize: 28, 39 | color: Colors.black, 40 | fontWeight: FontWeight.bold), 41 | ), 42 | CircleAvatar( 43 | minRadius: 16, 44 | backgroundImage: AssetImage("assets/images/user.webp")) 45 | ], 46 | ), 47 | const SizedBox( 48 | height: 30, 49 | ), 50 | Expanded( 51 | child: Container( 52 | width: MediaQuery.of(context).size.width, 53 | decoration: const BoxDecoration( 54 | borderRadius: BorderRadius.only( 55 | topRight: Radius.circular(30.0), 56 | topLeft: Radius.circular(30.0), 57 | ), 58 | color: Colors.white, 59 | ), 60 | child: Padding( 61 | padding: const EdgeInsets.all(20.0), 62 | child: Column( 63 | crossAxisAlignment: CrossAxisAlignment.start, 64 | children: [ 65 | const SizedBox( 66 | height: 5, 67 | ), 68 | Row( 69 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 70 | crossAxisAlignment: CrossAxisAlignment.start, 71 | children: [ 72 | Column( 73 | crossAxisAlignment: CrossAxisAlignment.start, 74 | children: const [ 75 | Text( 76 | "4 devices added", 77 | style: TextStyle( 78 | fontSize: 15, 79 | color: Colors.grey, 80 | fontWeight: FontWeight.normal), 81 | ), 82 | Text( 83 | "Living Room", 84 | style: TextStyle( 85 | height: 1.1, 86 | fontSize: 17, 87 | color: Colors.black, 88 | fontWeight: FontWeight.w600), 89 | ), 90 | ], 91 | ), 92 | Icon( 93 | Icons.add_circle_outline, 94 | color: Colors.grey[300], 95 | size: 35, 96 | ) 97 | ], 98 | ), 99 | const SizedBox( 100 | height: 10, 101 | ), 102 | Expanded( 103 | child: GridView.builder( 104 | padding: 105 | const EdgeInsets.only(top: 10, bottom: 20), 106 | gridDelegate: 107 | const SliverGridDelegateWithMaxCrossAxisExtent( 108 | maxCrossAxisExtent: 200, 109 | childAspectRatio: 3 / 4, 110 | crossAxisSpacing: 20, 111 | mainAxisSpacing: 20), 112 | itemCount: devices.length, 113 | itemBuilder: (BuildContext ctx, index) { 114 | return Devices( 115 | name: devices[index].name, 116 | svg: devices[index].icon, 117 | color: devices[index].color.toColor(), 118 | isActive: devices[index].isActive, 119 | onChanged: (val) { 120 | setState(() { 121 | devices[index].isActive = 122 | !devices[index].isActive; 123 | }); 124 | }, 125 | ); 126 | }), 127 | ), 128 | ], 129 | ), 130 | ), 131 | ), 132 | ), 133 | ], 134 | ), 135 | ), 136 | ), 137 | ), 138 | ); 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /lib/pages/home/widgets/devices.dart: -------------------------------------------------------------------------------- 1 | import 'package:animations/animations.dart'; 2 | import 'package:flutter/cupertino.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_iot_ben/pages/control_view/control_panel_page.dart'; 5 | import 'package:flutter_svg/svg.dart'; 6 | 7 | class Devices extends StatelessWidget { 8 | final String name; 9 | final String svg; 10 | final Color color; 11 | final bool isActive; 12 | final Function(bool) onChanged; 13 | 14 | const Devices( 15 | {Key? key, 16 | required this.name, 17 | required this.svg, 18 | required this.color, 19 | required this.onChanged, 20 | required this.isActive}) 21 | : super(key: key); 22 | 23 | @override 24 | Widget build(BuildContext context) { 25 | return OpenContainer( 26 | transitionType: ContainerTransitionType.fadeThrough, 27 | transitionDuration: const Duration(milliseconds: 600), 28 | closedElevation: 0, 29 | openElevation: 0, 30 | openShape: const RoundedRectangleBorder( 31 | borderRadius: BorderRadius.all(Radius.circular(20.0))), 32 | closedShape: const RoundedRectangleBorder( 33 | borderRadius: BorderRadius.all(Radius.circular(20.0))), 34 | openBuilder: (BuildContext context, VoidCallback _) { 35 | return ControlPanelPage( 36 | tag: name, color: color); 37 | }, 38 | tappable: true, 39 | closedBuilder: (BuildContext _, VoidCallback openContainer) { 40 | return AnimatedContainer( 41 | duration: const Duration(milliseconds: 300), 42 | decoration: BoxDecoration( 43 | borderRadius: const BorderRadius.all( 44 | Radius.circular(20.0), 45 | ), 46 | border: Border.all( 47 | color: Colors.grey[300]!, 48 | width: 0.6, 49 | ), 50 | color: isActive ? color : Colors.white, 51 | ), 52 | child: Padding( 53 | padding: const EdgeInsets.all(14.0), 54 | child: Column( 55 | crossAxisAlignment: CrossAxisAlignment.start, 56 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 57 | children: [ 58 | Column( 59 | crossAxisAlignment: CrossAxisAlignment.start, 60 | children: [ 61 | SvgPicture.asset( 62 | svg, 63 | color: isActive ? Colors.white : Colors.black, 64 | height: 30, 65 | ), 66 | const SizedBox( 67 | height: 14, 68 | ), 69 | SizedBox( 70 | width: 65, 71 | child: Text( 72 | name, 73 | style: TextStyle( 74 | height: 1.2, 75 | fontSize: 14, 76 | color: isActive ? Colors.white : Colors.black, 77 | fontWeight: FontWeight.w500), 78 | ), 79 | ), 80 | ], 81 | ), 82 | Transform.scale( 83 | alignment: Alignment.center, 84 | scaleY: 0.8, 85 | scaleX: 0.85, 86 | child: CupertinoSwitch( 87 | onChanged: onChanged, 88 | value: isActive, 89 | activeColor: isActive 90 | ? Colors.white.withOpacity(0.4) 91 | : Colors.black, 92 | trackColor: Colors.black, 93 | ), 94 | ), 95 | ], 96 | ), 97 | ), 98 | ); 99 | }); 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /lib/repository/devices.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_iot_ben/model/device_model.dart'; 2 | 3 | List devices = [ 4 | DeviceModel( 5 | name: 'Smart Spotlight', 6 | isActive: true, 7 | color: "#ff5f5f", 8 | icon: 'assets/svg/light.svg'), 9 | DeviceModel( 10 | name: 'Smart AC', 11 | isActive: true, 12 | color: "#7739ff", 13 | icon: 'assets/svg/ac.svg'), 14 | DeviceModel( 15 | name: 'Smart TV', 16 | isActive: false, 17 | color: "#c9c306", 18 | icon: 'assets/svg/tv.svg'), 19 | DeviceModel( 20 | name: 'Smart Sound', 21 | isActive: false, 22 | color: "#c207db", 23 | icon: 'assets/svg/speaker.svg'), 24 | ]; -------------------------------------------------------------------------------- /lib/resources/color-manager.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ColorManager { 4 | static Color primary = HexColor.fromHex("fce2e1"); 5 | static Color darkGrey = HexColor.fromHex("525252"); 6 | static Color grey = HexColor.fromHex("979797"); 7 | static Color lightGrey = HexColor.fromHex("6B6B6B"); 8 | static Color primaryOpacity70 = HexColor.fromHex("B3ED9728"); 9 | static Color orange = HexColor.fromHex("F9923B"); 10 | // new colors 11 | static Color darkPrimary = HexColor.fromHex("d17d11"); 12 | static Color grey1 = HexColor.fromHex("707070"); 13 | static Color backgroundColor = HexColor.fromHex("2B2B2B"); 14 | static Color subtleGrey = HexColor.fromHex("010202"); 15 | static Color lightGreen = HexColor.fromHex("F3F9EF"); 16 | static Color grey2 = HexColor.fromHex("393939"); 17 | static Color white = HexColor.fromHex("FFFFFF"); 18 | static Color error = HexColor.fromHex("e61f34"); 19 | static Color colorShimmer = HexColor.fromHex("e6e6e6"); 20 | static Color black= HexColor.fromHex("000000"); 21 | static Color bgColor = HexColor.fromHex("E8E8E8"); 22 | static Color textColor = HexColor.fromHex("161A33"); 23 | static Color indicatorColor = HexColor.fromHex("3558CD"); 24 | } 25 | 26 | extension HexColor on Color { 27 | static Color fromHex(String hexColorString) { 28 | return Color(int.parse(hexColorString, radix: 16)); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/utils/slider_utils.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | double degToRad(num deg) => deg * (pi / 180.0); 4 | 5 | double normalize(value, min, max) => ((value - min) / (max - min)); 6 | 7 | double angleRange(value, min, max)=>(value * (max-min) +min); 8 | 9 | const double kDiameter = 200; 10 | const double kMinDegree = 16; 11 | const double kMaxDegree = 30; 12 | -------------------------------------------------------------------------------- /lib/utils/string_to_color.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | extension ColorExtension on String { 4 | toColor() { 5 | var hexColor = replaceAll("#", ""); 6 | if (hexColor.length == 6) { 7 | hexColor = "FF$hexColor"; 8 | } 9 | if (hexColor.length == 8) { 10 | return Color(int.parse("0x$hexColor")); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/widgets/custom_appbar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CustomAppBar extends StatelessWidget { 4 | final String title; 5 | 6 | const CustomAppBar({Key? key, required this.title}) : super(key: key); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Row( 11 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 12 | children: [ 13 | InkWell( 14 | onTap: () => Navigator.pop(context), 15 | child: const Icon( 16 | Icons.arrow_back_sharp, 17 | color: Colors.black, 18 | size: 25, 19 | ), 20 | ), 21 | Text( 22 | title, 23 | style: const TextStyle( 24 | fontSize: 18, color: Colors.black, fontWeight: FontWeight.w500), 25 | ), 26 | const SizedBox( 27 | width: 30, 28 | ), 29 | ], 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/widgets/transparent_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TransparentCard extends StatelessWidget { 4 | final Widget child; 5 | 6 | const TransparentCard({Key? key, required this.child}) : super(key: key); 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Container( 11 | height: 100, 12 | decoration: BoxDecoration( 13 | borderRadius: const BorderRadius.all(Radius.circular(20.0)), 14 | color: Colors.black.withOpacity(0.2), 15 | ), 16 | child: Padding(padding: const EdgeInsets.all(10.0), child: child), 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | animated_background: 5 | dependency: "direct main" 6 | description: 7 | name: animated_background 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.0.0" 11 | animations: 12 | dependency: "direct main" 13 | description: 14 | name: animations 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.0.4" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.8.2" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.1.0" 32 | characters: 33 | dependency: transitive 34 | description: 35 | name: characters 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.2.0" 39 | charcode: 40 | dependency: transitive 41 | description: 42 | name: charcode 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.3.1" 46 | clock: 47 | dependency: transitive 48 | description: 49 | name: clock 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.1.0" 53 | collection: 54 | dependency: transitive 55 | description: 56 | name: collection 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.16.0" 60 | fake_async: 61 | dependency: transitive 62 | description: 63 | name: fake_async 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.3.0" 67 | flutter: 68 | dependency: "direct main" 69 | description: flutter 70 | source: sdk 71 | version: "0.0.0" 72 | flutter_lints: 73 | dependency: "direct dev" 74 | description: 75 | name: flutter_lints 76 | url: "https://pub.dartlang.org" 77 | source: hosted 78 | version: "2.0.1" 79 | flutter_svg: 80 | dependency: "direct main" 81 | description: 82 | name: flutter_svg 83 | url: "https://pub.dartlang.org" 84 | source: hosted 85 | version: "1.1.5" 86 | flutter_test: 87 | dependency: "direct dev" 88 | description: flutter 89 | source: sdk 90 | version: "0.0.0" 91 | lints: 92 | dependency: transitive 93 | description: 94 | name: lints 95 | url: "https://pub.dartlang.org" 96 | source: hosted 97 | version: "2.0.0" 98 | matcher: 99 | dependency: transitive 100 | description: 101 | name: matcher 102 | url: "https://pub.dartlang.org" 103 | source: hosted 104 | version: "0.12.11" 105 | material_color_utilities: 106 | dependency: transitive 107 | description: 108 | name: material_color_utilities 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "0.1.4" 112 | meta: 113 | dependency: transitive 114 | description: 115 | name: meta 116 | url: "https://pub.dartlang.org" 117 | source: hosted 118 | version: "1.7.0" 119 | path: 120 | dependency: transitive 121 | description: 122 | name: path 123 | url: "https://pub.dartlang.org" 124 | source: hosted 125 | version: "1.8.1" 126 | path_drawing: 127 | dependency: transitive 128 | description: 129 | name: path_drawing 130 | url: "https://pub.dartlang.org" 131 | source: hosted 132 | version: "1.0.1" 133 | path_parsing: 134 | dependency: transitive 135 | description: 136 | name: path_parsing 137 | url: "https://pub.dartlang.org" 138 | source: hosted 139 | version: "1.0.1" 140 | petitparser: 141 | dependency: transitive 142 | description: 143 | name: petitparser 144 | url: "https://pub.dartlang.org" 145 | source: hosted 146 | version: "5.0.0" 147 | rainbow_color: 148 | dependency: "direct main" 149 | description: 150 | name: rainbow_color 151 | url: "https://pub.dartlang.org" 152 | source: hosted 153 | version: "2.0.1" 154 | rainbow_vis: 155 | dependency: transitive 156 | description: 157 | name: rainbow_vis 158 | url: "https://pub.dartlang.org" 159 | source: hosted 160 | version: "2.0.0" 161 | sky_engine: 162 | dependency: transitive 163 | description: flutter 164 | source: sdk 165 | version: "0.0.99" 166 | sleek_circular_slider: 167 | dependency: "direct main" 168 | description: 169 | name: sleek_circular_slider 170 | url: "https://pub.dartlang.org" 171 | source: hosted 172 | version: "2.0.1" 173 | source_span: 174 | dependency: transitive 175 | description: 176 | name: source_span 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "1.8.2" 180 | stack_trace: 181 | dependency: transitive 182 | description: 183 | name: stack_trace 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "1.10.0" 187 | stream_channel: 188 | dependency: transitive 189 | description: 190 | name: stream_channel 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "2.1.0" 194 | string_scanner: 195 | dependency: transitive 196 | description: 197 | name: string_scanner 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "1.1.0" 201 | term_glyph: 202 | dependency: transitive 203 | description: 204 | name: term_glyph 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "1.2.0" 208 | test_api: 209 | dependency: transitive 210 | description: 211 | name: test_api 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "0.4.9" 215 | vector_math: 216 | dependency: transitive 217 | description: 218 | name: vector_math 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "2.1.2" 222 | xml: 223 | dependency: transitive 224 | description: 225 | name: xml 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "6.1.0" 229 | sdks: 230 | dart: ">=2.17.0 <3.0.0" 231 | flutter: ">=3.0.0" 232 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_iot_ben 2 | description: A new Flutter project. 3 | 4 | publish_to: 'none' 5 | 6 | version: 1.0.0+1 7 | 8 | environment: 9 | sdk: ">=2.15.1 <3.0.0" 10 | 11 | 12 | dependencies: 13 | flutter: 14 | sdk: flutter 15 | 16 | flutter_svg: ^1.1.2 17 | sleek_circular_slider: ^2.0.1 18 | rainbow_color: ^2.0.1 19 | animated_background: ^2.0.0 20 | animations: ^2.0.3 21 | 22 | dev_dependencies: 23 | flutter_lints: ^2.0.1 24 | flutter_test: 25 | sdk: flutter 26 | 27 | 28 | flutter: 29 | 30 | uses-material-design: true 31 | assets: 32 | - assets/images/app_icon/ 33 | - assets/images/ 34 | - assets/svg/ 35 | 36 | fonts: 37 | - family: Poppins 38 | fonts: 39 | - asset: assets/fonts/Poppins-Black.ttf 40 | weight: 900 41 | - asset: assets/fonts/Poppins-ExtraBold.ttf 42 | weight: 800 43 | - asset: assets/fonts/Poppins-Bold.ttf 44 | weight: 700 45 | - asset: assets/fonts/Poppins-SemiBold.ttf 46 | weight: 600 47 | - asset: assets/fonts/Poppins-Medium.ttf 48 | weight: 500 49 | - asset: assets/fonts/Poppins-Regular.ttf 50 | weight: 400 51 | - asset: assets/fonts/Poppins-Light.ttf 52 | weight: 300 53 | - asset: assets/fonts/Poppins-ExtraLight.ttf 54 | weight: 200 55 | - asset: assets/fonts/Poppins-Thin.ttf 56 | weight: 100 57 | -------------------------------------------------------------------------------- /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 in the flutter_test package. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:flutter_iot_ben/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(const 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 | --------------------------------------------------------------------------------