├── ios ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 20.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 50.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 72.png │ │ │ ├── 76.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ ├── 100.png │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 144.png │ │ │ ├── 152.png │ │ │ ├── 167.png │ │ │ ├── 180.png │ │ │ └── Contents.json │ │ └── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── .gitignore ├── Podfile.lock └── Podfile ├── web ├── favicon.png ├── icons │ ├── Icon-192.png │ ├── Icon-512.png │ ├── Icon-maskable-192.png │ └── Icon-maskable-512.png ├── manifest.json └── index.html ├── assets ├── audio │ ├── mute.wav │ ├── owl_dark.wav │ ├── owl_light.wav │ ├── dropdown_open.wav │ ├── reset_sound.wav │ ├── sliding_sound.wav │ ├── dash_idle_sound.wav │ ├── dropdown_close.wav │ ├── dash_dance_sound.wav │ └── fail_sliding_sound.wav ├── animation │ └── dash.riv └── images │ ├── darkSample.png │ ├── lightSample.png │ └── icons │ ├── appstore.png │ └── playstore.png ├── android ├── gradle.properties ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── 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 │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ └── values-night │ │ │ │ │ └── styles.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── flutter_puzzle_hack │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── settings.gradle └── build.gradle ├── screenshots ├── gifs │ ├── darkMode.gif │ ├── lightMode.gif │ └── google_chrome.gif ├── images │ ├── PlayNow.png │ ├── appintro.png │ ├── full_width.png │ └── appintro_half.png └── badges │ ├── license-MIT.svg │ ├── built-with-love.svg │ ├── dart-null_safety-blue.svg │ └── flutter-dart.svg ├── .metadata ├── .vscode └── settings.json ├── lib ├── app │ ├── widget │ │ ├── util │ │ │ ├── design │ │ │ │ ├── arrow_clipper.dart │ │ │ │ └── neumorphic_button.dart │ │ │ ├── move.dart │ │ │ ├── timer.dart │ │ │ ├── reset_button.dart │ │ │ ├── grid_container.dart │ │ │ └── dropdown_menu.dart │ │ ├── menu_items.dart │ │ ├── grid.dart │ │ ├── winning_card.dart │ │ ├── picture_and_animation_row.dart │ │ └── top_appbar.dart │ ├── provider │ │ ├── appinfo_provider.dart │ │ ├── theme_provider.dart │ │ └── sound_provider.dart │ └── view │ │ └── puzzle_game.dart └── main.dart ├── directory.tree ├── .gitignore ├── LICENSE ├── test └── widget_test.dart ├── analysis_options.yaml ├── pubspec.yaml ├── README.md └── pubspec.lock /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/web/favicon.png -------------------------------------------------------------------------------- /assets/audio/mute.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/mute.wav -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/web/icons/Icon-512.png -------------------------------------------------------------------------------- /assets/animation/dash.riv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/animation/dash.riv -------------------------------------------------------------------------------- /assets/audio/owl_dark.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/owl_dark.wav -------------------------------------------------------------------------------- /assets/audio/owl_light.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/owl_light.wav -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /assets/audio/dropdown_open.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/dropdown_open.wav -------------------------------------------------------------------------------- /assets/audio/reset_sound.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/reset_sound.wav -------------------------------------------------------------------------------- /assets/audio/sliding_sound.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/sliding_sound.wav -------------------------------------------------------------------------------- /assets/images/darkSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/images/darkSample.png -------------------------------------------------------------------------------- /assets/images/lightSample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/images/lightSample.png -------------------------------------------------------------------------------- /screenshots/gifs/darkMode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/screenshots/gifs/darkMode.gif -------------------------------------------------------------------------------- /screenshots/gifs/lightMode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/screenshots/gifs/lightMode.gif -------------------------------------------------------------------------------- /screenshots/images/PlayNow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/screenshots/images/PlayNow.png -------------------------------------------------------------------------------- /assets/audio/dash_idle_sound.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/dash_idle_sound.wav -------------------------------------------------------------------------------- /assets/audio/dropdown_close.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/dropdown_close.wav -------------------------------------------------------------------------------- /assets/images/icons/appstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/images/icons/appstore.png -------------------------------------------------------------------------------- /screenshots/images/appintro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/screenshots/images/appintro.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /assets/audio/dash_dance_sound.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/dash_dance_sound.wav -------------------------------------------------------------------------------- /assets/audio/fail_sliding_sound.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/audio/fail_sliding_sound.wav -------------------------------------------------------------------------------- /assets/images/icons/playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/assets/images/icons/playstore.png -------------------------------------------------------------------------------- /screenshots/gifs/google_chrome.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/screenshots/gifs/google_chrome.gif -------------------------------------------------------------------------------- /screenshots/images/full_width.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/screenshots/images/full_width.png -------------------------------------------------------------------------------- /screenshots/images/appintro_half.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/screenshots/images/appintro_half.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/md-siam/flutter_puzzle_hack/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/flutter_puzzle_hack/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.flutter_puzzle_hack 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 7 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.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/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 7e9793dee1b85a243edd0e06cb1658e98b077561 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "alata", 4 | "appbar", 5 | "appinfo", 6 | "ARGB", 7 | "audioplayers", 8 | "autoplay", 9 | "cupertino", 10 | "gamepad", 11 | "hackerrank", 12 | "lerp", 13 | "mdsiam", 14 | "Neumorphic", 15 | "playstore", 16 | "Reclip", 17 | "vsync" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /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/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /screenshots/badges/license-MIT.svg: -------------------------------------------------------------------------------- 1 | LICENSE: MITLICENSEMIT -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/app/widget/util/design/arrow_clipper.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, Md. Siam 2 | // http://mdsiam.xyz/ 3 | // 4 | // Use of this source code is governed by an MIT-style 5 | // license that can be found in the LICENSE file or at 6 | // https://choosealicense.com/licenses/mit/ 7 | import 'package:flutter/material.dart'; 8 | 9 | class ArrowClipper extends CustomClipper { 10 | @override 11 | Path getClip(Size size) { 12 | Path path = Path(); 13 | path.moveTo(0, size.height); 14 | path.lineTo(size.width / 2, size.height / 2); 15 | path.lineTo(size.width, size.height); 16 | return path; 17 | } 18 | 19 | @override 20 | bool shouldReclip(CustomClipper oldClipper) { 21 | return true; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.6.21' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | 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 | -------------------------------------------------------------------------------- /directory.tree: -------------------------------------------------------------------------------- 1 | lib 2 | ├── app 3 | │ ├── provider 4 | │ │ ├── appinfo_provider.dart 5 | │ │ ├── sound_provider.dart 6 | │ │ └── theme_provider.dart 7 | │ ├── view 8 | │ │ └── puzzle_game.dart 9 | │ ├── widget 10 | │ │ ├── util 11 | │ │ │ ├── design 12 | │ │ │ │ ├── arrow_clipper.dart 13 | │ │ │ │ └── neumorphic_button.dart 14 | │ │ │ ├── dropdown_menu.dart 15 | │ │ │ ├── grid_container.dart 16 | │ │ │ ├── move.dart 17 | │ │ │ ├── reset_button.dart 18 | │ │ │ └── timer.dart 19 | │ │ ├── grid.dart 20 | │ │ ├── menu_items.dart 21 | │ │ ├── picture_and_animation_row.dart 22 | │ │ ├── top_appbar.dart 23 | │ │ └── winning_card.dart 24 | │ └── .DS_Store 25 | ├── generated_plugin_registrant.dart 26 | └── main.dart -------------------------------------------------------------------------------- /lib/app/widget/util/move.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, Md. Siam 2 | // http://mdsiam.xyz/ 3 | // 4 | // Use of this source code is governed by an MIT-style 5 | // license that can be found in the LICENSE file or at 6 | // https://choosealicense.com/licenses/mit/ 7 | import 'package:flutter/material.dart'; 8 | 9 | // ignore: must_be_immutable 10 | class Move extends StatelessWidget { 11 | int move; 12 | Move({ 13 | Key? key, 14 | required this.move, 15 | }) : super(key: key); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | return Padding( 20 | padding: const EdgeInsets.only(top: 12.0), 21 | child: Text( 22 | "Move: $move", 23 | style: const TextStyle( 24 | fontSize: 18.0, 25 | fontWeight: FontWeight.bold, 26 | ), 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - audioplayers (0.0.1): 3 | - Flutter 4 | - Flutter (1.0.0) 5 | - path_provider_ios (0.0.1): 6 | - Flutter 7 | 8 | DEPENDENCIES: 9 | - audioplayers (from `.symlinks/plugins/audioplayers/ios`) 10 | - Flutter (from `Flutter`) 11 | - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) 12 | 13 | EXTERNAL SOURCES: 14 | audioplayers: 15 | :path: ".symlinks/plugins/audioplayers/ios" 16 | Flutter: 17 | :path: Flutter 18 | path_provider_ios: 19 | :path: ".symlinks/plugins/path_provider_ios/ios" 20 | 21 | SPEC CHECKSUMS: 22 | audioplayers: 455322b54050b30ea4b1af7cd9e9d105f74efa8c 23 | Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a 24 | path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 25 | 26 | PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c 27 | 28 | COCOAPODS: 1.11.3 29 | -------------------------------------------------------------------------------- /lib/app/widget/util/timer.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, Md. Siam 2 | // http://mdsiam.xyz/ 3 | // 4 | // Use of this source code is governed by an MIT-style 5 | // license that can be found in the LICENSE file or at 6 | // https://choosealicense.com/licenses/mit/ 7 | import 'package:flutter/material.dart'; 8 | 9 | // ignore: must_be_immutable 10 | class Time extends StatelessWidget { 11 | int secondsPassed; 12 | Time({ 13 | Key? key, 14 | required this.secondsPassed, 15 | }) : super(key: key); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | return Padding( 20 | padding: const EdgeInsets.only(top: 12.0), 21 | child: Text( 22 | "Time: $secondsPassed s", 23 | style: const TextStyle( 24 | fontSize: 18.0, 25 | fontWeight: FontWeight.bold, 26 | ), 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flutter_puzzle_hack", 3 | "short_name": "flutter_puzzle_hack", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Md. Siam 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:flutter_puzzle_hack/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 | -------------------------------------------------------------------------------- /lib/app/widget/menu_items.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, Md. Siam 2 | // http://mdsiam.xyz/ 3 | // 4 | // Use of this source code is governed by an MIT-style 5 | // license that can be found in the LICENSE file or at 6 | // https://choosealicense.com/licenses/mit/ 7 | import 'package:flutter/material.dart'; 8 | 9 | import 'util/move.dart'; 10 | import 'util/timer.dart'; 11 | import 'util/reset_button.dart'; 12 | 13 | // ignore: must_be_immutable 14 | class MenuItems extends StatelessWidget { 15 | int move; 16 | Function reset; 17 | int secondsPassed; 18 | 19 | MenuItems({ 20 | Key? key, 21 | required this.reset, 22 | required this.move, 23 | required this.secondsPassed, 24 | }) : super(key: key); 25 | 26 | @override 27 | Widget build(BuildContext context) { 28 | return SizedBox( 29 | width: 600.0, 30 | child: Row( 31 | mainAxisAlignment: MainAxisAlignment.spaceAround, 32 | crossAxisAlignment: CrossAxisAlignment.center, 33 | children: [ 34 | Move(move: move), 35 | ResetButton(reset: reset), 36 | Time(secondsPassed: secondsPassed), 37 | ], 38 | ), 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/app/widget/util/reset_button.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, Md. Siam 2 | // http://mdsiam.xyz/ 3 | // 4 | // Use of this source code is governed by an MIT-style 5 | // license that can be found in the LICENSE file or at 6 | // https://choosealicense.com/licenses/mit/ 7 | import 'package:flutter/material.dart'; 8 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 9 | import 'package:responsive_framework/responsive_framework.dart'; 10 | 11 | import 'design/neumorphic_button.dart'; 12 | 13 | // ignore: must_be_immutable 14 | class ResetButton extends StatelessWidget { 15 | Function reset; 16 | ResetButton({ 17 | Key? key, 18 | required this.reset, 19 | }) : super(key: key); 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return Column( 24 | children: [ 25 | SizedBox( 26 | width: ResponsiveValue( 27 | context, 28 | defaultValue: 180.0, 29 | valueWhen: const [ 30 | Condition.smallerThan(name: MOBILE, value: 120.0), 31 | Condition.largerThan(name: TABLET, value: 180.0) 32 | ], 33 | ).value, 34 | child: NeumorphicButton( 35 | icon: const FaIcon(FontAwesomeIcons.redoAlt, size: 18), 36 | buttonText: 'Reset', 37 | function: reset, 38 | ), 39 | ), 40 | ], 41 | ); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /screenshots/badges/built-with-love.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /screenshots/badges/dart-null_safety-blue.svg: -------------------------------------------------------------------------------- 1 | Dart: Null SafetyDartNull Safety -------------------------------------------------------------------------------- /lib/app/provider/appinfo_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 3 | 4 | /// Provides [AppInfo & LicenseInfo] of the app. 5 | class AppInfoProvider { 6 | //** P R O V I D E S A P P I C O N **// 7 | final Widget _applicationIcon = const FaIcon( 8 | FontAwesomeIcons.gamepad, 9 | size: 40, 10 | ); 11 | Widget get applicationIcon => _applicationIcon; 12 | 13 | //** P R O V I D E S A P P N A M E **// 14 | final String _applicationName = 'Puzzle Hack'; 15 | String get applicationName => _applicationName; 16 | 17 | //** P R O V I D E S A P P V E R S I O N **// 18 | final String _applicationVersion = 'v1.0.0'; 19 | String get applicationVersion => _applicationVersion; 20 | 21 | //** P R O V I D E S A P P L E G A L E S E **// 22 | final String _applicationLegalese = '©2022, http://mdsiam.xyz/'; 23 | String get applicationLegalese => _applicationLegalese; 24 | 25 | //** P R O V I D E S A P P I N T R O **// 26 | final List _children = [ 27 | const Text( 28 | '''\n This game is for the "Flutter Puzzle Hack" contest, 2022. It is a simple slide puzzle game, where the player has to arrange the squares into sorted order.\n For license information, click on the 'VIEW LICENSES' button below.''', 29 | style: TextStyle(fontSize: 16), 30 | textAlign: TextAlign.justify, 31 | ), 32 | ]; 33 | List get children => _children; 34 | } 35 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /lib/app/widget/util/grid_container.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:clay_containers/widgets/clay_container.dart'; 3 | import 'package:responsive_framework/responsive_framework.dart'; 4 | 5 | // ignore: must_be_immutable 6 | class GridContainer extends StatelessWidget { 7 | Function click; 8 | String text; 9 | 10 | GridContainer(this.text, this.click, {Key? key}) : super(key: key); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return GestureDetector( 15 | onTap: () => click(), 16 | child: Card( 17 | shape: RoundedRectangleBorder( 18 | borderRadius: BorderRadius.circular(8.0), 19 | ), 20 | child: ClayContainer( 21 | color: Theme.of(context).primaryColor, 22 | height: 30, 23 | width: 30, 24 | customBorderRadius: BorderRadius.circular(8.0), 25 | child: Center( 26 | child: Text( 27 | text, 28 | style: TextStyle( 29 | fontSize: ResponsiveValue( 30 | context, 31 | defaultValue: 30.0, 32 | valueWhen: const [ 33 | Condition.smallerThan(name: MOBILE, value: 20.0), 34 | Condition.largerThan(name: TABLET, value: 30.0) 35 | ], 36 | ).value, 37 | fontWeight: FontWeight.bold, 38 | ), 39 | ), 40 | ), 41 | ), 42 | ), 43 | ); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022, Md. Siam 2 | # http://mdsiam.xyz/ 3 | # 4 | # Use of this source code is governed by an MIT-style 5 | # license that can be found in the LICENSE file or at 6 | # https://choosealicense.com/licenses/mit/ 7 | name: flutter_puzzle_hack 8 | description: A new Flutter project. 9 | 10 | publish_to: "none" 11 | 12 | version: 1.0.0+1 13 | 14 | environment: 15 | sdk: ">=2.16.1 <3.0.0" 16 | 17 | dependencies: 18 | flutter: 19 | sdk: flutter 20 | 21 | # The following adds the Cupertino Icons font to your application. 22 | # Use with the CupertinoIcons class for iOS style icons. 23 | cupertino_icons: ^1.0.2 24 | # For awesome icons 25 | font_awesome_flutter: ^9.2.0 26 | # For accessing google fonts 27 | google_fonts: ^4.0.4 28 | # For responsive UI 29 | responsive_framework: ^0.1.7 30 | ## For responsive SizedBox 31 | responsive_sizer: ^3.0.5+1 32 | # For state-management 33 | provider: ^6.0.2 34 | # For modern neumorphic containers 35 | clay_containers: ^0.3.2 36 | # For animated switch to activate dark/light mode 37 | day_night_switcher: ^0.2.0+1 38 | # For playing 'button click' sound 39 | audioplayers: ^0.20.1 40 | # For controlling rive animation files 41 | rive: ^0.8.1 42 | 43 | dev_dependencies: 44 | flutter_test: 45 | sdk: flutter 46 | 47 | flutter_lints: ^1.0.0 48 | 49 | flutter: 50 | uses-material-design: true 51 | 52 | # To add assets to your application, add an assets section, like this: 53 | assets: 54 | - assets/audio/ 55 | - assets/images/ 56 | - assets/images/icons/ 57 | - assets/animation/ 58 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Flutter Puzzle Hack 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | flutter_puzzle_hack 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 | -------------------------------------------------------------------------------- /lib/app/widget/grid.dart: -------------------------------------------------------------------------------- 1 | import 'package:clay_containers/widgets/clay_container.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:responsive_sizer/responsive_sizer.dart'; 4 | 5 | import 'util/grid_container.dart'; 6 | 7 | // ignore: must_be_immutable 8 | class Grid extends StatelessWidget { 9 | var numbers = []; 10 | Function clickGrid; 11 | Grid({ 12 | Key? key, 13 | required this.numbers, 14 | required this.clickGrid, 15 | }) : super(key: key); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | var screenWidth = MediaQuery.of(context).size.width; 20 | var boardSize = screenWidth <= 480 ? 100.w : 500.0; 21 | return SizedBox( 22 | width: boardSize, 23 | height: boardSize, 24 | child: Padding( 25 | padding: const EdgeInsets.all(8.0), 26 | child: Padding( 27 | padding: const EdgeInsets.all(8.0), 28 | child: Stack( 29 | children: [ 30 | ClayContainer( 31 | emboss: true, 32 | color: Theme.of(context).primaryColor, 33 | borderRadius: 10, 34 | ), 35 | Padding( 36 | padding: const EdgeInsets.all(8.0), 37 | child: GridView.builder( 38 | gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( 39 | crossAxisCount: 4, 40 | mainAxisSpacing: 5, 41 | crossAxisSpacing: 5, 42 | ), 43 | itemCount: numbers.length, 44 | itemBuilder: (context, index) { 45 | return numbers[index] != 0 46 | ? GridContainer("${numbers[index]}", () { 47 | clickGrid(index); 48 | }) 49 | : const SizedBox.shrink(); 50 | }, 51 | ), 52 | ), 53 | ], 54 | ), 55 | ), 56 | ), 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /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 | 31 | compileOptions { 32 | sourceCompatibility JavaVersion.VERSION_1_8 33 | targetCompatibility JavaVersion.VERSION_1_8 34 | } 35 | 36 | kotlinOptions { 37 | jvmTarget = '1.8' 38 | } 39 | 40 | sourceSets { 41 | main.java.srcDirs += 'src/main/kotlin' 42 | } 43 | 44 | defaultConfig { 45 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 46 | applicationId "com.example.flutter_puzzle_hack" 47 | minSdkVersion flutter.minSdkVersion 48 | targetSdkVersion flutter.targetSdkVersion 49 | versionCode flutterVersionCode.toInteger() 50 | versionName flutterVersionName 51 | } 52 | 53 | buildTypes { 54 | release { 55 | // TODO: Add your own signing config for the release build. 56 | // Signing with the debug keys for now, so `flutter run --release` works. 57 | signingConfig signingConfigs.debug 58 | } 59 | } 60 | } 61 | 62 | flutter { 63 | source '../..' 64 | } 65 | 66 | dependencies { 67 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 68 | } 69 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /screenshots/badges/flutter-dart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022, Md. Siam 2 | // http://mdsiam.xyz/ 3 | // 4 | // Use of this source code is governed by an MIT-style 5 | // license that can be found in the LICENSE file or at 6 | // https://choosealicense.com/licenses/mit/ 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter/services.dart'; 10 | import 'package:provider/provider.dart'; 11 | import 'package:responsive_sizer/responsive_sizer.dart'; 12 | import 'package:responsive_framework/responsive_framework.dart'; 13 | 14 | import 'app/view/puzzle_game.dart'; 15 | import 'app/provider/theme_provider.dart'; 16 | import 'app/provider/sound_provider.dart'; 17 | import 'app/provider/appinfo_provider.dart'; 18 | 19 | void main() { 20 | /// For disabling [landscape] view in mobile & tablet devices 21 | WidgetsFlutterBinding.ensureInitialized(); 22 | SystemChrome.setPreferredOrientations( 23 | [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown], 24 | ); 25 | 26 | runApp( 27 | MultiProvider( 28 | providers: [ 29 | ChangeNotifierProvider(create: (_) => ThemeProvider()), 30 | ChangeNotifierProvider(create: (_) => SoundProvider()), 31 | Provider(create: (_) => AppInfoProvider()), 32 | ], 33 | child: const MyApp(), 34 | ), 35 | ); 36 | } 37 | 38 | class MyApp extends StatelessWidget { 39 | const MyApp({Key? key}) : super(key: key); 40 | 41 | @override 42 | Widget build(BuildContext context) { 43 | return Consumer( 44 | builder: (context, themeProvider, child) { 45 | return MaterialApp( 46 | title: 'Puzzle Hack', 47 | debugShowCheckedModeBanner: false, 48 | theme: 49 | themeProvider.darkTheme ? MyTheme.darkTheme : MyTheme.lightTheme, 50 | builder: (context, widget) => ResponsiveWrapper.builder( 51 | ClampingScrollWrapper.builder(context, widget!), 52 | 53 | /// These [Breakpoints] represents the width of the device, 54 | /// is is using `responsive_framework` package 55 | breakpoints: [ 56 | const ResponsiveBreakpoint.resize(350, name: 'ExSmall'), 57 | const ResponsiveBreakpoint.resize(480, name: MOBILE), 58 | const ResponsiveBreakpoint.autoScale(800, name: TABLET), 59 | const ResponsiveBreakpoint.resize(1000, name: DESKTOP), 60 | const ResponsiveBreakpoint.autoScale(2460, name: '4K'), 61 | ], 62 | ), 63 | 64 | /// This [ResponsiveSizer] is for Making the Puzzle Game 65 | /// board `responsive` 66 | /// 67 | home: ResponsiveSizer( 68 | builder: (context, orientation, screenType) { 69 | return const PuzzleGame(); 70 | }, 71 | ), 72 | ); 73 | }, 74 | ); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /lib/app/widget/util/design/neumorphic_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | import '../../../provider/sound_provider.dart'; 6 | 7 | class NeumorphicButton extends StatefulWidget { 8 | final FaIcon icon; 9 | final String buttonText; 10 | final Function function; 11 | const NeumorphicButton({ 12 | Key? key, 13 | required this.icon, 14 | required this.buttonText, 15 | required this.function, 16 | }) : super(key: key); 17 | 18 | @override 19 | State createState() => _NeumorphicButtonState(); 20 | } 21 | 22 | class _NeumorphicButtonState extends State { 23 | bool _isElevated = true; 24 | 25 | void _pressedDown(PointerEvent details) { 26 | // provides playButtonSound() from SoundProvider 27 | context.read().playResetSound(); 28 | setState(() { 29 | _isElevated = !_isElevated; 30 | }); 31 | } 32 | 33 | void _pressedUp(PointerEvent details) { 34 | setState(() { 35 | _isElevated = !_isElevated; 36 | }); 37 | } 38 | 39 | @override 40 | Widget build(BuildContext context) { 41 | return GestureDetector( 42 | onTap: () { 43 | widget.function(); 44 | }, 45 | child: Padding( 46 | padding: const EdgeInsets.all(10.0), 47 | child: Listener( 48 | onPointerDown: _pressedDown, 49 | onPointerUp: _pressedUp, 50 | child: AnimatedContainer( 51 | duration: const Duration(milliseconds: 100), 52 | decoration: BoxDecoration( 53 | color: Theme.of(context).primaryColor, 54 | borderRadius: BorderRadius.circular(20), 55 | boxShadow: _isElevated 56 | ? [ 57 | BoxShadow( 58 | color: Theme.of(context).shadowColor, 59 | offset: const Offset(4, 4), 60 | blurRadius: 15, 61 | spreadRadius: 1, 62 | ), 63 | BoxShadow( 64 | color: Theme.of(context).splashColor, 65 | offset: const Offset(-4, -4), 66 | blurRadius: 15, 67 | spreadRadius: 1, 68 | ) 69 | ] 70 | : null, 71 | ), 72 | child: Center( 73 | child: Padding( 74 | padding: const EdgeInsets.all(8.0), 75 | child: Row( 76 | mainAxisAlignment: MainAxisAlignment.center, 77 | children: [ 78 | widget.icon, 79 | const SizedBox(width: 10.0), 80 | Text( 81 | widget.buttonText, 82 | style: const TextStyle( 83 | fontSize: 18.0, 84 | fontWeight: FontWeight.bold, 85 | ), 86 | ), 87 | ], 88 | ), 89 | ), 90 | ), 91 | ), 92 | ), 93 | ), 94 | ); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]} -------------------------------------------------------------------------------- /lib/app/provider/theme_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | /// Provides [ThemeData] to the custom AppBar toggle switch 4 | class ThemeProvider extends ChangeNotifier { 5 | bool _darkTheme = false; 6 | bool get darkTheme => _darkTheme; 7 | 8 | toggleTheme() { 9 | _darkTheme = !_darkTheme; 10 | notifyListeners(); 11 | } 12 | } 13 | 14 | class MyTheme { 15 | //************** L I G H T T H E M E **************// 16 | 17 | static final lightTheme = ThemeData.light().copyWith( 18 | appBarTheme: const AppBarTheme( 19 | color: Color(0xFFE6EDF2), 20 | iconTheme: IconThemeData(color: Color(0xFF0C91D6), size: 25), 21 | titleTextStyle: TextStyle( 22 | color: Color(0xFF0C91D6), 23 | fontSize: 23, 24 | fontWeight: FontWeight.bold, 25 | ), 26 | ), 27 | colorScheme: ColorScheme.fromSwatch().copyWith( 28 | secondary: const Color.fromARGB(61, 71, 173, 224), 29 | ), 30 | scaffoldBackgroundColor: const Color(0xFFE6EDF2), 31 | // using this for `Reset` button color 32 | primaryColor: const Color(0xFFE6EDF2), 33 | // using this for `Reset` shadow1 color 34 | shadowColor: const Color.fromARGB(255, 180, 193, 203), 35 | // using this for `Reset` shadow2 color 36 | splashColor: Colors.white, 37 | iconTheme: const IconThemeData(color: Color(0xFF0C91D6)), 38 | textTheme: const TextTheme( 39 | headline5: TextStyle(color: Colors.black87), 40 | caption: TextStyle(color: Colors.blueAccent), 41 | subtitle1: TextStyle(color: Colors.black), 42 | bodyText2: TextStyle(color: Color(0xFF0C91D6)), 43 | ), 44 | // using for popup menu background color 45 | hoverColor: const Color(0xFFE6EDF2), 46 | textButtonTheme: TextButtonThemeData( 47 | style: TextButton.styleFrom(primary: Colors.blueAccent), 48 | ), 49 | ); 50 | 51 | //************* D A R K T H E M E **************// 52 | 53 | static final darkTheme = ThemeData.dark().copyWith( 54 | appBarTheme: const AppBarTheme( 55 | color: Color(0xFF253341), 56 | iconTheme: IconThemeData(color: Color(0xFFFADA74), size: 25), 57 | titleTextStyle: TextStyle( 58 | color: Color(0xFFFADA74), 59 | fontSize: 23, 60 | fontWeight: FontWeight.bold, 61 | ), 62 | ), 63 | colorScheme: ColorScheme.fromSwatch().copyWith( 64 | secondary: const Color.fromARGB(184, 250, 219, 116), 65 | ), 66 | scaffoldBackgroundColor: const Color(0xFF15202B), 67 | // using this for `Reset` button color 68 | primaryColor: const Color(0xFF15202B), 69 | // using this for `Reset` shadow1 color 70 | shadowColor: Colors.black, 71 | // using this for `Reset` shadow2 color 72 | splashColor: Colors.white12, 73 | iconTheme: const IconThemeData(color: Color(0xFFFADA74)), 74 | textTheme: const TextTheme( 75 | headline5: TextStyle(color: Colors.white), 76 | bodyText2: TextStyle(color: Color(0xFFFADA74)), 77 | caption: TextStyle(color: Color(0xFFFADA74)), 78 | subtitle1: TextStyle(color: Colors.white), 79 | ), 80 | dialogBackgroundColor: const Color(0xFF253341), 81 | cardColor: const Color(0xFF15202B), 82 | // using for popup menu background color 83 | hoverColor: const Color.fromARGB(255, 28, 43, 59), 84 | textButtonTheme: TextButtonThemeData( 85 | style: TextButton.styleFrom(primary: const Color(0xFFFADA74)), 86 | ), 87 | ); 88 | } 89 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/app/widget/winning_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | 4 | class WinningCard extends StatelessWidget { 5 | const WinningCard({ 6 | Key? key, 7 | }) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return SizedBox( 12 | width: 500.0, 13 | child: ClipRRect( 14 | borderRadius: BorderRadius.circular(15.0), 15 | child: Container( 16 | height: 300, 17 | color: const Color(0xff15294a), 18 | child: Stack( 19 | fit: StackFit.expand, 20 | children: [ 21 | const Positioned( 22 | left: -170, 23 | top: -170, 24 | child: CircleAvatar( 25 | radius: 130, 26 | backgroundColor: Color(0xff3554d3), 27 | ), 28 | ), 29 | const Positioned( 30 | left: -160, 31 | top: -190, 32 | child: CircleAvatar( 33 | radius: 130, 34 | backgroundColor: Color(0xff375efd), 35 | ), 36 | ), 37 | const Positioned( 38 | right: -170, 39 | bottom: -170, 40 | child: CircleAvatar( 41 | radius: 130, 42 | backgroundColor: Color(0xffe7ad03), 43 | ), 44 | ), 45 | const Positioned( 46 | right: -160, 47 | bottom: -190, 48 | child: CircleAvatar( 49 | radius: 130, 50 | backgroundColor: Color(0xfffbbd5c), 51 | ), 52 | ), 53 | Column( 54 | mainAxisAlignment: MainAxisAlignment.center, 55 | children: [ 56 | Text( 57 | "Congratulations!!\nYou Won!!\n", 58 | style: GoogleFonts.alata( 59 | fontSize: 30, 60 | letterSpacing: 2.0, 61 | fontWeight: FontWeight.w800, 62 | color: const Color(0xffe7ad03), 63 | ), 64 | textAlign: TextAlign.center, 65 | ), 66 | RawMaterialButton( 67 | child: Padding( 68 | padding: const EdgeInsets.symmetric( 69 | vertical: 8.0, 70 | horizontal: 15.0, 71 | ), 72 | child: Row( 73 | mainAxisSize: MainAxisSize.min, 74 | children: const [ 75 | Icon( 76 | Icons.close, 77 | color: Colors.white, 78 | ), 79 | SizedBox(width: 10.0), 80 | Text( 81 | 'Close', 82 | style: TextStyle( 83 | color: Colors.white, 84 | fontSize: 18, 85 | ), 86 | ), 87 | ], 88 | ), 89 | ), 90 | fillColor: const Color(0xff3554d3), 91 | splashColor: const Color(0xffe7ad03), 92 | hoverColor: Colors.transparent, 93 | shape: const StadiumBorder(), 94 | onPressed: () => Navigator.pop(context), 95 | ), 96 | ], 97 | ), 98 | ], 99 | ), 100 | ), 101 | ), 102 | ); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /lib/app/widget/picture_and_animation_row.dart: -------------------------------------------------------------------------------- 1 | import 'package:clay_containers/widgets/clay_container.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:provider/provider.dart'; 4 | import 'package:responsive_framework/responsive_framework.dart'; 5 | import 'package:rive/rive.dart'; 6 | 7 | import '../provider/sound_provider.dart'; 8 | import '../provider/theme_provider.dart'; 9 | 10 | class SamplePictureAndAnimationRow extends StatelessWidget { 11 | final bool _isPlaying; 12 | final RiveAnimationController _controller1; 13 | final RiveAnimationController _controller2; 14 | 15 | const SamplePictureAndAnimationRow({ 16 | Key? key, 17 | required bool isPlaying, 18 | required RiveAnimationController controller1, 19 | required RiveAnimationController controller2, 20 | }) : _isPlaying = isPlaying, 21 | _controller1 = controller1, 22 | _controller2 = controller2, 23 | super(key: key); 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | return Row( 28 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 29 | children: [ 30 | SizedBox( 31 | height: ResponsiveValue( 32 | context, 33 | defaultValue: 200.0, 34 | valueWhen: const [ 35 | Condition.smallerThan(name: MOBILE, value: 160.0), 36 | ], 37 | ).value, 38 | width: ResponsiveValue( 39 | context, 40 | defaultValue: 200.0, 41 | valueWhen: const [ 42 | Condition.smallerThan(name: MOBILE, value: 160.0), 43 | ], 44 | ).value, 45 | child: Padding( 46 | padding: const EdgeInsets.all(20.0), 47 | child: ClayContainer( 48 | color: Theme.of(context).primaryColor, 49 | borderRadius: 10.0, 50 | child: Consumer( 51 | builder: (context, themeProvider, child) { 52 | return ClipRRect( 53 | borderRadius: BorderRadius.circular(10.0), 54 | child: themeProvider.darkTheme 55 | ? Image.asset( 56 | 'assets/images/darkSample.png', 57 | fit: BoxFit.fill, 58 | ) 59 | : Image.asset( 60 | 'assets/images/lightSample.png', 61 | fit: BoxFit.fill, 62 | ), 63 | ); 64 | }, 65 | ), 66 | ), 67 | ), 68 | ), 69 | Consumer( 70 | builder: (context, soundProvider, child) { 71 | return GestureDetector( 72 | onTap: () { 73 | _isPlaying 74 | ? soundProvider.dashIdleSound() 75 | : soundProvider.dashDanceSound(); 76 | _isPlaying 77 | ? _controller2.isActive = false 78 | : _controller2.isActive = true; 79 | }, 80 | child: SizedBox( 81 | height: ResponsiveValue( 82 | context, 83 | defaultValue: 200.0, 84 | valueWhen: const [ 85 | Condition.smallerThan(name: MOBILE, value: 160.0), 86 | ], 87 | ).value, 88 | width: ResponsiveValue( 89 | context, 90 | defaultValue: 200.0, 91 | valueWhen: const [ 92 | Condition.smallerThan(name: MOBILE, value: 160.0), 93 | ], 94 | ).value, 95 | child: RiveAnimation.asset( 96 | 'assets/animation/dash.riv', 97 | animations: const ['idle'], 98 | controllers: [_controller1, _controller2], 99 | ), 100 | ), 101 | ); 102 | }, 103 | ), 104 | ], 105 | ); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Flutter Puzzle Hack 4 | 5 |    6 |    7 |    8 | 9 | 10 | 11 | 12 |

13 | This game is for the "Flutter Puzzle Hack" contest, 2022. It is a simple slide puzzle game, where the player has to arrange the squares into sorted order. This game is built using the Flutter framework, which is a cross-platform framework for developing apps for multiple devices. 14 | Right now, this app has been tested on iOS, Android, and Google Chrome browsers. 15 |

16 |

17 | In addition, it is using some other third-party packages from the open-source community. Thanks to those open-source developers for their amazing packages. Those packages are: 18 |

19 | 20 | ```yaml 21 | audioplayers: ^0.20.1 // for playing sound 22 | clay_containers: ^0.3.2 // for neumorphic design 23 | day_night_switcher: ^0.2.0+1 // for animated switch 24 | font_awesome_flutter: ^9.2.0 // for icons 25 | google_fonts: ^2.3.1 // for fonts 26 | provider: ^6.0.2 // for app state-management 27 | responsive_framework: ^0.1.7 // for responsive UI 28 | responsive_sizer: ^3.0.5+1 // for responsive container 29 | rive: ^0.8.1 // for controlling rive animation file 30 | ``` 31 | 32 | ## Playing Guide 33 | 34 | 35 | 36 | 39 | 40 |
37 | 38 |
41 | 42 |

43 | The above picture is showing the "Puzzle Hack" game running on an android device. It's also presenting all the functionality of the game. Like: 44 |

45 | 46 | 1. Dark/Light mode switch 47 | 2. Sample image of a sorted board 48 | 3. Total number of 'Moves' 49 | 4. 'Reset' button 50 | 5. Dropdown menu for 'Mute' & and 'Info' functionality 51 | 6. Animated 'Dash'. Click it for the magic! 52 | 7. Timer 53 | 54 |

55 | 56 |

57 | ## Puzzle Hack Demo 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 |
Light Mode (iPhone 8 Simulator)Dark Mode (iPhone 8 Simulator)
69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 |
Google Chrome
78 | 79 | ## File Pattern Inside The `'lib'` Folder 80 | 81 | ``` 82 | lib/ 83 | ├── app/ 84 | │ ├── provider/ 85 | │ │ ├── appinfo_provider.dart 86 | │ │ ├── sound_provider.dart 87 | │ │ └── theme_provider.dart 88 | │ ├── view/ 89 | │ │ └── puzzle_game.dart 90 | │ └── widget/ 91 | │ ├── util/ 92 | │ │ ├── design/ 93 | │ │ │ ├── arrow_clipper.dart 94 | │ │ │ └── neumorphic_button.dart 95 | │ │ ├── dropdown_menu.dart 96 | │ │ ├── grid_container.dart 97 | │ │ ├── move.dart 98 | │ │ ├── reset_button.dart 99 | │ │ └── timer.dart 100 | │ ├── grid.dart 101 | │ ├── menu_items.dart 102 | │ ├── picture_and_animation_row.dart 103 | │ ├── top_appbar.dart 104 | │ └── winning_card.dart 105 | ├── generated_plugin_registrant.dart 106 | └── main.dart 107 | ``` 108 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | Puzzle Hack 28 | 29 | 30 | 31 | 34 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /lib/app/provider/sound_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:audioplayers/audioplayers.dart'; 3 | 4 | /// Provides [Sound] to all the custom widgets of the app. 5 | class SoundProvider extends ChangeNotifier { 6 | final AudioCache audioCache = AudioCache(prefix: 'assets/audio/'); 7 | AudioPlayer? player; 8 | bool _isMute = false; 9 | bool get isMute => _isMute; 10 | 11 | //***** S L I D I N G S O U N D ****// 12 | playSlidingSound() async { 13 | player = _isMute 14 | ? await audioCache.play( 15 | 'mute.wav', 16 | mode: PlayerMode.LOW_LATENCY, 17 | ) 18 | : await audioCache.play( 19 | 'sliding_sound.wav', 20 | mode: PlayerMode.LOW_LATENCY, 21 | ); 22 | notifyListeners(); 23 | } 24 | 25 | //***** F A I L S L I D I N G S O U N D ****// 26 | playFailSlidingSound() async { 27 | player = _isMute 28 | ? await audioCache.play( 29 | 'mute.wav', 30 | mode: PlayerMode.LOW_LATENCY, 31 | ) 32 | : await audioCache.play( 33 | 'fail_sliding_sound.wav', 34 | mode: PlayerMode.LOW_LATENCY, 35 | ); 36 | notifyListeners(); 37 | } 38 | 39 | //***** R E S E T B U T T O N S O U N D ****// 40 | playResetSound() async { 41 | player = _isMute 42 | ? await audioCache.play( 43 | 'mute.wav', 44 | mode: PlayerMode.LOW_LATENCY, 45 | ) 46 | : await audioCache.play( 47 | 'reset_sound.wav', 48 | mode: PlayerMode.LOW_LATENCY, 49 | ); 50 | notifyListeners(); 51 | } 52 | 53 | //***** D A S H S O U N D - D A N C I N G ****// 54 | dashDanceSound() async { 55 | player = _isMute 56 | ? await audioCache.play( 57 | 'mute.wav', 58 | mode: PlayerMode.LOW_LATENCY, 59 | ) 60 | : await audioCache.play( 61 | 'dash_dance_sound.wav', 62 | mode: PlayerMode.LOW_LATENCY, 63 | ); 64 | notifyListeners(); 65 | } 66 | 67 | //***** D A S H S O U N D - I D L E ****// 68 | dashIdleSound() async { 69 | player = _isMute 70 | ? await audioCache.play( 71 | 'mute.wav', 72 | mode: PlayerMode.LOW_LATENCY, 73 | ) 74 | : await audioCache.play( 75 | 'dash_idle_sound.wav', 76 | mode: PlayerMode.LOW_LATENCY, 77 | ); 78 | notifyListeners(); 79 | } 80 | 81 | //***** M U T E S O U N D ****// 82 | stopSound() { 83 | _isMute = !_isMute; 84 | notifyListeners(); 85 | } 86 | 87 | //***** D A R K M O D E O N S O U N D ****// 88 | playDarkSound() async { 89 | player = _isMute 90 | ? await audioCache.play( 91 | 'mute.wav', 92 | mode: PlayerMode.LOW_LATENCY, 93 | ) 94 | : await audioCache.play( 95 | 'owl_dark.wav', 96 | mode: PlayerMode.LOW_LATENCY, 97 | ); 98 | notifyListeners(); 99 | } 100 | 101 | //***** L I G H T M O D E O N S O U N D ****// 102 | playLightSound() async { 103 | player = _isMute 104 | ? await audioCache.play( 105 | 'mute.wav', 106 | mode: PlayerMode.LOW_LATENCY, 107 | ) 108 | : await audioCache.play( 109 | 'owl_light.wav', 110 | mode: PlayerMode.LOW_LATENCY, 111 | ); 112 | notifyListeners(); 113 | } 114 | 115 | //***** D R O P D O W N M E N U O P E N ****// 116 | playMenuOpen() async { 117 | player = _isMute 118 | ? await audioCache.play( 119 | 'mute.wav', 120 | mode: PlayerMode.LOW_LATENCY, 121 | ) 122 | : await audioCache.play( 123 | 'dropdown_open.wav', 124 | mode: PlayerMode.LOW_LATENCY, 125 | ); 126 | notifyListeners(); 127 | } 128 | 129 | //***** D R O P D O W N M E N U C L O S E ****// 130 | playMenuClose() async { 131 | player = _isMute 132 | ? await audioCache.play( 133 | 'mute.wav', 134 | mode: PlayerMode.LOW_LATENCY, 135 | ) 136 | : await audioCache.play( 137 | 'dropdown_close.wav', 138 | mode: PlayerMode.LOW_LATENCY, 139 | ); 140 | notifyListeners(); 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /lib/app/widget/util/dropdown_menu.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:provider/provider.dart'; 3 | 4 | import '../../provider/appinfo_provider.dart'; 5 | import '../../provider/sound_provider.dart'; 6 | import 'design/arrow_clipper.dart'; 7 | 8 | class CustomDropdownMenu extends StatefulWidget { 9 | final List icons; 10 | final BorderRadius? borderRadius; 11 | final Color backgroundColor; 12 | final ValueChanged? onChange; 13 | const CustomDropdownMenu({ 14 | Key? key, 15 | required this.icons, 16 | required this.borderRadius, 17 | required this.backgroundColor, 18 | this.onChange, 19 | }) : super(key: key); 20 | 21 | @override 22 | State createState() => _CustomDropdownMenuState(); 23 | } 24 | 25 | class _CustomDropdownMenuState extends State 26 | with SingleTickerProviderStateMixin { 27 | GlobalKey? _key; 28 | bool isMenuOpen = false; 29 | late Offset buttonPosition; 30 | late Size buttonSize; 31 | late OverlayEntry _overlayEntry; 32 | BorderRadius? _borderRadius; 33 | late AnimationController _animationController; 34 | 35 | @override 36 | void initState() { 37 | _animationController = AnimationController( 38 | vsync: this, 39 | duration: const Duration(milliseconds: 600), 40 | ); 41 | _borderRadius = widget.borderRadius ?? BorderRadius.circular(4.0); 42 | _key = LabeledGlobalKey("button_icon"); 43 | 44 | super.initState(); 45 | } 46 | 47 | @override 48 | void dispose() { 49 | _animationController.dispose(); 50 | super.dispose(); 51 | } 52 | 53 | findButton() { 54 | RenderBox renderBox = _key!.currentContext!.findRenderObject() as RenderBox; 55 | buttonSize = renderBox.size; 56 | buttonPosition = renderBox.localToGlobal(Offset.zero); 57 | } 58 | 59 | void closeMenu() { 60 | _overlayEntry.remove(); 61 | _animationController.reverse(); 62 | isMenuOpen = !isMenuOpen; 63 | } 64 | 65 | void openMenu() { 66 | findButton(); 67 | _animationController.forward(); 68 | _overlayEntry = _overlayEntryBuilder(); 69 | Overlay.of(context).insert(_overlayEntry); 70 | isMenuOpen = !isMenuOpen; 71 | } 72 | 73 | @override 74 | Widget build(BuildContext context) { 75 | return Container( 76 | key: _key, 77 | decoration: BoxDecoration(borderRadius: _borderRadius), 78 | // Consumer provides playMenuClose() & playMenuOpen() 79 | // from SoundProvider 80 | child: Consumer( 81 | builder: (context, soundProvider, child) { 82 | return IconButton( 83 | splashRadius: 1, 84 | icon: AnimatedIcon( 85 | icon: AnimatedIcons.menu_close, 86 | progress: _animationController, 87 | ), 88 | iconSize: 35.0, 89 | onPressed: () { 90 | if (isMenuOpen) { 91 | soundProvider.playMenuClose(); 92 | closeMenu(); 93 | } else { 94 | soundProvider.playMenuOpen(); 95 | openMenu(); 96 | } 97 | }, 98 | ); 99 | }, 100 | ), 101 | ); 102 | } 103 | 104 | OverlayEntry _overlayEntryBuilder() { 105 | return OverlayEntry( 106 | builder: (context) { 107 | return Positioned( 108 | top: buttonPosition.dy + buttonSize.height - 13.0, 109 | left: buttonPosition.dx, 110 | width: buttonSize.width, 111 | child: Stack( 112 | children: [ 113 | Align( 114 | alignment: Alignment.topCenter, 115 | child: Material( 116 | elevation: 10.0, 117 | color: Colors.transparent, 118 | shadowColor: Theme.of(context).shadowColor, 119 | shape: ShapeBorder.lerp( 120 | const CircleBorder(), 121 | const CircleBorder(), 122 | 1.0, 123 | ), 124 | child: ClipPath( 125 | clipper: ArrowClipper(), 126 | child: Container( 127 | width: 17.0, 128 | height: 17.0, 129 | color: widget.backgroundColor, 130 | ), 131 | ), 132 | ), 133 | ), 134 | Padding( 135 | padding: const EdgeInsets.only(top: 15.0), 136 | child: Material( 137 | elevation: 10.0, 138 | color: Colors.transparent, 139 | shadowColor: Theme.of(context).shadowColor, 140 | child: Container( 141 | height: widget.icons.length * buttonSize.height, 142 | decoration: BoxDecoration( 143 | color: widget.backgroundColor, 144 | borderRadius: _borderRadius, 145 | ), 146 | child: Column( 147 | mainAxisSize: MainAxisSize.min, 148 | children: List.generate( 149 | widget.icons.length, 150 | (index) { 151 | return onSelected(index); 152 | }, 153 | ), 154 | ), 155 | ), 156 | ), 157 | ), 158 | ], 159 | ), 160 | ); 161 | }, 162 | ); 163 | } 164 | 165 | Consumer onSelected(int index) { 166 | return Consumer( 167 | builder: (context, soundProvider, child) { 168 | return Consumer( 169 | builder: (context, appInfoProvider, child) { 170 | return GestureDetector( 171 | onTap: () { 172 | switch (index) { 173 | case 0: 174 | soundProvider.stopSound(); 175 | break; 176 | 177 | case 1: 178 | showAboutDialog( 179 | context: context, 180 | applicationIcon: appInfoProvider.applicationIcon, 181 | applicationName: appInfoProvider.applicationName, 182 | applicationVersion: appInfoProvider.applicationVersion, 183 | applicationLegalese: appInfoProvider.applicationLegalese, 184 | children: appInfoProvider.children, 185 | ); 186 | break; 187 | } 188 | closeMenu(); 189 | }, 190 | child: SizedBox( 191 | width: buttonSize.width, 192 | height: buttonSize.height, 193 | child: widget.icons[index], 194 | ), 195 | ); 196 | }, 197 | ); 198 | }, 199 | ); 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /lib/app/view/puzzle_game.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:rive/rive.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:provider/provider.dart'; 5 | 6 | import '/app/widget/grid.dart'; 7 | import '../widget/menu_items.dart'; 8 | import '../widget/winning_card.dart'; 9 | import '/app/widget/top_appbar.dart'; 10 | import '/app/provider/sound_provider.dart'; 11 | import '../widget/picture_and_animation_row.dart'; 12 | 13 | /// 14 | /// This is the [primary] dart file of the Puzzle Hack game 15 | /// it's using all the custom widgets like: `TopAppBar`, `WinningCard`, 16 | /// `SamplePictureAndAnimationRow` etc., and also has a `Rive` animation 17 | /// of flutter mascot [Dash]. 18 | /// In addition to that, it is using [SoundProvider] class, which is managed 19 | /// by a third-party package called, `provider` 20 | /// 21 | /// 22 | class PuzzleGame extends StatefulWidget { 23 | const PuzzleGame({Key? key}) : super(key: key); 24 | 25 | @override 26 | State createState() => _PuzzleGameState(); 27 | } 28 | 29 | class _PuzzleGameState extends State { 30 | late RiveAnimationController _controller1; 31 | late RiveAnimationController _controller2; 32 | bool _isPlaying = false; 33 | var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; 34 | int move = 0; 35 | 36 | static const duration = Duration(seconds: 1); 37 | int secondsPassed = 0; 38 | bool isActive = false; 39 | Timer? timer; 40 | 41 | @override 42 | void initState() { 43 | super.initState(); 44 | numbers.shuffle(); 45 | 46 | /// Controller for controlling [dash] eye ball 47 | /// 48 | _controller1 = OneShotAnimation( 49 | 'lookUp', 50 | autoplay: false, 51 | onStop: () => setState(() => _isPlaying = false), 52 | onStart: () => setState(() => _isPlaying = true), 53 | ); 54 | 55 | /// Controller for controlling [dash] dance 56 | /// 57 | _controller2 = OneShotAnimation( 58 | 'slowDance', 59 | autoplay: false, 60 | onStop: () => setState(() => _isPlaying = false), 61 | onStart: () => setState(() => _isPlaying = true), 62 | ); 63 | } 64 | 65 | @override 66 | Widget build(BuildContext context) { 67 | var deviceWidth = MediaQuery.of(context).size.width; 68 | timer ??= Timer.periodic( 69 | duration, 70 | (Timer t) { 71 | startTime(); 72 | }, 73 | ); 74 | return Scaffold( 75 | /// [TopAppBar] is a Custom Widget, which receives a 76 | /// animation controller i.e. `_controller1` 77 | /// for controlling dash [eye] ball. 78 | /// 79 | appBar: TopAppBar(controller: _controller1), 80 | body: SafeArea( 81 | child: SingleChildScrollView( 82 | controller: null, 83 | child: Center( 84 | child: SizedBox( 85 | width: 800.0, 86 | child: Column( 87 | mainAxisAlignment: MainAxisAlignment.end, 88 | children: [ 89 | /// It is a [Custom Widget], which receives a 90 | /// `boolean`value and two animation controllers 91 | /// i e.`_controller1, _controller2`, for controlling 92 | /// dash [eye] and [dance] 93 | /// 94 | SamplePictureAndAnimationRow( 95 | isPlaying: _isPlaying, 96 | controller1: _controller1, 97 | controller2: _controller2, 98 | ), 99 | Center( 100 | child: Column( 101 | children: [ 102 | MenuItems( 103 | reset: reset, 104 | move: move, 105 | secondsPassed: secondsPassed, 106 | ), 107 | SizedBox(height: deviceWidth <= 380 ? 0.0 : 10.0), 108 | 109 | /// Provides sound of [sliding] and if the 110 | /// slide fail, then an [error] sound 111 | /// 112 | Consumer( 113 | builder: (context, soundProvider, child) { 114 | return clickGrid(soundProvider); 115 | }, 116 | ), 117 | ], 118 | ), 119 | ), 120 | ], 121 | ), 122 | ), 123 | ), 124 | ), 125 | ), 126 | ); 127 | } 128 | 129 | /// This method will check the user's [click] on the puzzle grid 130 | /// and change the state accordingly 131 | /// 132 | Grid clickGrid(SoundProvider soundProvider) { 133 | return Grid( 134 | numbers: numbers, 135 | clickGrid: (index) { 136 | if (secondsPassed == 0) { 137 | isActive = true; 138 | } 139 | if (index - 1 >= 0 && numbers[index - 1] == 0 && index % 4 != 0 || 140 | index + 1 < 16 && numbers[index + 1] == 0 && (index + 1) % 4 != 0 || 141 | (index - 4 >= 0 && numbers[index - 4] == 0) || 142 | (index + 4 < 16 && numbers[index + 4] == 0)) { 143 | setState(() { 144 | move++; 145 | soundProvider.playSlidingSound(); 146 | numbers[numbers.indexOf(0)] = numbers[index]; 147 | numbers[index] = 0; 148 | }); 149 | } else { 150 | soundProvider.playFailSlidingSound(); 151 | } 152 | checkWin(); 153 | }, 154 | ); 155 | } 156 | 157 | /// This method will start the [timer] 158 | /// 159 | void startTime() { 160 | if (isActive) { 161 | setState(() { 162 | secondsPassed = secondsPassed + 1; 163 | }); 164 | } 165 | } 166 | 167 | /// This method will reset the [puzzle board] 168 | /// 169 | void reset() { 170 | setState(() { 171 | numbers.shuffle(); 172 | move = 0; 173 | secondsPassed = 0; 174 | isActive = false; 175 | }); 176 | } 177 | 178 | /// This method will run a loop to check whether the 179 | /// number are [sorted] or not, and returns a `boolean` value 180 | /// 181 | bool isSorted(List list) { 182 | int prev = list.first; 183 | for (var i = 1; i < list.length - 1; i++) { 184 | int next = list[i]; 185 | if (prev > next) return false; 186 | prev = next; 187 | } 188 | return true; 189 | } 190 | 191 | /// This method will display a custom dialog [WinningCard] 192 | /// which initiate if the numbers are sorted correctly 193 | /// 194 | void checkWin() { 195 | if (isSorted(numbers)) { 196 | isActive = false; 197 | showDialog( 198 | context: context, 199 | builder: (BuildContext context) { 200 | return Dialog( 201 | shape: RoundedRectangleBorder( 202 | borderRadius: BorderRadius.circular(15.0), 203 | ), 204 | child: const WinningCard(), 205 | ); 206 | }, 207 | ); 208 | } 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /lib/app/widget/top_appbar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:google_fonts/google_fonts.dart'; 4 | import 'package:provider/provider.dart'; 5 | // import 'package:day_night_switcher/day_night_switcher.dart'; 6 | import 'package:responsive_framework/responsive_framework.dart'; 7 | import 'package:rive/rive.dart'; 8 | 9 | import '../provider/appinfo_provider.dart'; 10 | import '../provider/sound_provider.dart'; 11 | import '../provider/theme_provider.dart'; 12 | import 'util/dropdown_menu.dart'; 13 | 14 | // ignore: must_be_immutable 15 | class TopAppBar extends StatefulWidget implements PreferredSizeWidget { 16 | RiveAnimationController controller; 17 | TopAppBar({Key? key, required this.controller}) : super(key: key); 18 | 19 | @override 20 | State createState() => _TopAppBarState(); 21 | 22 | @override 23 | Size get preferredSize => const Size.fromHeight(kToolbarHeight); 24 | } 25 | 26 | class _TopAppBarState extends State { 27 | bool isMute = false; 28 | bool switchValue = false; 29 | @override 30 | Widget build(BuildContext context) { 31 | return AppBar( 32 | leading: Consumer( 33 | builder: (context, themeProvider, child) { 34 | return Consumer( 35 | builder: (context, soundProvider, child) { 36 | return Stack( 37 | children: [ 38 | ResponsiveVisibility( 39 | visible: false, 40 | visibleWhen: const [Condition.smallerThan(name: MOBILE)], 41 | // child: DayNightSwitcherIcon( 42 | // dayBackgroundColor: const Color(0xFF0C91D6), 43 | // isDarkModeEnabled: themeProvider.darkTheme, 44 | // onStateChanged: (value) { 45 | // widget.controller.isActive = true; 46 | // themeProvider.darkTheme 47 | // ? soundProvider.playLightSound() 48 | // : soundProvider.playDarkSound(); 49 | // themeProvider.toggleTheme(); 50 | // }, 51 | // ), 52 | child: Padding( 53 | padding: const EdgeInsets.only(left: 10, top: 10), 54 | child: CupertinoSwitch( 55 | value: switchValue, 56 | onChanged: (newValue) { 57 | widget.controller.isActive = true; 58 | themeProvider.darkTheme 59 | ? soundProvider.playLightSound() 60 | : soundProvider.playDarkSound(); 61 | themeProvider.toggleTheme(); 62 | switchValue = !switchValue; 63 | }, 64 | ), 65 | ), 66 | ), 67 | ResponsiveVisibility( 68 | visible: false, 69 | visibleWhen: const [Condition.largerThan(name: 'ExSmall')], 70 | child: Padding( 71 | padding: const EdgeInsets.only(left: 5.0), 72 | child: Row( 73 | mainAxisAlignment: MainAxisAlignment.start, 74 | children: [ 75 | SizedBox( 76 | width: 50.0, 77 | // child: DayNightSwitcher( 78 | // dayBackgroundColor: const Color(0xFF0C91D6), 79 | // isDarkModeEnabled: themeProvider.darkTheme, 80 | // onStateChanged: (value) { 81 | // widget.controller.isActive = true; 82 | // themeProvider.darkTheme 83 | // ? soundProvider.playLightSound() 84 | // : soundProvider.playDarkSound(); 85 | // themeProvider.toggleTheme(); 86 | // }, 87 | // ), 88 | child: Padding( 89 | padding: const EdgeInsets.only(top: 5.0), 90 | child: Switch.adaptive( 91 | value: switchValue, 92 | onChanged: (newValue) { 93 | widget.controller.isActive = true; 94 | themeProvider.darkTheme 95 | ? soundProvider.playLightSound() 96 | : soundProvider.playDarkSound(); 97 | themeProvider.toggleTheme(); 98 | switchValue = !switchValue; 99 | }, 100 | ), 101 | ), 102 | ), 103 | ], 104 | ), 105 | ), 106 | ), 107 | ], 108 | ); 109 | }, 110 | ); 111 | }, 112 | ), 113 | title: Text( 114 | 'Puzzle Hack', 115 | style: GoogleFonts.alata( 116 | textStyle: const TextStyle(letterSpacing: 2.0), 117 | ), 118 | ), 119 | centerTitle: true, 120 | actions: [ 121 | ResponsiveVisibility( 122 | visible: false, 123 | visibleWhen: const [Condition.smallerThan(name: TABLET)], 124 | child: CustomDropdownMenu( 125 | borderRadius: BorderRadius.circular(10.0), 126 | backgroundColor: Theme.of(context).hoverColor, 127 | icons: [ 128 | isMute 129 | ? const Icon(Icons.volume_off, size: 30.0) 130 | : const Icon(Icons.volume_up, size: 30.0), 131 | const Icon(Icons.info_outline_rounded, size: 30.0), 132 | ], 133 | onChange: (index) {}, 134 | ), 135 | ), 136 | ResponsiveVisibility( 137 | visible: false, 138 | visibleWhen: const [Condition.largerThan(name: MOBILE)], 139 | child: Padding( 140 | padding: const EdgeInsets.only(bottom: 10.0), 141 | child: Row( 142 | children: [ 143 | Consumer( 144 | builder: (context, soundProvider, child) { 145 | return IconButton( 146 | onPressed: () { 147 | soundProvider.playMenuOpen(); 148 | soundProvider.stopSound(); 149 | setState(() { 150 | isMute = soundProvider.isMute; 151 | }); 152 | }, 153 | icon: isMute 154 | ? const Icon(Icons.volume_off, size: 40.0) 155 | : const Icon(Icons.volume_up, size: 40.0), 156 | ); 157 | }, 158 | ), 159 | const SizedBox(width: 10.0), 160 | Consumer( 161 | builder: (context, soundProvider, child) { 162 | return Consumer( 163 | builder: (context, appInfoProvider, child) { 164 | return IconButton( 165 | onPressed: () { 166 | soundProvider.playMenuOpen(); 167 | showAboutDialog( 168 | context: context, 169 | applicationIcon: appInfoProvider.applicationIcon, 170 | applicationName: appInfoProvider.applicationName, 171 | applicationVersion: 172 | appInfoProvider.applicationVersion, 173 | applicationLegalese: 174 | appInfoProvider.applicationLegalese, 175 | children: appInfoProvider.children, 176 | ); 177 | }, 178 | icon: const Icon(Icons.info_outline, size: 40.0), 179 | ); 180 | }, 181 | ); 182 | }, 183 | ), 184 | const SizedBox(width: 15.0), 185 | ], 186 | ), 187 | ), 188 | ), 189 | ], 190 | ); 191 | } 192 | } 193 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | audioplayers: 13 | dependency: "direct main" 14 | description: 15 | name: audioplayers 16 | sha256: a565e7e3e8a21a823b8cd7fed0bde1eb3796a96b373374be557adecfb511fa6b 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "0.20.1" 20 | boolean_selector: 21 | dependency: transitive 22 | description: 23 | name: boolean_selector 24 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.1.1" 28 | characters: 29 | dependency: transitive 30 | description: 31 | name: characters 32 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.3.0" 36 | charcode: 37 | dependency: transitive 38 | description: 39 | name: charcode 40 | sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.3.1" 44 | clay_containers: 45 | dependency: "direct main" 46 | description: 47 | name: clay_containers 48 | sha256: "8e4b2c5b634d433bb81b2ac8b668a1049959c8631bf281ca42eef3f994a8be5e" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "0.3.2" 52 | clock: 53 | dependency: transitive 54 | description: 55 | name: clock 56 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.1.1" 60 | collection: 61 | dependency: transitive 62 | description: 63 | name: collection 64 | sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "1.17.1" 68 | crypto: 69 | dependency: transitive 70 | description: 71 | name: crypto 72 | sha256: cf75650c66c0316274e21d7c43d3dea246273af5955bd94e8184837cd577575c 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "3.0.1" 76 | cupertino_icons: 77 | dependency: "direct main" 78 | description: 79 | name: cupertino_icons 80 | sha256: "1989d917fbe8e6b39806207df5a3fdd3d816cbd090fac2ce26fb45e9a71476e5" 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "1.0.4" 84 | day_night_switcher: 85 | dependency: "direct main" 86 | description: 87 | name: day_night_switcher 88 | sha256: "37354e55fdc0b49d1bea863121cc5a99ab952669f4f349cdd7fe78de2e62a72a" 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "0.2.0+1" 92 | fake_async: 93 | dependency: transitive 94 | description: 95 | name: fake_async 96 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "1.3.1" 100 | ffi: 101 | dependency: transitive 102 | description: 103 | name: ffi 104 | sha256: "35d0f481d939de0d640b3db9a7aa36a52cd22054a798a73b4f50bdad5ce12678" 105 | url: "https://pub.dev" 106 | source: hosted 107 | version: "1.1.2" 108 | file: 109 | dependency: transitive 110 | description: 111 | name: file 112 | sha256: b69516f2c26a5bcac4eee2e32512e1a5205ab312b3536c1c1227b2b942b5f9ad 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "6.1.2" 116 | flutter: 117 | dependency: "direct main" 118 | description: flutter 119 | source: sdk 120 | version: "0.0.0" 121 | flutter_lints: 122 | dependency: "direct dev" 123 | description: 124 | name: flutter_lints 125 | sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 126 | url: "https://pub.dev" 127 | source: hosted 128 | version: "1.0.4" 129 | flutter_test: 130 | dependency: "direct dev" 131 | description: flutter 132 | source: sdk 133 | version: "0.0.0" 134 | flutter_web_plugins: 135 | dependency: transitive 136 | description: flutter 137 | source: sdk 138 | version: "0.0.0" 139 | font_awesome_flutter: 140 | dependency: "direct main" 141 | description: 142 | name: font_awesome_flutter 143 | sha256: "1f93e5799f0e6c882819e8393a05c6ca5226010f289190f2242ec19f3f0fdba5" 144 | url: "https://pub.dev" 145 | source: hosted 146 | version: "9.2.0" 147 | google_fonts: 148 | dependency: "direct main" 149 | description: 150 | name: google_fonts 151 | sha256: "6b6f10f0ce3c42f6552d1c70d2c28d764cf22bb487f50f66cca31dcd5194f4d6" 152 | url: "https://pub.dev" 153 | source: hosted 154 | version: "4.0.4" 155 | graphs: 156 | dependency: transitive 157 | description: 158 | name: graphs 159 | sha256: ae0b3d956ff324c6f8671f08dcb2dbd71c99cdbf2aa3ca63a14190c47aa6679c 160 | url: "https://pub.dev" 161 | source: hosted 162 | version: "2.1.0" 163 | http: 164 | dependency: transitive 165 | description: 166 | name: http 167 | sha256: "2ed163531e071c2c6b7c659635112f24cb64ecbebf6af46b550d536c0b1aa112" 168 | url: "https://pub.dev" 169 | source: hosted 170 | version: "0.13.4" 171 | http_parser: 172 | dependency: transitive 173 | description: 174 | name: http_parser 175 | sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185 176 | url: "https://pub.dev" 177 | source: hosted 178 | version: "4.0.0" 179 | js: 180 | dependency: transitive 181 | description: 182 | name: js 183 | sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 184 | url: "https://pub.dev" 185 | source: hosted 186 | version: "0.6.7" 187 | lints: 188 | dependency: transitive 189 | description: 190 | name: lints 191 | sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c 192 | url: "https://pub.dev" 193 | source: hosted 194 | version: "1.0.1" 195 | matcher: 196 | dependency: transitive 197 | description: 198 | name: matcher 199 | sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" 200 | url: "https://pub.dev" 201 | source: hosted 202 | version: "0.12.15" 203 | material_color_utilities: 204 | dependency: transitive 205 | description: 206 | name: material_color_utilities 207 | sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 208 | url: "https://pub.dev" 209 | source: hosted 210 | version: "0.2.0" 211 | meta: 212 | dependency: transitive 213 | description: 214 | name: meta 215 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" 216 | url: "https://pub.dev" 217 | source: hosted 218 | version: "1.9.1" 219 | nested: 220 | dependency: transitive 221 | description: 222 | name: nested 223 | sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" 224 | url: "https://pub.dev" 225 | source: hosted 226 | version: "1.0.0" 227 | path: 228 | dependency: transitive 229 | description: 230 | name: path 231 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 232 | url: "https://pub.dev" 233 | source: hosted 234 | version: "1.8.3" 235 | path_provider: 236 | dependency: transitive 237 | description: 238 | name: path_provider 239 | sha256: e92dee4d38a9044605cb3fb253e9b46eb9375dfcad4515d0379b44ac90797568 240 | url: "https://pub.dev" 241 | source: hosted 242 | version: "2.0.9" 243 | path_provider_android: 244 | dependency: transitive 245 | description: 246 | name: path_provider_android 247 | sha256: "8b759fb6c74955931e87f550cc9e890b0cccb7ef8e710943973efeaa9695c54d" 248 | url: "https://pub.dev" 249 | source: hosted 250 | version: "2.0.12" 251 | path_provider_ios: 252 | dependency: transitive 253 | description: 254 | name: path_provider_ios 255 | sha256: "943b76e54056386432cdc2731cb303e2f580346b61a1fc73819721767be72309" 256 | url: "https://pub.dev" 257 | source: hosted 258 | version: "2.0.8" 259 | path_provider_linux: 260 | dependency: transitive 261 | description: 262 | name: path_provider_linux 263 | sha256: "1e109f4df28bd95eab71e323008b53d19c4d633bc1ab05b577518773474e9621" 264 | url: "https://pub.dev" 265 | source: hosted 266 | version: "2.1.5" 267 | path_provider_macos: 268 | dependency: transitive 269 | description: 270 | name: path_provider_macos 271 | sha256: "0adeb313e1f2c3fc52baeeee59b0fe9c2d1f7da56fd96a9234e1702ec653a453" 272 | url: "https://pub.dev" 273 | source: hosted 274 | version: "2.0.5" 275 | path_provider_platform_interface: 276 | dependency: transitive 277 | description: 278 | name: path_provider_platform_interface 279 | sha256: "3dc0d51b07f85fec3746d9f4e8d31c73bb173cafa2e763f03f8df2e8d1878882" 280 | url: "https://pub.dev" 281 | source: hosted 282 | version: "2.0.3" 283 | path_provider_windows: 284 | dependency: transitive 285 | description: 286 | name: path_provider_windows 287 | sha256: "366ad4e3541ea707f859e7148d4d5aba67d589d7936cee04a05c464a277eeb27" 288 | url: "https://pub.dev" 289 | source: hosted 290 | version: "2.0.5" 291 | platform: 292 | dependency: transitive 293 | description: 294 | name: platform 295 | sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" 296 | url: "https://pub.dev" 297 | source: hosted 298 | version: "3.1.0" 299 | plugin_platform_interface: 300 | dependency: transitive 301 | description: 302 | name: plugin_platform_interface 303 | sha256: "075f927ebbab4262ace8d0b283929ac5410c0ac4e7fc123c76429564facfb757" 304 | url: "https://pub.dev" 305 | source: hosted 306 | version: "2.1.2" 307 | process: 308 | dependency: transitive 309 | description: 310 | name: process 311 | sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" 312 | url: "https://pub.dev" 313 | source: hosted 314 | version: "4.2.4" 315 | provider: 316 | dependency: "direct main" 317 | description: 318 | name: provider 319 | sha256: "7896193cf752c40ba7f7732a95264319a787871e5d628225357f5c909182bc06" 320 | url: "https://pub.dev" 321 | source: hosted 322 | version: "6.0.2" 323 | responsive_framework: 324 | dependency: "direct main" 325 | description: 326 | name: responsive_framework 327 | sha256: "8817e519620fb32d4fa1e4a900a58c5555f35eb01e23bf47e61896b963995f53" 328 | url: "https://pub.dev" 329 | source: hosted 330 | version: "0.1.8" 331 | responsive_sizer: 332 | dependency: "direct main" 333 | description: 334 | name: responsive_sizer 335 | sha256: f809953211ba1533242c2e096e5f1ed94bba48c3868fe32f46490ead42a92854 336 | url: "https://pub.dev" 337 | source: hosted 338 | version: "3.0.8" 339 | rive: 340 | dependency: "direct main" 341 | description: 342 | name: rive 343 | sha256: f76eaf823d7b0c7d6640dbb10f499f387fa66d01aa711ce7a4533a4e90b48c4a 344 | url: "https://pub.dev" 345 | source: hosted 346 | version: "0.8.4" 347 | sky_engine: 348 | dependency: transitive 349 | description: flutter 350 | source: sdk 351 | version: "0.0.99" 352 | source_span: 353 | dependency: transitive 354 | description: 355 | name: source_span 356 | sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 357 | url: "https://pub.dev" 358 | source: hosted 359 | version: "1.9.1" 360 | stack_trace: 361 | dependency: transitive 362 | description: 363 | name: stack_trace 364 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 365 | url: "https://pub.dev" 366 | source: hosted 367 | version: "1.11.0" 368 | stream_channel: 369 | dependency: transitive 370 | description: 371 | name: stream_channel 372 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 373 | url: "https://pub.dev" 374 | source: hosted 375 | version: "2.1.1" 376 | string_scanner: 377 | dependency: transitive 378 | description: 379 | name: string_scanner 380 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 381 | url: "https://pub.dev" 382 | source: hosted 383 | version: "1.2.0" 384 | term_glyph: 385 | dependency: transitive 386 | description: 387 | name: term_glyph 388 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 389 | url: "https://pub.dev" 390 | source: hosted 391 | version: "1.2.1" 392 | test_api: 393 | dependency: transitive 394 | description: 395 | name: test_api 396 | sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb 397 | url: "https://pub.dev" 398 | source: hosted 399 | version: "0.5.1" 400 | typed_data: 401 | dependency: transitive 402 | description: 403 | name: typed_data 404 | sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee" 405 | url: "https://pub.dev" 406 | source: hosted 407 | version: "1.3.0" 408 | uuid: 409 | dependency: transitive 410 | description: 411 | name: uuid 412 | sha256: "2469694ad079893e3b434a627970c33f2fa5adc46dfe03c9617546969a9a8afc" 413 | url: "https://pub.dev" 414 | source: hosted 415 | version: "3.0.6" 416 | vector_math: 417 | dependency: transitive 418 | description: 419 | name: vector_math 420 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 421 | url: "https://pub.dev" 422 | source: hosted 423 | version: "2.1.4" 424 | win32: 425 | dependency: transitive 426 | description: 427 | name: win32 428 | sha256: cde1e6d546d8cfd0b3c72bc6f29d980fa629d1cb107f38e2a039ca5d10d79e41 429 | url: "https://pub.dev" 430 | source: hosted 431 | version: "2.4.1" 432 | xdg_directories: 433 | dependency: transitive 434 | description: 435 | name: xdg_directories 436 | sha256: "060b6e1c891d956f72b5ac9463466c37cce3fa962a921532fc001e86fe93438e" 437 | url: "https://pub.dev" 438 | source: hosted 439 | version: "0.2.0+1" 440 | sdks: 441 | dart: ">=3.0.0-0 <4.0.0" 442 | flutter: ">=2.10.0-0" 443 | -------------------------------------------------------------------------------- /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 | 32E8E3E6524FBACCF772017F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 385092219F62DAD1DF32AE38 /* Pods_Runner.framework */; }; 12 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 13 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 14 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 15 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 16 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 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 | 385092219F62DAD1DF32AE38 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; 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 | 93271461AC5C2E02ED748A2A /* 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 = ""; }; 41 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 42 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 43 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 45 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 46 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 47 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | BA8D9A952295DB6D138968B2 /* 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 | FBEF46AC673F2AE8B3EA9A51 /* 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 = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | 32E8E3E6524FBACCF772017F /* Pods_Runner.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXFrameworksBuildPhase section */ 62 | 63 | /* Begin PBXGroup section */ 64 | 28A8670ABECC9DA46128859A /* Frameworks */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 385092219F62DAD1DF32AE38 /* Pods_Runner.framework */, 68 | ); 69 | name = Frameworks; 70 | sourceTree = ""; 71 | }; 72 | 88D526C00B2CDFC82BF43CE9 /* Pods */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | FBEF46AC673F2AE8B3EA9A51 /* Pods-Runner.debug.xcconfig */, 76 | BA8D9A952295DB6D138968B2 /* Pods-Runner.release.xcconfig */, 77 | 93271461AC5C2E02ED748A2A /* Pods-Runner.profile.xcconfig */, 78 | ); 79 | name = Pods; 80 | path = Pods; 81 | sourceTree = ""; 82 | }; 83 | 9740EEB11CF90186004384FC /* Flutter */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 87 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 88 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 89 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 90 | ); 91 | name = Flutter; 92 | sourceTree = ""; 93 | }; 94 | 97C146E51CF9000F007C117D = { 95 | isa = PBXGroup; 96 | children = ( 97 | 9740EEB11CF90186004384FC /* Flutter */, 98 | 97C146F01CF9000F007C117D /* Runner */, 99 | 97C146EF1CF9000F007C117D /* Products */, 100 | 88D526C00B2CDFC82BF43CE9 /* Pods */, 101 | 28A8670ABECC9DA46128859A /* Frameworks */, 102 | ); 103 | sourceTree = ""; 104 | }; 105 | 97C146EF1CF9000F007C117D /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 97C146EE1CF9000F007C117D /* Runner.app */, 109 | ); 110 | name = Products; 111 | sourceTree = ""; 112 | }; 113 | 97C146F01CF9000F007C117D /* Runner */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 117 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 118 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 119 | 97C147021CF9000F007C117D /* Info.plist */, 120 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 121 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 122 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 123 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 124 | ); 125 | path = Runner; 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 | 64D07BF313DCA0F7676741BC /* [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 | A51514C2139A03FB66E32089 /* [CP] Embed Pods Frameworks */, 143 | ); 144 | buildRules = ( 145 | ); 146 | dependencies = ( 147 | ); 148 | name = Runner; 149 | productName = Runner; 150 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 151 | productType = "com.apple.product-type.application"; 152 | }; 153 | /* End PBXNativeTarget section */ 154 | 155 | /* Begin PBXProject section */ 156 | 97C146E61CF9000F007C117D /* Project object */ = { 157 | isa = PBXProject; 158 | attributes = { 159 | LastUpgradeCheck = 1300; 160 | ORGANIZATIONNAME = ""; 161 | TargetAttributes = { 162 | 97C146ED1CF9000F007C117D = { 163 | CreatedOnToolsVersion = 7.3.1; 164 | LastSwiftMigration = 1100; 165 | }; 166 | }; 167 | }; 168 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 169 | compatibilityVersion = "Xcode 9.3"; 170 | developmentRegion = en; 171 | hasScannedForEncodings = 0; 172 | knownRegions = ( 173 | en, 174 | Base, 175 | ); 176 | mainGroup = 97C146E51CF9000F007C117D; 177 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 178 | projectDirPath = ""; 179 | projectRoot = ""; 180 | targets = ( 181 | 97C146ED1CF9000F007C117D /* Runner */, 182 | ); 183 | }; 184 | /* End PBXProject section */ 185 | 186 | /* Begin PBXResourcesBuildPhase section */ 187 | 97C146EC1CF9000F007C117D /* Resources */ = { 188 | isa = PBXResourcesBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 192 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 193 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 194 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | /* End PBXResourcesBuildPhase section */ 199 | 200 | /* Begin PBXShellScriptBuildPhase section */ 201 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 202 | isa = PBXShellScriptBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | ); 206 | inputPaths = ( 207 | ); 208 | name = "Thin Binary"; 209 | outputPaths = ( 210 | ); 211 | runOnlyForDeploymentPostprocessing = 0; 212 | shellPath = /bin/sh; 213 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 214 | }; 215 | 64D07BF313DCA0F7676741BC /* [CP] Check Pods Manifest.lock */ = { 216 | isa = PBXShellScriptBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | ); 220 | inputFileListPaths = ( 221 | ); 222 | inputPaths = ( 223 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 224 | "${PODS_ROOT}/Manifest.lock", 225 | ); 226 | name = "[CP] Check Pods Manifest.lock"; 227 | outputFileListPaths = ( 228 | ); 229 | outputPaths = ( 230 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | shellPath = /bin/sh; 234 | 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"; 235 | showEnvVarsInLog = 0; 236 | }; 237 | 9740EEB61CF901F6004384FC /* Run Script */ = { 238 | isa = PBXShellScriptBuildPhase; 239 | buildActionMask = 2147483647; 240 | files = ( 241 | ); 242 | inputPaths = ( 243 | ); 244 | name = "Run Script"; 245 | outputPaths = ( 246 | ); 247 | runOnlyForDeploymentPostprocessing = 0; 248 | shellPath = /bin/sh; 249 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 250 | }; 251 | A51514C2139A03FB66E32089 /* [CP] Embed Pods Frameworks */ = { 252 | isa = PBXShellScriptBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | ); 256 | inputFileListPaths = ( 257 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 258 | ); 259 | name = "[CP] Embed Pods Frameworks"; 260 | outputFileListPaths = ( 261 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | shellPath = /bin/sh; 265 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 266 | showEnvVarsInLog = 0; 267 | }; 268 | /* End PBXShellScriptBuildPhase section */ 269 | 270 | /* Begin PBXSourcesBuildPhase section */ 271 | 97C146EA1CF9000F007C117D /* Sources */ = { 272 | isa = PBXSourcesBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 276 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | /* End PBXSourcesBuildPhase section */ 281 | 282 | /* Begin PBXVariantGroup section */ 283 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 284 | isa = PBXVariantGroup; 285 | children = ( 286 | 97C146FB1CF9000F007C117D /* Base */, 287 | ); 288 | name = Main.storyboard; 289 | sourceTree = ""; 290 | }; 291 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 292 | isa = PBXVariantGroup; 293 | children = ( 294 | 97C147001CF9000F007C117D /* Base */, 295 | ); 296 | name = LaunchScreen.storyboard; 297 | sourceTree = ""; 298 | }; 299 | /* End PBXVariantGroup section */ 300 | 301 | /* Begin XCBuildConfiguration section */ 302 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_ANALYZER_NONNULL = YES; 307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 308 | CLANG_CXX_LIBRARY = "libc++"; 309 | CLANG_ENABLE_MODULES = YES; 310 | CLANG_ENABLE_OBJC_ARC = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INFINITE_RECURSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 331 | COPY_PHASE_STRIP = NO; 332 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 333 | ENABLE_NS_ASSERTIONS = NO; 334 | ENABLE_STRICT_OBJC_MSGSEND = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_NO_COMMON_BLOCKS = YES; 337 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 338 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 339 | GCC_WARN_UNDECLARED_SELECTOR = YES; 340 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 341 | GCC_WARN_UNUSED_FUNCTION = YES; 342 | GCC_WARN_UNUSED_VARIABLE = YES; 343 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 344 | MTL_ENABLE_DEBUG_INFO = NO; 345 | SDKROOT = iphoneos; 346 | SUPPORTED_PLATFORMS = iphoneos; 347 | TARGETED_DEVICE_FAMILY = "1,2"; 348 | VALIDATE_PRODUCT = YES; 349 | }; 350 | name = Profile; 351 | }; 352 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 353 | isa = XCBuildConfiguration; 354 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 355 | buildSettings = { 356 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 357 | CLANG_ENABLE_MODULES = YES; 358 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 359 | DEVELOPMENT_TEAM = 2J8BUB9735; 360 | ENABLE_BITCODE = NO; 361 | INFOPLIST_FILE = Runner/Info.plist; 362 | LD_RUNPATH_SEARCH_PATHS = ( 363 | "$(inherited)", 364 | "@executable_path/Frameworks", 365 | ); 366 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPuzzleHack; 367 | PRODUCT_NAME = "$(TARGET_NAME)"; 368 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 369 | SWIFT_VERSION = 5.0; 370 | VERSIONING_SYSTEM = "apple-generic"; 371 | }; 372 | name = Profile; 373 | }; 374 | 97C147031CF9000F007C117D /* Debug */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | ALWAYS_SEARCH_USER_PATHS = NO; 378 | CLANG_ANALYZER_NONNULL = YES; 379 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 380 | CLANG_CXX_LIBRARY = "libc++"; 381 | CLANG_ENABLE_MODULES = YES; 382 | CLANG_ENABLE_OBJC_ARC = YES; 383 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 384 | CLANG_WARN_BOOL_CONVERSION = YES; 385 | CLANG_WARN_COMMA = YES; 386 | CLANG_WARN_CONSTANT_CONVERSION = YES; 387 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 388 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 389 | CLANG_WARN_EMPTY_BODY = YES; 390 | CLANG_WARN_ENUM_CONVERSION = YES; 391 | CLANG_WARN_INFINITE_RECURSION = YES; 392 | CLANG_WARN_INT_CONVERSION = YES; 393 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 394 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 395 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 396 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 397 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 398 | CLANG_WARN_STRICT_PROTOTYPES = YES; 399 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 400 | CLANG_WARN_UNREACHABLE_CODE = YES; 401 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 402 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 403 | COPY_PHASE_STRIP = NO; 404 | DEBUG_INFORMATION_FORMAT = dwarf; 405 | ENABLE_STRICT_OBJC_MSGSEND = YES; 406 | ENABLE_TESTABILITY = YES; 407 | GCC_C_LANGUAGE_STANDARD = gnu99; 408 | GCC_DYNAMIC_NO_PIC = NO; 409 | GCC_NO_COMMON_BLOCKS = YES; 410 | GCC_OPTIMIZATION_LEVEL = 0; 411 | GCC_PREPROCESSOR_DEFINITIONS = ( 412 | "DEBUG=1", 413 | "$(inherited)", 414 | ); 415 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 416 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 417 | GCC_WARN_UNDECLARED_SELECTOR = YES; 418 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 419 | GCC_WARN_UNUSED_FUNCTION = YES; 420 | GCC_WARN_UNUSED_VARIABLE = YES; 421 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 422 | MTL_ENABLE_DEBUG_INFO = YES; 423 | ONLY_ACTIVE_ARCH = YES; 424 | SDKROOT = iphoneos; 425 | TARGETED_DEVICE_FAMILY = "1,2"; 426 | }; 427 | name = Debug; 428 | }; 429 | 97C147041CF9000F007C117D /* Release */ = { 430 | isa = XCBuildConfiguration; 431 | buildSettings = { 432 | ALWAYS_SEARCH_USER_PATHS = NO; 433 | CLANG_ANALYZER_NONNULL = YES; 434 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 435 | CLANG_CXX_LIBRARY = "libc++"; 436 | CLANG_ENABLE_MODULES = YES; 437 | CLANG_ENABLE_OBJC_ARC = YES; 438 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 439 | CLANG_WARN_BOOL_CONVERSION = YES; 440 | CLANG_WARN_COMMA = YES; 441 | CLANG_WARN_CONSTANT_CONVERSION = YES; 442 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 443 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 444 | CLANG_WARN_EMPTY_BODY = YES; 445 | CLANG_WARN_ENUM_CONVERSION = YES; 446 | CLANG_WARN_INFINITE_RECURSION = YES; 447 | CLANG_WARN_INT_CONVERSION = YES; 448 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 449 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 450 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 451 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 452 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 453 | CLANG_WARN_STRICT_PROTOTYPES = YES; 454 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 455 | CLANG_WARN_UNREACHABLE_CODE = YES; 456 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 457 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 458 | COPY_PHASE_STRIP = NO; 459 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 460 | ENABLE_NS_ASSERTIONS = NO; 461 | ENABLE_STRICT_OBJC_MSGSEND = YES; 462 | GCC_C_LANGUAGE_STANDARD = gnu99; 463 | GCC_NO_COMMON_BLOCKS = YES; 464 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 465 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 466 | GCC_WARN_UNDECLARED_SELECTOR = YES; 467 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 468 | GCC_WARN_UNUSED_FUNCTION = YES; 469 | GCC_WARN_UNUSED_VARIABLE = YES; 470 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 471 | MTL_ENABLE_DEBUG_INFO = NO; 472 | SDKROOT = iphoneos; 473 | SUPPORTED_PLATFORMS = iphoneos; 474 | SWIFT_COMPILATION_MODE = wholemodule; 475 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 476 | TARGETED_DEVICE_FAMILY = "1,2"; 477 | VALIDATE_PRODUCT = YES; 478 | }; 479 | name = Release; 480 | }; 481 | 97C147061CF9000F007C117D /* Debug */ = { 482 | isa = XCBuildConfiguration; 483 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 484 | buildSettings = { 485 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 486 | CLANG_ENABLE_MODULES = YES; 487 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 488 | DEVELOPMENT_TEAM = 2J8BUB9735; 489 | ENABLE_BITCODE = NO; 490 | INFOPLIST_FILE = Runner/Info.plist; 491 | LD_RUNPATH_SEARCH_PATHS = ( 492 | "$(inherited)", 493 | "@executable_path/Frameworks", 494 | ); 495 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPuzzleHack; 496 | PRODUCT_NAME = "$(TARGET_NAME)"; 497 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 498 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 499 | SWIFT_VERSION = 5.0; 500 | VERSIONING_SYSTEM = "apple-generic"; 501 | }; 502 | name = Debug; 503 | }; 504 | 97C147071CF9000F007C117D /* Release */ = { 505 | isa = XCBuildConfiguration; 506 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 507 | buildSettings = { 508 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 509 | CLANG_ENABLE_MODULES = YES; 510 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 511 | DEVELOPMENT_TEAM = 2J8BUB9735; 512 | ENABLE_BITCODE = NO; 513 | INFOPLIST_FILE = Runner/Info.plist; 514 | LD_RUNPATH_SEARCH_PATHS = ( 515 | "$(inherited)", 516 | "@executable_path/Frameworks", 517 | ); 518 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterPuzzleHack; 519 | PRODUCT_NAME = "$(TARGET_NAME)"; 520 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 521 | SWIFT_VERSION = 5.0; 522 | VERSIONING_SYSTEM = "apple-generic"; 523 | }; 524 | name = Release; 525 | }; 526 | /* End XCBuildConfiguration section */ 527 | 528 | /* Begin XCConfigurationList section */ 529 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 530 | isa = XCConfigurationList; 531 | buildConfigurations = ( 532 | 97C147031CF9000F007C117D /* Debug */, 533 | 97C147041CF9000F007C117D /* Release */, 534 | 249021D3217E4FDB00AE95B9 /* Profile */, 535 | ); 536 | defaultConfigurationIsVisible = 0; 537 | defaultConfigurationName = Release; 538 | }; 539 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | 97C147061CF9000F007C117D /* Debug */, 543 | 97C147071CF9000F007C117D /* Release */, 544 | 249021D4217E4FDB00AE95B9 /* Profile */, 545 | ); 546 | defaultConfigurationIsVisible = 0; 547 | defaultConfigurationName = Release; 548 | }; 549 | /* End XCConfigurationList section */ 550 | }; 551 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 552 | } 553 | --------------------------------------------------------------------------------