├── lib ├── app │ ├── constans │ │ ├── api_path.dart │ │ ├── app_constants.dart │ │ └── asset_path.dart │ ├── features │ │ ├── intro │ │ │ └── index │ │ │ │ ├── controllers │ │ │ │ └── intro_controller.dart │ │ │ │ ├── bindings │ │ │ │ └── intro_binding.dart │ │ │ │ └── views │ │ │ │ ├── components │ │ │ │ ├── get_started_button.dart │ │ │ │ ├── background_image.dart │ │ │ │ └── header_text.dart │ │ │ │ └── screens │ │ │ │ └── intro_screen.dart │ │ ├── dashboard │ │ │ └── index │ │ │ │ ├── bindings │ │ │ │ └── dashboard_binding.dart │ │ │ │ ├── views │ │ │ │ ├── components │ │ │ │ │ ├── background_content.dart │ │ │ │ │ ├── search_text_field.dart │ │ │ │ │ ├── background_image.dart │ │ │ │ │ ├── header.dart │ │ │ │ │ ├── popular_game.dart │ │ │ │ │ ├── newest_game.dart │ │ │ │ │ ├── bottom_navbar.dart │ │ │ │ │ └── category_buttons.dart │ │ │ │ └── screens │ │ │ │ │ └── dashboard_screen.dart │ │ │ │ └── controllers │ │ │ │ └── dashboard_controller.dart │ │ └── product │ │ │ └── detail │ │ │ ├── bindings │ │ │ └── product_detail_binding.dart │ │ │ ├── controllers │ │ │ └── product_detail_controller.dart │ │ │ └── views │ │ │ ├── components │ │ │ ├── install_button.dart │ │ │ ├── background_image.dart │ │ │ ├── description.dart │ │ │ ├── back_button.dart │ │ │ ├── screenshot_image.dart │ │ │ ├── rating_and_review.dart │ │ │ └── header.dart │ │ │ └── screens │ │ │ └── product_detail_screen.dart │ ├── utils │ │ ├── services │ │ │ ├── rest_api_service.dart │ │ │ ├── user_service.dart │ │ │ └── product_service.dart │ │ └── ui │ │ │ └── ui_utils.dart │ ├── config │ │ ├── routes │ │ │ ├── app_routes.dart │ │ │ └── app_pages.dart │ │ └── themes │ │ │ └── app_theme.dart │ └── shared_components │ │ ├── rating_icon.dart │ │ ├── card_image.dart │ │ ├── custom_icon_button.dart │ │ └── card_product.dart └── main.dart ├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.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 ├── web ├── favicon.png ├── icons │ ├── Icon-192.png │ └── Icon-512.png ├── manifest.json └── index.html ├── 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 │ │ │ │ │ └── gia │ │ │ │ │ └── game_store │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── settings.gradle └── build.gradle ├── assets └── images │ ├── raster │ ├── phone-3d.png │ ├── logo-gia-developer.png │ ├── rayman legends │ │ ├── rl-1.jpg │ │ ├── rl-2.jpg │ │ ├── rl-3.jpg │ │ ├── rl-4.jpg │ │ ├── rl-5.jpg │ │ └── rl-icon.png │ └── ori blind forest │ │ ├── ori-1.jpg │ │ ├── ori-2.jpg │ │ ├── ori-3.jpg │ │ ├── ori-4.jpg │ │ ├── ori-5.jpg │ │ └── ori-icon.png │ └── vector │ └── background_liquid.svg ├── .metadata ├── README.md ├── .gitignore ├── test └── widget_test.dart ├── pubspec.yaml └── pubspec.lock /lib/app/constans/api_path.dart: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/web/icons/Icon-512.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /assets/images/raster/phone-3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/phone-3d.png -------------------------------------------------------------------------------- /lib/app/constans/app_constants.dart: -------------------------------------------------------------------------------- 1 | library constants; 2 | 3 | part 'asset_path.dart'; 4 | 5 | const kDefaultPadding = 20.0; 6 | -------------------------------------------------------------------------------- /assets/images/raster/logo-gia-developer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/logo-gia-developer.png -------------------------------------------------------------------------------- /assets/images/raster/rayman legends/rl-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/rayman legends/rl-1.jpg -------------------------------------------------------------------------------- /assets/images/raster/rayman legends/rl-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/rayman legends/rl-2.jpg -------------------------------------------------------------------------------- /assets/images/raster/rayman legends/rl-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/rayman legends/rl-3.jpg -------------------------------------------------------------------------------- /assets/images/raster/rayman legends/rl-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/rayman legends/rl-4.jpg -------------------------------------------------------------------------------- /assets/images/raster/rayman legends/rl-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/rayman legends/rl-5.jpg -------------------------------------------------------------------------------- /assets/images/raster/ori blind forest/ori-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/ori blind forest/ori-1.jpg -------------------------------------------------------------------------------- /assets/images/raster/ori blind forest/ori-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/ori blind forest/ori-2.jpg -------------------------------------------------------------------------------- /assets/images/raster/ori blind forest/ori-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/ori blind forest/ori-3.jpg -------------------------------------------------------------------------------- /assets/images/raster/ori blind forest/ori-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/ori blind forest/ori-4.jpg -------------------------------------------------------------------------------- /assets/images/raster/ori blind forest/ori-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/ori blind forest/ori-5.jpg -------------------------------------------------------------------------------- /assets/images/raster/rayman legends/rl-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/rayman legends/rl-icon.png -------------------------------------------------------------------------------- /assets/images/raster/ori blind forest/ori-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/assets/images/raster/ori blind forest/ori-icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/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/firgia/FD-Game-Store/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/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/firgia/FD-Game-Store/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/firgia/FD-Game-Store/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firgia/FD-Game-Store/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/gia/game_store/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.gia.game_store 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /lib/app/features/intro/index/controllers/intro_controller.dart: -------------------------------------------------------------------------------- 1 | part of intro; 2 | 3 | class IntroController extends GetxController { 4 | void goToDashboard() { 5 | Get.offNamed(Routes.dashboard); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /lib/app/features/intro/index/bindings/intro_binding.dart: -------------------------------------------------------------------------------- 1 | part of intro; 2 | 3 | class IntroBinding extends Bindings { 4 | @override 5 | void dependencies() { 6 | Get.lazyPut(() => IntroController()); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/bindings/dashboard_binding.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class DashboardBinding extends Bindings { 4 | @override 5 | void dependencies() { 6 | Get.lazyPut(() => DashboardController()); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/bindings/product_detail_binding.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class ProductDetailBinding extends Bindings { 4 | @override 5 | void dependencies() { 6 | Get.lazyPut(() => ProductDetailController()); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /lib/app/utils/services/rest_api_service.dart: -------------------------------------------------------------------------------- 1 | library rest_api; 2 | 3 | // this is fake request 4 | import 'package:flutter/material.dart'; 5 | import 'package:game_store/app/constans/app_constants.dart'; 6 | 7 | part 'product_service.dart'; 8 | part 'user_service.dart'; 9 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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: b1395592de68cc8ac4522094ae59956dd21a91db 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /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. -------------------------------------------------------------------------------- /lib/app/config/routes/app_routes.dart: -------------------------------------------------------------------------------- 1 | part of routes; 2 | 3 | class Routes { 4 | static const intro = _Paths.intro; 5 | static const dashboard = _Paths.dashboard; 6 | static const productDetail = _Paths.productDetail; 7 | } 8 | 9 | class _Paths { 10 | static const intro = "/intro/"; 11 | static const dashboard = "/dashboard/"; 12 | static const productDetail = "/product/detail"; 13 | } 14 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/controllers/product_detail_controller.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class ProductDetailController extends GetxController { 4 | late final Product product; 5 | String? heroTag; 6 | 7 | @override 8 | void onInit() { 9 | super.onInit(); 10 | heroTag = Get.parameters['hero_tag']; 11 | 12 | product = Get.arguments as Product; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /assets/images/vector/background_liquid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/app/utils/services/user_service.dart: -------------------------------------------------------------------------------- 1 | part of rest_api; 2 | 3 | class UserService { 4 | User getUserLogin() { 5 | // sample data 6 | return User(image: AssetImage(ImageRaster.logoGiaDeveloper), name: "gia"); 7 | } 8 | } 9 | 10 | class User { 11 | final ImageProvider image; 12 | final String name; 13 | 14 | User({ 15 | required this.image, 16 | required this.name, 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/app/features/intro/index/views/components/get_started_button.dart: -------------------------------------------------------------------------------- 1 | part of intro; 2 | 3 | class _GetStartedButton extends GetView { 4 | const _GetStartedButton({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return ElevatedButton( 9 | style: ElevatedButton.styleFrom( 10 | primary: Colors.pink[300], 11 | ), 12 | onPressed: () => controller.goToDashboard(), 13 | child: Text("Get Started"), 14 | ).large(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/views/components/install_button.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class _InstallButton extends StatelessWidget { 4 | const _InstallButton({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: const EdgeInsets.symmetric( 10 | horizontal: kDefaultPadding, 11 | vertical: kDefaultPadding / 2, 12 | ), 13 | child: ElevatedButton(onPressed: () {}, child: Text("Install")).large(), 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/views/components/background_image.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class _BackgroundImage extends GetView { 4 | const _BackgroundImage({Key? key}) : super(key: key); 5 | static final height = Get.height * .4; 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Hero( 10 | tag: controller.heroTag ?? "", 11 | child: Image( 12 | image: controller.product.backgroundImage, 13 | height: height, 14 | fit: BoxFit.cover, 15 | ), 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:game_store/app/config/routes/app_pages.dart'; 3 | import 'package:game_store/app/config/themes/app_theme.dart'; 4 | import 'package:get/get.dart'; 5 | 6 | void main() { 7 | runApp(MyApp()); 8 | } 9 | 10 | class MyApp extends StatelessWidget { 11 | // This widget is the root of your application. 12 | @override 13 | Widget build(BuildContext context) { 14 | return GetMaterialApp( 15 | title: 'Game Store', 16 | theme: AppTheme.basic, 17 | initialRoute: AppPages.initial, 18 | getPages: AppPages.pages, 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mobile Game Store 2 | 3 | ## [Watch it on YouTube](https://youtu.be/GL4LtEFSUVs) 4 | 5 | ### Splash, Home & Product Detail Screen 6 | 7 | ![thumbnail-game-store-app](https://user-images.githubusercontent.com/84274595/124438290-3515e580-dda2-11eb-9b27-e4d3da26f3c8.png) 8 | ![Game Store - demo](https://user-images.githubusercontent.com/89120990/135752171-e22ca98a-10d9-4ffd-91d2-0dfc7c253c49.gif) 9 | 10 | 11 | **Dependencies:** 12 | 13 | - [font_awesome_flutter](https://pub.dev/packages/font_awesome_flutter) 14 | - [lottie](https://pub.dev/packages/lottie) 15 | - [get](https://pub.dev/packages/get) 16 | - [readmore](https://pub.dev/packages/readmore) 17 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/components/background_content.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class _BackgroundContent extends StatelessWidget { 4 | const _BackgroundContent({required this.child, Key? key}) : super(key: key); 5 | 6 | final Widget child; 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Container( 11 | width: Get.width, 12 | child: child, 13 | decoration: BoxDecoration( 14 | color: Theme.of(context).canvasColor, 15 | borderRadius: BorderRadius.only( 16 | topLeft: Radius.circular(20), 17 | topRight: Radius.circular(20), 18 | ), 19 | ), 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "game_store", 3 | "short_name": "game_store", 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 | } 24 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/components/search_text_field.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class _SearchTextField extends StatelessWidget { 4 | const _SearchTextField({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: const EdgeInsets.symmetric(horizontal: kDefaultPadding), 10 | child: TextField( 11 | decoration: InputDecoration( 12 | prefixIcon: Icon( 13 | Icons.search, 14 | size: 25, 15 | color: Theme.of(context).primaryColor, 16 | ), 17 | hintText: "Search game", 18 | ), 19 | ), 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/views/components/description.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class _Description extends GetView { 4 | const _Description({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: const EdgeInsets.symmetric(horizontal: kDefaultPadding), 10 | child: ReadMoreText( 11 | controller.product.description, 12 | trimLines: 3, 13 | style: Theme.of(context) 14 | .textTheme 15 | .bodyText2 16 | ?.copyWith(color: Colors.black54, height: 1.5), 17 | trimMode: TrimMode.Line, 18 | trimCollapsedText: 'Read More', 19 | trimExpandedText: ' Less ', 20 | ), 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/views/components/back_button.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class _BackButton extends StatelessWidget { 4 | const _BackButton({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 40), 10 | child: Material( 11 | borderRadius: BorderRadius.circular(20), 12 | color: Colors.white30, 13 | child: InkWell( 14 | borderRadius: BorderRadius.circular(20), 15 | child: Padding( 16 | padding: const EdgeInsets.all(5), 17 | child: Icon(Icons.arrow_back_ios_rounded), 18 | ), 19 | onTap: () => Get.back(), 20 | ), 21 | ), 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/app/features/intro/index/views/components/background_image.dart: -------------------------------------------------------------------------------- 1 | part of intro; 2 | 3 | class _BackgroundImage extends StatelessWidget { 4 | const _BackgroundImage({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Stack( 9 | alignment: Alignment.center, 10 | children: [ 11 | Align( 12 | alignment: Alignment.center, 13 | child: SvgPicture.asset( 14 | ImageVector.backgroundLiquid, 15 | width: Get.width * .7, 16 | ), 17 | ), 18 | Align( 19 | alignment: Alignment.center, 20 | child: Image.asset( 21 | ImageRaster.phone3d, 22 | width: Get.width * .8, 23 | ), 24 | ), 25 | ], 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /lib/app/shared_components/rating_icon.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class RatingIcon extends StatelessWidget { 4 | const RatingIcon({required this.rating, this.size = 24, Key? key}) 5 | : assert(rating >= 0 && rating <= 5), 6 | super(key: key); 7 | 8 | final double rating; 9 | final double size; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Row( 14 | children: List.generate(5, (index) { 15 | var _gap = size * .1; 16 | 17 | return Padding( 18 | padding: EdgeInsets.only( 19 | right: (index > 0 && index < 5) ? _gap : 0, 20 | left: (index == 5) ? _gap : 0, 21 | ), 22 | child: Icon( 23 | Icons.star, 24 | size: size, 25 | color: (rating.floor() > index) ? Colors.amber : Colors.grey, 26 | ), 27 | ); 28 | }), 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/app/config/routes/app_pages.dart: -------------------------------------------------------------------------------- 1 | library routes; 2 | 3 | import 'package:game_store/app/features/dashboard/index/views/screens/dashboard_screen.dart'; 4 | import 'package:game_store/app/features/intro/index/views/screens/intro_screen.dart'; 5 | import 'package:game_store/app/features/product/detail/views/screens/product_detail_screen.dart'; 6 | import 'package:get/get.dart'; 7 | 8 | part 'app_routes.dart'; 9 | 10 | class AppPages { 11 | static const initial = _Paths.intro; 12 | static final pages = [ 13 | GetPage( 14 | name: _Paths.intro, 15 | page: () => IntroScreen(), 16 | binding: IntroBinding(), 17 | ), 18 | GetPage( 19 | name: _Paths.dashboard, 20 | page: () => DashboardScreen(), 21 | binding: DashboardBinding(), 22 | ), 23 | GetPage( 24 | name: _Paths.productDetail, 25 | page: () => ProductDetailScreen(), 26 | binding: ProductDetailBinding(), 27 | transition: Transition.downToUp, 28 | ), 29 | ]; 30 | } 31 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/controllers/dashboard_controller.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class DashboardController extends GetxController { 4 | final _productService = ProductService(); 5 | final _userService = UserService(); 6 | 7 | late final User user; 8 | late final List popularGame; 9 | late final List newestGame; 10 | 11 | @override 12 | void onInit() { 13 | super.onInit(); 14 | 15 | user = _userService.getUserLogin(); 16 | popularGame = _productService.getPopularGame(); 17 | newestGame = _productService.getNewestGame(); 18 | } 19 | 20 | void goToDetail(Product product, {required String heroTag}) { 21 | Get.toNamed( 22 | Routes.productDetail, 23 | arguments: product, 24 | parameters: {'hero_tag': "$heroTag"}, 25 | ); 26 | } 27 | 28 | String getPopularGameTag(Product product) { 29 | return "popular_game=${product.id}"; 30 | } 31 | 32 | String getNewestGameTag(Product product) { 33 | return "newest_game=${product.id}"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/components/background_image.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class _BackgroundImage extends StatelessWidget { 4 | const _BackgroundImage({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Container( 9 | width: Get.width, 10 | height: 250, 11 | color: Theme.of(context).primaryColor, 12 | child: Stack( 13 | alignment: Alignment.center, 14 | children: [ 15 | _image(offset: Offset(-Get.width * .35, -Get.width * .25), angle: -5), 16 | _image(offset: Offset(Get.width * .35, Get.width * .25), angle: 4), 17 | ], 18 | ), 19 | ); 20 | } 21 | 22 | Widget _image({required Offset offset, required double angle}) { 23 | return Transform.translate( 24 | offset: offset, 25 | child: Transform.rotate( 26 | angle: angle, 27 | child: SvgPicture.asset( 28 | ImageVector.backgroundLiquid, 29 | width: Get.width * .55, 30 | ), 31 | ), 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/app/config/themes/app_theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class AppTheme { 5 | static const _primaryColor = const Color.fromRGBO(95, 103, 236, 1); 6 | static const _primaryColorLight = const Color.fromRGBO(111, 118, 238, 1); 7 | 8 | static ThemeData get basic { 9 | return ThemeData( 10 | primarySwatch: Colors.indigo, 11 | canvasColor: Color.fromRGBO(246, 247, 255, 1), 12 | primaryColor: _primaryColor, 13 | primaryColorLight: _primaryColorLight, 14 | buttonColor: Colors.indigo, 15 | inputDecorationTheme: InputDecorationTheme( 16 | filled: true, 17 | fillColor: Color.fromRGBO(244, 246, 253, 1), 18 | isDense: true, 19 | border: OutlineInputBorder( 20 | borderRadius: BorderRadius.circular(20), 21 | ), 22 | enabledBorder: OutlineInputBorder( 23 | borderRadius: BorderRadius.circular(20), 24 | borderSide: BorderSide(color: Colors.transparent), 25 | ), 26 | ), 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/app/features/intro/index/views/components/header_text.dart: -------------------------------------------------------------------------------- 1 | part of intro; 2 | 3 | class _HeaderText extends StatelessWidget { 4 | const _HeaderText({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Column( 9 | children: [ 10 | SizedBox(height: 15), 11 | _title(), 12 | SizedBox(height: 15), 13 | _subtitle(), 14 | ], 15 | ); 16 | } 17 | 18 | Widget _title() { 19 | return Text( 20 | "Adding Fun to Your Life", 21 | textAlign: TextAlign.center, 22 | style: Theme.of(Get.context!).textTheme.headline5!.copyWith( 23 | fontWeight: FontWeight.bold, 24 | color: Colors.white, 25 | height: 1.4, 26 | wordSpacing: 1.8, 27 | letterSpacing: 1.3), 28 | ); 29 | } 30 | 31 | Widget _subtitle() { 32 | return Text( 33 | "We provide make more experience for playing game", 34 | style: TextStyle(color: Colors.grey[200], fontSize: 15), 35 | textAlign: TextAlign.center, 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/views/components/screenshot_image.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class _ScreenshotImage extends GetView { 4 | const _ScreenshotImage({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return SizedBox( 9 | height: 150, 10 | child: ListView.builder( 11 | scrollDirection: Axis.horizontal, 12 | itemCount: controller.product.screenshotImages.length, 13 | physics: BouncingScrollPhysics(), 14 | itemBuilder: (context, index) { 15 | return Padding( 16 | padding: EdgeInsets.only( 17 | left: (index == 0) ? kDefaultPadding : 0, 18 | right: kDefaultPadding, 19 | ), 20 | child: ClipRRect( 21 | borderRadius: BorderRadius.circular(10), 22 | child: Image( 23 | image: controller.product.screenshotImages[index], 24 | width: 250, 25 | fit: BoxFit.cover, 26 | ), 27 | ), 28 | ); 29 | }, 30 | ), 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /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:game_store/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/components/header.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class _Header extends GetView { 4 | const _Header({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: const EdgeInsets.symmetric(horizontal: kDefaultPadding), 10 | child: Column( 11 | crossAxisAlignment: CrossAxisAlignment.start, 12 | children: [ 13 | Row( 14 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 15 | children: [ 16 | _title(), 17 | _imageProfile(), 18 | ], 19 | ), 20 | _subtitle(), 21 | ], 22 | ), 23 | ); 24 | } 25 | 26 | Widget _title() { 27 | return Text( 28 | "Welcome, " + GetUtils.capitalize(controller.user.name)!, 29 | style: Theme.of(Get.context!).textTheme.headline5?.copyWith( 30 | color: Colors.white, 31 | ), 32 | ); 33 | } 34 | 35 | Widget _subtitle() { 36 | return Text( 37 | "What would you like to play ? ", 38 | style: TextStyle( 39 | fontSize: 15, 40 | color: Colors.grey[200], 41 | ), 42 | ); 43 | } 44 | 45 | Widget _imageProfile() { 46 | return CircleAvatar( 47 | backgroundImage: controller.user.image, 48 | ); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /lib/app/shared_components/card_image.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CardImage extends StatelessWidget { 4 | const CardImage({required this.image, this.onPressed, Key? key}) 5 | : super(key: key); 6 | 7 | final ImageProvider image; 8 | final Function()? onPressed; 9 | final _borderRadius = 10.0; 10 | 11 | static Size size = const Size(300, 180); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return Container( 16 | margin: EdgeInsets.all(10), 17 | width: size.width, 18 | height: size.height, 19 | child: Stack( 20 | fit: StackFit.expand, 21 | children: [ 22 | _image(), 23 | _customInkwell(), 24 | ], 25 | ), 26 | ); 27 | } 28 | 29 | Widget _image() { 30 | return Card( 31 | elevation: 5, 32 | shape: RoundedRectangleBorder( 33 | borderRadius: BorderRadius.circular(_borderRadius), 34 | ), 35 | child: ClipRRect( 36 | borderRadius: BorderRadius.circular(_borderRadius), 37 | child: Image( 38 | image: image, 39 | fit: BoxFit.cover, 40 | ), 41 | ), 42 | ); 43 | } 44 | 45 | Widget _customInkwell() { 46 | return Material( 47 | color: Colors.transparent, 48 | child: InkWell( 49 | borderRadius: BorderRadius.circular(_borderRadius), 50 | onTap: onPressed, 51 | ), 52 | ); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /lib/app/constans/asset_path.dart: -------------------------------------------------------------------------------- 1 | part of constants; 2 | 3 | class ImageRaster { 4 | static const _path = "assets/images/raster"; 5 | 6 | static const oriBlindForestIcon = "$_path/ori blind forest/ori-icon.png"; 7 | static const oriBlindForest1 = "$_path/ori blind forest/ori-1.jpg"; 8 | static const oriBlindForest2 = "$_path/ori blind forest/ori-2.jpg"; 9 | static const oriBlindForest3 = "$_path/ori blind forest/ori-3.jpg"; 10 | static const oriBlindForest4 = "$_path/ori blind forest/ori-4.jpg"; 11 | static const oriBlindForest5 = "$_path/ori blind forest/ori-5.jpg"; 12 | 13 | static const raymandLegendIcon = "$_path/rayman legends/rl-icon.png"; 14 | static const raymandLegend1 = "$_path/rayman legends/rl-1.jpg"; 15 | static const raymandLegend2 = "$_path/rayman legends/rl-2.jpg"; 16 | static const raymandLegend3 = "$_path/rayman legends/rl-3.jpg"; 17 | static const raymandLegend4 = "$_path/rayman legends/rl-4.jpg"; 18 | static const raymandLegend5 = "$_path/rayman legends/rl-5.jpg"; 19 | 20 | static const logoGiaDeveloper = "$_path/logo-gia-developer.png"; 21 | static const phone3d = "$_path/phone-3d.png"; 22 | } 23 | 24 | class ImageVector { 25 | static const _path = "assets/images/vector"; 26 | 27 | static const backgroundLiquid = "$_path/background_liquid.svg"; 28 | } 29 | 30 | class ImageAnimation { 31 | static const _path = "assets/images/animation"; 32 | 33 | static const confetti = "$_path/confetti.json"; 34 | } 35 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/components/popular_game.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class _PopularGame extends GetView { 4 | const _PopularGame({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Column( 9 | crossAxisAlignment: CrossAxisAlignment.start, 10 | children: [ 11 | _title(), 12 | SizedBox(height: 10), 13 | _content(), 14 | ], 15 | ); 16 | } 17 | 18 | Widget _title() { 19 | return Padding( 20 | padding: const EdgeInsets.symmetric(horizontal: kDefaultPadding), 21 | child: Text( 22 | "Popular Game", 23 | style: Theme.of(Get.context!).textTheme.headline6, 24 | ), 25 | ); 26 | } 27 | 28 | Widget _content() { 29 | return SizedBox( 30 | height: CardImage.size.height, 31 | child: ListView.builder( 32 | scrollDirection: Axis.horizontal, 33 | physics: BouncingScrollPhysics(), 34 | itemCount: controller.popularGame.length, 35 | itemBuilder: (context, index) { 36 | var product = controller.popularGame[index]; 37 | 38 | return Hero( 39 | tag: controller.getPopularGameTag(product), 40 | child: CardImage( 41 | image: product.backgroundImage, 42 | onPressed: () => controller.goToDetail( 43 | product, 44 | heroTag: controller.getPopularGameTag(product), 45 | ), 46 | ), 47 | ); 48 | }, 49 | ), 50 | ); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/components/newest_game.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class _NewestGame extends GetView { 4 | const _NewestGame({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Column( 9 | crossAxisAlignment: CrossAxisAlignment.start, 10 | children: [ 11 | _title(), 12 | SizedBox(height: 10), 13 | ..._content(), 14 | ], 15 | ); 16 | } 17 | 18 | Widget _title() { 19 | return Padding( 20 | padding: const EdgeInsets.symmetric(horizontal: kDefaultPadding), 21 | child: Text( 22 | "Newest Game", 23 | style: Theme.of(Get.context!).textTheme.headline6, 24 | ), 25 | ); 26 | } 27 | 28 | List _content() { 29 | return controller.popularGame 30 | .map( 31 | (product) => Padding( 32 | padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), 33 | child: Hero( 34 | tag: controller.getNewestGameTag(product), 35 | child: CardProduct( 36 | data: CardProductData( 37 | image: product.iconImage, 38 | name: product.name, 39 | category: product.category, 40 | rating: product.rating), 41 | onPressed: () => controller.goToDetail( 42 | product, 43 | heroTag: controller.getNewestGameTag(product), 44 | ), 45 | ), 46 | ), 47 | ), 48 | ) 49 | .toList(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /lib/app/utils/ui/ui_utils.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | extension ElevatedButtonExtension on ElevatedButton { 6 | ElevatedButton large() { 7 | ButtonStyle _tempStyle = 8 | (style != null) ? style! : ElevatedButton.styleFrom(); 9 | 10 | return ElevatedButton( 11 | onPressed: onPressed, 12 | child: child, 13 | style: _tempStyle.copyWith( 14 | shape: MaterialStateProperty.all( 15 | RoundedRectangleBorder( 16 | borderRadius: BorderRadius.circular(15), 17 | ), 18 | ), 19 | minimumSize: MaterialStateProperty.all( 20 | Size(double.infinity, 50), 21 | ), 22 | textStyle: MaterialStateProperty.all( 23 | TextStyle( 24 | fontSize: 15, 25 | letterSpacing: 1.25, 26 | fontWeight: FontWeight.bold, 27 | ), 28 | ), 29 | ), 30 | ); 31 | } 32 | 33 | ElevatedButton small() { 34 | ButtonStyle _tempStyle = 35 | (style != null) ? style! : ElevatedButton.styleFrom(); 36 | 37 | return ElevatedButton( 38 | onPressed: onPressed, 39 | child: child, 40 | style: _tempStyle.copyWith( 41 | shape: MaterialStateProperty.all( 42 | RoundedRectangleBorder( 43 | borderRadius: BorderRadius.circular(15), 44 | ), 45 | ), 46 | minimumSize: MaterialStateProperty.all( 47 | Size(20, 30), 48 | ), 49 | textStyle: MaterialStateProperty.all( 50 | TextStyle( 51 | fontSize: 14, 52 | ), 53 | ), 54 | ), 55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | game_store 30 | 31 | 32 | 33 | 36 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | Game Store 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/components/bottom_navbar.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class _BottomNavbar extends StatelessWidget { 4 | _BottomNavbar({Key? key}) : super(key: key); 5 | 6 | final _index = 0.obs; 7 | @override 8 | Widget build(BuildContext context) { 9 | return Obx( 10 | () => _customBackground( 11 | child: Padding( 12 | padding: const EdgeInsets.symmetric(vertical: 5), 13 | child: BottomNavigationBar( 14 | onTap: (value) => _index.value = value, 15 | currentIndex: _index.value, 16 | items: [ 17 | BottomNavigationBarItem( 18 | icon: Icon(Icons.home_rounded), label: "Home"), 19 | BottomNavigationBarItem( 20 | icon: Icon(Icons.video_collection), label: "Collection"), 21 | BottomNavigationBarItem( 22 | icon: Icon(Icons.play_circle_fill), label: "Installed"), 23 | ], 24 | backgroundColor: Colors.transparent, 25 | elevation: 0, 26 | iconSize: 30, 27 | unselectedItemColor: Colors.grey[500], 28 | ), 29 | ), 30 | ), 31 | ); 32 | } 33 | 34 | Widget _customBackground({required Widget child}) { 35 | return Container( 36 | decoration: BoxDecoration( 37 | color: Colors.white, 38 | borderRadius: BorderRadius.only( 39 | topLeft: Radius.circular(20), 40 | topRight: Radius.circular(20), 41 | ), 42 | boxShadow: [ 43 | BoxShadow( 44 | offset: Offset(0, -5), 45 | color: Colors.black12, 46 | blurRadius: 10, 47 | ) 48 | ], 49 | ), 50 | child: child, 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/app/features/intro/index/views/screens/intro_screen.dart: -------------------------------------------------------------------------------- 1 | library intro; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_svg/flutter_svg.dart'; 5 | import 'package:game_store/app/config/routes/app_pages.dart'; 6 | import 'package:game_store/app/constans/app_constants.dart'; 7 | import 'package:get/get.dart'; 8 | import 'package:game_store/app/utils/ui/ui_utils.dart'; 9 | import 'package:lottie/lottie.dart'; 10 | 11 | // bindings 12 | part '../../bindings/intro_binding.dart'; 13 | 14 | // controller 15 | part '../../controllers/intro_controller.dart'; 16 | 17 | // component 18 | part '../components/background_image.dart'; 19 | part '../components/get_started_button.dart'; 20 | part '../components/header_text.dart'; 21 | 22 | class IntroScreen extends StatelessWidget { 23 | const IntroScreen({Key? key}) : super(key: key); 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | return Scaffold( 28 | backgroundColor: Theme.of(context).primaryColor, 29 | body: Stack( 30 | children: [ 31 | Padding( 32 | padding: const EdgeInsets.symmetric(horizontal: 40), 33 | child: Column( 34 | crossAxisAlignment: CrossAxisAlignment.center, 35 | children: [ 36 | Spacer(flex: 5), 37 | _BackgroundImage(), 38 | _HeaderText(), 39 | Spacer(flex: 3), 40 | _GetStartedButton(), 41 | Spacer(flex: 5), 42 | ], 43 | ), 44 | ), 45 | IgnorePointer( 46 | child: LottieBuilder.asset( 47 | ImageAnimation.confetti, 48 | repeat: false, 49 | ), 50 | ) 51 | ], 52 | ), 53 | ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/components/category_buttons.dart: -------------------------------------------------------------------------------- 1 | part of dashboard; 2 | 3 | class _CategoryButtons extends StatelessWidget { 4 | _CategoryButtons({Key? key}) : super(key: key); 5 | 6 | final List _listButton = [ 7 | CustomIconButton( 8 | icon: FontAwesomeIcons.skiing, 9 | label: "Sport", 10 | onPressed: () {}, 11 | primary: Colors.green[300], 12 | ), 13 | CustomIconButton( 14 | icon: FontAwesomeIcons.chess, 15 | label: "Strategy", 16 | onPressed: () {}, 17 | primary: Colors.blue, 18 | ), 19 | CustomIconButton( 20 | icon: FontAwesomeIcons.meteor, 21 | label: "Action", 22 | onPressed: () {}, 23 | primary: Colors.redAccent, 24 | ), 25 | CustomIconButton( 26 | icon: FontAwesomeIcons.guitar, 27 | label: "musical", 28 | onPressed: () {}, 29 | primary: Colors.brown[400], 30 | ), 31 | CustomIconButton( 32 | icon: FontAwesomeIcons.car, 33 | label: "simulation", 34 | onPressed: () {}, 35 | primary: Colors.blue, 36 | ), 37 | CustomIconButton( 38 | icon: Icons.more_horiz, 39 | label: "more", 40 | onPressed: () {}, 41 | primary: Colors.indigoAccent, 42 | ), 43 | ]; 44 | 45 | @override 46 | Widget build(BuildContext context) { 47 | return SizedBox( 48 | height: 80, 49 | child: ListView.builder( 50 | scrollDirection: Axis.horizontal, 51 | physics: BouncingScrollPhysics(), 52 | itemCount: _listButton.length, 53 | itemBuilder: (context, index) { 54 | return Padding( 55 | padding: EdgeInsets.only( 56 | left: index == 0 ? 10 : 0, 57 | right: 10, 58 | ), 59 | child: _listButton[index], 60 | ); 61 | }, 62 | ), 63 | ); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 30 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | defaultConfig { 36 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 37 | applicationId "com.gia.game_store" 38 | minSdkVersion 16 39 | targetSdkVersion 30 40 | versionCode flutterVersionCode.toInteger() 41 | versionName flutterVersionName 42 | } 43 | 44 | buildTypes { 45 | release { 46 | // TODO: Add your own signing config for the release build. 47 | // Signing with the debug keys for now, so `flutter run --release` works. 48 | signingConfig signingConfigs.debug 49 | } 50 | } 51 | } 52 | 53 | flutter { 54 | source '../..' 55 | } 56 | 57 | dependencies { 58 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 59 | } 60 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/views/components/rating_and_review.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class _RatingsAndReview extends GetView { 4 | const _RatingsAndReview({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: const EdgeInsets.symmetric(horizontal: kDefaultPadding), 10 | child: Column( 11 | children: [ 12 | _title(), 13 | Row( 14 | children: [ 15 | _ratingText(), 16 | SizedBox(width: 10), 17 | Column( 18 | crossAxisAlignment: CrossAxisAlignment.start, 19 | children: [ 20 | RatingIcon(rating: controller.product.rating, size: 20), 21 | SizedBox(height: 10), 22 | _reviewText(), 23 | ], 24 | ), 25 | ], 26 | ) 27 | ], 28 | ), 29 | ); 30 | } 31 | 32 | Widget _ratingText() { 33 | return Text( 34 | controller.product.rating.toString(), 35 | style: TextStyle( 36 | fontSize: 55, 37 | fontWeight: FontWeight.bold, 38 | ), 39 | ); 40 | } 41 | 42 | Widget _title() { 43 | return Row( 44 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 45 | children: [ 46 | Text( 47 | "Ratings and Review", 48 | style: TextStyle( 49 | fontSize: 16, 50 | fontWeight: FontWeight.w500, 51 | ), 52 | ), 53 | TextButton( 54 | style: TextButton.styleFrom(primary: Colors.grey), 55 | onPressed: () {}, 56 | child: Text("View")) 57 | ], 58 | ); 59 | } 60 | 61 | Widget _reviewText() { 62 | return Text( 63 | "${controller.product.totalReview} review", 64 | style: TextStyle( 65 | fontWeight: FontWeight.w500, 66 | color: Colors.grey, 67 | ), 68 | ); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 13 | 17 | 21 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/views/screens/product_detail_screen.dart: -------------------------------------------------------------------------------- 1 | library product_detail; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:game_store/app/constans/app_constants.dart'; 5 | import 'package:game_store/app/shared_components/rating_icon.dart'; 6 | import 'package:game_store/app/utils/services/rest_api_service.dart'; 7 | import 'package:get/get.dart'; 8 | import 'package:readmore/readmore.dart'; 9 | import 'package:game_store/app/utils/ui/ui_utils.dart'; 10 | 11 | // binding 12 | part '../../bindings/product_detail_binding.dart'; 13 | 14 | // controller 15 | part '../../controllers/product_detail_controller.dart'; 16 | 17 | // component 18 | part '../components/back_button.dart'; 19 | part '../components/background_image.dart'; 20 | part '../components/description.dart'; 21 | part '../components/header.dart'; 22 | part '../components/install_button.dart'; 23 | part '../components/rating_and_review.dart'; 24 | part '../components/screenshot_image.dart'; 25 | 26 | class ProductDetailScreen extends StatelessWidget { 27 | const ProductDetailScreen({Key? key}) : super(key: key); 28 | 29 | @override 30 | Widget build(BuildContext context) { 31 | return Scaffold( 32 | body: SingleChildScrollView( 33 | child: Stack( 34 | children: [ 35 | _BackgroundImage(), 36 | Container( 37 | margin: EdgeInsets.only(top: _BackgroundImage.height - 30), 38 | decoration: BoxDecoration( 39 | color: Theme.of(context).canvasColor, 40 | borderRadius: BorderRadius.only( 41 | topLeft: Radius.circular(30), 42 | topRight: Radius.circular(30), 43 | )), 44 | child: Column( 45 | children: [ 46 | SizedBox(height: 20), 47 | _Header(), 48 | SizedBox(height: 20), 49 | _ScreenshotImage(), 50 | SizedBox(height: 20), 51 | _Description(), 52 | SizedBox(height: 20), 53 | _RatingsAndReview(), 54 | SizedBox(height: 20), 55 | ], 56 | ), 57 | ), 58 | _BackButton(), 59 | ], 60 | ), 61 | ), 62 | bottomNavigationBar: _InstallButton(), 63 | ); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /lib/app/features/product/detail/views/components/header.dart: -------------------------------------------------------------------------------- 1 | part of product_detail; 2 | 3 | class _Header extends GetView { 4 | const _Header({Key? key}) : super(key: key); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: const EdgeInsets.symmetric(horizontal: kDefaultPadding), 10 | child: Row( 11 | children: [ 12 | _iconImage(controller.product.iconImage), 13 | SizedBox(width: 10), 14 | Expanded( 15 | child: Column( 16 | crossAxisAlignment: CrossAxisAlignment.start, 17 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 18 | children: [ 19 | _nameText(controller.product.name), 20 | SizedBox(height: 5), 21 | _categoryText(controller.product.category), 22 | SizedBox(height: 10), 23 | _ratingAndTotalDownload(), 24 | ], 25 | ), 26 | ) 27 | ], 28 | ), 29 | ); 30 | } 31 | 32 | Widget _iconImage(ImageProvider image) { 33 | return SizedBox( 34 | width: 80, 35 | height: 80, 36 | child: ClipRRect( 37 | borderRadius: BorderRadius.circular(10), 38 | child: Image(image: image), 39 | ), 40 | ); 41 | } 42 | 43 | Widget _nameText(String name) { 44 | return Text(GetUtils.capitalize(name)!, 45 | style: Theme.of(Get.context!).textTheme.headline6); 46 | } 47 | 48 | Widget _categoryText(String category) { 49 | return Text( 50 | GetUtils.capitalize(category)!, 51 | style: TextStyle(color: Colors.grey), 52 | ); 53 | } 54 | 55 | Widget _ratingAndTotalDownload() { 56 | return Row( 57 | children: [ 58 | Icon( 59 | Icons.star, 60 | color: Colors.amber, 61 | size: 20, 62 | ), 63 | SizedBox(width: 2), 64 | Text( 65 | controller.product.rating.toString(), 66 | style: TextStyle(fontSize: 12, fontWeight: FontWeight.bold), 67 | ), 68 | SizedBox(width: 20), 69 | Icon( 70 | Icons.download_rounded, 71 | color: Colors.redAccent, 72 | size: 20, 73 | ), 74 | SizedBox(width: 2), 75 | Text( 76 | controller.product.totalDownload.toString(), 77 | style: TextStyle(fontSize: 12, fontWeight: FontWeight.bold), 78 | ) 79 | ], 80 | ); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/app/shared_components/custom_icon_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | class CustomIconButton extends StatelessWidget { 5 | const CustomIconButton( 6 | {required this.icon, 7 | required this.label, 8 | required this.onPressed, 9 | this.primary, 10 | this.onPrimary, 11 | Key? key}) 12 | : super(key: key); 13 | 14 | final IconData icon; 15 | final String label; 16 | final Function() onPressed; 17 | final Color? primary; 18 | final Color? onPrimary; 19 | 20 | final double _borderRadius = 15; 21 | 22 | @override 23 | Widget build(BuildContext context) { 24 | final _defaultPrimary = Theme.of(context).buttonColor; 25 | final _defaultOnPrimary = Colors.white; 26 | 27 | return SizedBox( 28 | width: 70, 29 | child: Column( 30 | children: [ 31 | _background( 32 | color: primary ?? _defaultPrimary, 33 | child: _iconButton(color: onPrimary ?? _defaultOnPrimary), 34 | ), 35 | SizedBox(height: 8), 36 | _labelText(), 37 | ], 38 | ), 39 | ); 40 | } 41 | 42 | Widget _background({required Widget child, required Color color}) { 43 | return Container( 44 | decoration: BoxDecoration( 45 | gradient: LinearGradient( 46 | colors: [color.withOpacity(.8), color], 47 | begin: Alignment.topCenter, 48 | end: Alignment.bottomCenter, 49 | ), 50 | borderRadius: BorderRadius.circular(_borderRadius), 51 | ), 52 | child: child, 53 | ); 54 | } 55 | 56 | Widget _iconButton({required Color color}) { 57 | return Material( 58 | color: Colors.transparent, 59 | child: InkWell( 60 | borderRadius: BorderRadius.circular(_borderRadius), 61 | child: Padding( 62 | padding: const EdgeInsets.all(12), 63 | child: Icon( 64 | icon, 65 | size: 28, 66 | color: color, 67 | ), 68 | ), 69 | onTap: onPressed, 70 | highlightColor: color.withOpacity(.1), 71 | overlayColor: MaterialStateProperty.all( 72 | color.withOpacity(.3), 73 | ), 74 | ), 75 | ); 76 | } 77 | 78 | Widget _labelText() { 79 | return Text( 80 | GetUtils.capitalizeFirst(label)!, 81 | style: TextStyle(fontWeight: FontWeight.w500), 82 | textAlign: TextAlign.center, 83 | maxLines: 1, 84 | overflow: TextOverflow.ellipsis, 85 | ); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /lib/app/features/dashboard/index/views/screens/dashboard_screen.dart: -------------------------------------------------------------------------------- 1 | library dashboard; 2 | 3 | import 'dart:ui'; 4 | 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_svg/flutter_svg.dart'; 7 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 8 | import 'package:game_store/app/config/routes/app_pages.dart'; 9 | import 'package:game_store/app/constans/app_constants.dart'; 10 | import 'package:game_store/app/shared_components/card_image.dart'; 11 | import 'package:game_store/app/shared_components/card_product.dart'; 12 | import 'package:game_store/app/shared_components/custom_icon_button.dart'; 13 | import 'package:game_store/app/utils/services/rest_api_service.dart'; 14 | import 'package:get/get.dart'; 15 | 16 | // bindings 17 | part '../../bindings/dashboard_binding.dart'; 18 | 19 | // controllers 20 | part '../../controllers/dashboard_controller.dart'; 21 | 22 | // components 23 | part '../components/background_content.dart'; 24 | part '../components/background_image.dart'; 25 | part '../components/bottom_navbar.dart'; 26 | part '../components/category_buttons.dart'; 27 | part '../components/header.dart'; 28 | part '../components/newest_game.dart'; 29 | part '../components/popular_game.dart'; 30 | part '../components/search_text_field.dart'; 31 | 32 | class DashboardScreen extends StatelessWidget { 33 | const DashboardScreen({Key? key}) : super(key: key); 34 | 35 | @override 36 | Widget build(BuildContext context) { 37 | return Scaffold( 38 | extendBodyBehindAppBar: true, 39 | body: Stack( 40 | children: [ 41 | _BackgroundImage(), 42 | SingleChildScrollView( 43 | scrollDirection: Axis.vertical, 44 | child: Column( 45 | children: [ 46 | SizedBox(height: 50), 47 | _Header(), 48 | SizedBox(height: 30), 49 | _SearchTextField(), 50 | SizedBox(height: 30), 51 | _BackgroundContent( 52 | child: Column( 53 | children: [ 54 | SizedBox(height: 30), 55 | _CategoryButtons(), 56 | SizedBox(height: 30), 57 | _PopularGame(), 58 | SizedBox(height: 30), 59 | _NewestGame(), 60 | SizedBox(height: 30), 61 | ], 62 | ), 63 | ) 64 | ], 65 | ), 66 | ), 67 | ], 68 | ), 69 | bottomNavigationBar: _BottomNavbar(), 70 | ); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /lib/app/shared_components/card_product.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:game_store/app/constans/app_constants.dart'; 3 | import 'package:game_store/app/shared_components/rating_icon.dart'; 4 | import 'package:get/get.dart'; 5 | import 'package:game_store/app/utils/ui/ui_utils.dart'; 6 | 7 | class CardProduct extends StatelessWidget { 8 | const CardProduct({required this.data, required this.onPressed, Key? key}) 9 | : super(key: key); 10 | final CardProductData data; 11 | final Function() onPressed; 12 | final _borderRadius = 15.0; 13 | @override 14 | Widget build(BuildContext context) { 15 | return Material( 16 | color: Colors.white, 17 | borderRadius: BorderRadius.circular(_borderRadius), 18 | child: InkWell( 19 | borderRadius: BorderRadius.circular(_borderRadius), 20 | onTap: onPressed, 21 | child: Padding( 22 | padding: const EdgeInsets.symmetric( 23 | horizontal: kDefaultPadding, vertical: kDefaultPadding / 2), 24 | child: Row( 25 | children: [ 26 | _iconImage(data.image), 27 | SizedBox(width: 10), 28 | Expanded( 29 | child: Column( 30 | crossAxisAlignment: CrossAxisAlignment.start, 31 | children: [ 32 | SizedBox(height: 10), 33 | _nameText(data.name), 34 | _categoryText(data.category), 35 | _ratingAndInstallButton(), 36 | ], 37 | ), 38 | ), 39 | ], 40 | ), 41 | ), 42 | ), 43 | ); 44 | } 45 | 46 | Widget _iconImage(ImageProvider image) { 47 | return SizedBox( 48 | width: 70, 49 | height: 70, 50 | child: ClipRRect( 51 | borderRadius: BorderRadius.circular(10), 52 | child: Image(image: image), 53 | ), 54 | ); 55 | } 56 | 57 | Widget _nameText(String name) { 58 | return Text( 59 | GetUtils.capitalize(name)!, 60 | style: TextStyle( 61 | fontSize: 16, 62 | fontWeight: FontWeight.w500, 63 | ), 64 | ); 65 | } 66 | 67 | Widget _categoryText(String category) { 68 | return Text( 69 | GetUtils.capitalize(category)!, 70 | style: TextStyle(color: Colors.grey), 71 | ); 72 | } 73 | 74 | Widget _ratingAndInstallButton() { 75 | return Row( 76 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 77 | children: [ 78 | RatingIcon( 79 | rating: data.rating, 80 | size: 15, 81 | ), 82 | ElevatedButton( 83 | onPressed: () {}, 84 | child: Text("Install"), 85 | ).small() 86 | ], 87 | ); 88 | } 89 | } 90 | 91 | class CardProductData { 92 | final ImageProvider image; 93 | final String name; 94 | final String category; 95 | final double rating; 96 | 97 | CardProductData({ 98 | required this.image, 99 | required this.name, 100 | required this.category, 101 | required this.rating, 102 | }); 103 | } 104 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: game_store 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.12.0 <3.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | cupertino_icons: ^1.0.2 27 | flutter_svg: ^0.22.0 28 | font_awesome_flutter: ^9.1.0 29 | get: ^4.1.4 30 | lottie: ^1.0.1 31 | readmore: ^2.1.0 32 | 33 | dev_dependencies: 34 | flutter_test: 35 | sdk: flutter 36 | flutter_launcher_icons: "^0.9.0" 37 | 38 | flutter_icons: 39 | android: true 40 | ios: true 41 | image_path: "assets/images/raster/logo-gia-developer.png" 42 | # For information on the generic Dart part of this file, see the 43 | # following page: https://dart.dev/tools/pub/pubspec 44 | # The following section is specific to Flutter. 45 | flutter: 46 | 47 | # The following line ensures that the Material Icons font is 48 | # included with your application, so that you can use the icons in 49 | # the material Icons class. 50 | uses-material-design: true 51 | # To add assets to your application, add an assets section, like this: 52 | assets: 53 | - assets/images/raster/. 54 | - assets/images/vector/. 55 | - assets/images/animation/. 56 | - assets/images/raster/ori blind forest/. 57 | - assets/images/raster/rayman legends/. 58 | # - images/a_dot_ham.jpeg 59 | # An image asset can refer to one or more resolution-specific "variants", see 60 | # https://flutter.dev/assets-and-images/#resolution-aware. 61 | # For details regarding adding assets from package dependencies, see 62 | # https://flutter.dev/assets-and-images/#from-packages 63 | # To add custom fonts to your application, add a fonts section here, 64 | # in this "flutter" section. Each entry in this list should have a 65 | # "family" key with the font family name, and a "fonts" key with a 66 | # list giving the asset and other descriptors for the font. For 67 | # example: 68 | # fonts: 69 | # - family: Schyler 70 | # fonts: 71 | # - asset: fonts/Schyler-Regular.ttf 72 | # - asset: fonts/Schyler-Italic.ttf 73 | # style: italic 74 | # - family: Trajan Pro 75 | # fonts: 76 | # - asset: fonts/TrajanPro.ttf 77 | # - asset: fonts/TrajanPro_Bold.ttf 78 | # weight: 700 79 | # 80 | # For details regarding fonts from package dependencies, 81 | # see https://flutter.dev/custom-fonts/#from-packages 82 | -------------------------------------------------------------------------------- /lib/app/utils/services/product_service.dart: -------------------------------------------------------------------------------- 1 | part of rest_api; 2 | 3 | class ProductService { 4 | static final ProductService _productService = ProductService._internal(); 5 | 6 | factory ProductService() { 7 | return _productService; 8 | } 9 | 10 | ProductService._internal(); 11 | 12 | List getPopularGame() { 13 | return [ 14 | _oriAndTheBlindForest, 15 | _raymanLegends, 16 | ]; 17 | } 18 | 19 | List getNewestGame() { 20 | return [_oriAndTheBlindForest]; 21 | } 22 | } 23 | 24 | class Product { 25 | final int id; 26 | final ImageProvider iconImage; 27 | final ImageProvider backgroundImage; 28 | final List screenshotImages; 29 | final String name; 30 | final String category; 31 | final String description; 32 | final double rating; 33 | final int totalDownload; 34 | final int totalReview; 35 | 36 | Product({ 37 | required this.id, 38 | required this.iconImage, 39 | required this.backgroundImage, 40 | required this.screenshotImages, 41 | required this.name, 42 | required this.category, 43 | required this.description, 44 | required this.rating, 45 | required this.totalDownload, 46 | required this.totalReview, 47 | }); 48 | } 49 | 50 | //sample data 51 | final _oriAndTheBlindForest = Product( 52 | id: 0, 53 | iconImage: AssetImage(ImageRaster.oriBlindForestIcon), 54 | backgroundImage: AssetImage(ImageRaster.oriBlindForest1), 55 | screenshotImages: [ 56 | AssetImage(ImageRaster.oriBlindForest2), 57 | AssetImage(ImageRaster.oriBlindForest3), 58 | AssetImage(ImageRaster.oriBlindForest4), 59 | AssetImage(ImageRaster.oriBlindForest5), 60 | ], 61 | name: "ori and the blind forest", 62 | category: "adventure", 63 | description: 64 | "The forest of Nibel is dying. After a powerful storm sets a series of devastating events in motion, an unlikely hero must journey to find his courage and confront a dark nemesis to save his home. “Ori and the Blind Forest” tells the tale of a young orphan destined for heroics, through a visually stunning action-platformer crafted by Moon Studios for PC. Featuring hand-painted artwork, meticulously animated character performance, and a fully orchestrated score, “Ori and the Blind Forest” explores a deeply emotional story about love and sacrifice, and the hope that exists in us all. ", 65 | rating: 4.7, 66 | totalDownload: 300, 67 | totalReview: 15); 68 | 69 | final _raymanLegends = Product( 70 | id: 1, 71 | iconImage: AssetImage(ImageRaster.raymandLegendIcon), 72 | backgroundImage: AssetImage(ImageRaster.raymandLegend1), 73 | screenshotImages: [ 74 | AssetImage(ImageRaster.raymandLegend2), 75 | AssetImage(ImageRaster.raymandLegend3), 76 | AssetImage(ImageRaster.raymandLegend4), 77 | AssetImage(ImageRaster.raymandLegend5), 78 | ], 79 | name: "rayman legends", 80 | category: "action", 81 | description: 82 | "Michel Ancel, the celebrated creator of Rayman®, Beyond Good & Evil®, and the Raving Rabbids®, returns to unleash his innovative creativity on this new entry into the Rayman® franchise.\n When Rayman, Globox, and the Teensies discover a mysterious tent filled with captivating paintings, they are suddenly transported to a series of mythical new worlds! \n Join them as they run, jump, and slap their way through each world to get home, save the day, and discover the secrets of the legendary paintings!", 83 | rating: 3.7, 84 | totalDownload: 500, 85 | totalReview: 300); 86 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "3.1.2" 11 | args: 12 | dependency: transitive 13 | description: 14 | name: args 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.0.0" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.6.1" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.1.0" 32 | characters: 33 | dependency: transitive 34 | description: 35 | name: characters 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.0" 39 | charcode: 40 | dependency: transitive 41 | description: 42 | name: charcode 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.2.0" 46 | clock: 47 | dependency: transitive 48 | description: 49 | name: clock 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.1.0" 53 | collection: 54 | dependency: transitive 55 | description: 56 | name: collection 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.15.0" 60 | crypto: 61 | dependency: transitive 62 | description: 63 | name: crypto 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "3.0.1" 67 | cupertino_icons: 68 | dependency: "direct main" 69 | description: 70 | name: cupertino_icons 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "1.0.3" 74 | fake_async: 75 | dependency: transitive 76 | description: 77 | name: fake_async 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.2.0" 81 | flutter: 82 | dependency: "direct main" 83 | description: flutter 84 | source: sdk 85 | version: "0.0.0" 86 | flutter_launcher_icons: 87 | dependency: "direct dev" 88 | description: 89 | name: flutter_launcher_icons 90 | url: "https://pub.dartlang.org" 91 | source: hosted 92 | version: "0.9.0" 93 | flutter_svg: 94 | dependency: "direct main" 95 | description: 96 | name: flutter_svg 97 | url: "https://pub.dartlang.org" 98 | source: hosted 99 | version: "0.22.0" 100 | flutter_test: 101 | dependency: "direct dev" 102 | description: flutter 103 | source: sdk 104 | version: "0.0.0" 105 | font_awesome_flutter: 106 | dependency: "direct main" 107 | description: 108 | name: font_awesome_flutter 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "9.1.0" 112 | get: 113 | dependency: "direct main" 114 | description: 115 | name: get 116 | url: "https://pub.dartlang.org" 117 | source: hosted 118 | version: "4.1.4" 119 | image: 120 | dependency: transitive 121 | description: 122 | name: image 123 | url: "https://pub.dartlang.org" 124 | source: hosted 125 | version: "3.0.2" 126 | logging: 127 | dependency: transitive 128 | description: 129 | name: logging 130 | url: "https://pub.dartlang.org" 131 | source: hosted 132 | version: "1.0.1" 133 | lottie: 134 | dependency: "direct main" 135 | description: 136 | name: lottie 137 | url: "https://pub.dartlang.org" 138 | source: hosted 139 | version: "1.0.1" 140 | matcher: 141 | dependency: transitive 142 | description: 143 | name: matcher 144 | url: "https://pub.dartlang.org" 145 | source: hosted 146 | version: "0.12.10" 147 | meta: 148 | dependency: transitive 149 | description: 150 | name: meta 151 | url: "https://pub.dartlang.org" 152 | source: hosted 153 | version: "1.3.0" 154 | path: 155 | dependency: transitive 156 | description: 157 | name: path 158 | url: "https://pub.dartlang.org" 159 | source: hosted 160 | version: "1.8.0" 161 | path_drawing: 162 | dependency: transitive 163 | description: 164 | name: path_drawing 165 | url: "https://pub.dartlang.org" 166 | source: hosted 167 | version: "0.5.1" 168 | path_parsing: 169 | dependency: transitive 170 | description: 171 | name: path_parsing 172 | url: "https://pub.dartlang.org" 173 | source: hosted 174 | version: "0.2.1" 175 | petitparser: 176 | dependency: transitive 177 | description: 178 | name: petitparser 179 | url: "https://pub.dartlang.org" 180 | source: hosted 181 | version: "4.1.0" 182 | readmore: 183 | dependency: "direct main" 184 | description: 185 | name: readmore 186 | url: "https://pub.dartlang.org" 187 | source: hosted 188 | version: "2.1.0" 189 | sky_engine: 190 | dependency: transitive 191 | description: flutter 192 | source: sdk 193 | version: "0.0.99" 194 | source_span: 195 | dependency: transitive 196 | description: 197 | name: source_span 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "1.8.1" 201 | stack_trace: 202 | dependency: transitive 203 | description: 204 | name: stack_trace 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "1.10.0" 208 | stream_channel: 209 | dependency: transitive 210 | description: 211 | name: stream_channel 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "2.1.0" 215 | string_scanner: 216 | dependency: transitive 217 | description: 218 | name: string_scanner 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "1.1.0" 222 | term_glyph: 223 | dependency: transitive 224 | description: 225 | name: term_glyph 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "1.2.0" 229 | test_api: 230 | dependency: transitive 231 | description: 232 | name: test_api 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "0.3.0" 236 | typed_data: 237 | dependency: transitive 238 | description: 239 | name: typed_data 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "1.3.0" 243 | vector_math: 244 | dependency: transitive 245 | description: 246 | name: vector_math 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "2.1.0" 250 | xml: 251 | dependency: transitive 252 | description: 253 | name: xml 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "5.1.2" 257 | yaml: 258 | dependency: transitive 259 | description: 260 | name: yaml 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "3.1.0" 264 | sdks: 265 | dart: ">=2.12.0 <3.0.0" 266 | flutter: ">=1.24.0-7.0" 267 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1020; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = ""; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = ""; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | ENABLE_BITCODE = NO; 292 | INFOPLIST_FILE = Runner/Info.plist; 293 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 294 | PRODUCT_BUNDLE_IDENTIFIER = com.gia.game_store; 295 | PRODUCT_NAME = "$(TARGET_NAME)"; 296 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 297 | SWIFT_VERSION = 5.0; 298 | VERSIONING_SYSTEM = "apple-generic"; 299 | }; 300 | name = Profile; 301 | }; 302 | 97C147031CF9000F007C117D /* Debug */ = { 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; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | ENABLE_TESTABILITY = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_DYNAMIC_NO_PIC = NO; 337 | GCC_NO_COMMON_BLOCKS = YES; 338 | GCC_OPTIMIZATION_LEVEL = 0; 339 | GCC_PREPROCESSOR_DEFINITIONS = ( 340 | "DEBUG=1", 341 | "$(inherited)", 342 | ); 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNDECLARED_SELECTOR = YES; 346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 | GCC_WARN_UNUSED_FUNCTION = YES; 348 | GCC_WARN_UNUSED_VARIABLE = YES; 349 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 350 | MTL_ENABLE_DEBUG_INFO = YES; 351 | ONLY_ACTIVE_ARCH = YES; 352 | SDKROOT = iphoneos; 353 | TARGETED_DEVICE_FAMILY = "1,2"; 354 | }; 355 | name = Debug; 356 | }; 357 | 97C147041CF9000F007C117D /* Release */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | ALWAYS_SEARCH_USER_PATHS = NO; 361 | CLANG_ANALYZER_NONNULL = YES; 362 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 363 | CLANG_CXX_LIBRARY = "libc++"; 364 | CLANG_ENABLE_MODULES = YES; 365 | CLANG_ENABLE_OBJC_ARC = YES; 366 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 367 | CLANG_WARN_BOOL_CONVERSION = YES; 368 | CLANG_WARN_COMMA = YES; 369 | CLANG_WARN_CONSTANT_CONVERSION = YES; 370 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 371 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 372 | CLANG_WARN_EMPTY_BODY = YES; 373 | CLANG_WARN_ENUM_CONVERSION = YES; 374 | CLANG_WARN_INFINITE_RECURSION = YES; 375 | CLANG_WARN_INT_CONVERSION = YES; 376 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 377 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 378 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 379 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 381 | CLANG_WARN_STRICT_PROTOTYPES = YES; 382 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 383 | CLANG_WARN_UNREACHABLE_CODE = YES; 384 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 385 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 386 | COPY_PHASE_STRIP = NO; 387 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 388 | ENABLE_NS_ASSERTIONS = NO; 389 | ENABLE_STRICT_OBJC_MSGSEND = YES; 390 | GCC_C_LANGUAGE_STANDARD = gnu99; 391 | GCC_NO_COMMON_BLOCKS = YES; 392 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 393 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 394 | GCC_WARN_UNDECLARED_SELECTOR = YES; 395 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 396 | GCC_WARN_UNUSED_FUNCTION = YES; 397 | GCC_WARN_UNUSED_VARIABLE = YES; 398 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 399 | MTL_ENABLE_DEBUG_INFO = NO; 400 | SDKROOT = iphoneos; 401 | SUPPORTED_PLATFORMS = iphoneos; 402 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 403 | TARGETED_DEVICE_FAMILY = "1,2"; 404 | VALIDATE_PRODUCT = YES; 405 | }; 406 | name = Release; 407 | }; 408 | 97C147061CF9000F007C117D /* Debug */ = { 409 | isa = XCBuildConfiguration; 410 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 411 | buildSettings = { 412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 413 | CLANG_ENABLE_MODULES = YES; 414 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 415 | ENABLE_BITCODE = NO; 416 | INFOPLIST_FILE = Runner/Info.plist; 417 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 418 | PRODUCT_BUNDLE_IDENTIFIER = com.gia.game_store; 419 | PRODUCT_NAME = "$(TARGET_NAME)"; 420 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 421 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 422 | SWIFT_VERSION = 5.0; 423 | VERSIONING_SYSTEM = "apple-generic"; 424 | }; 425 | name = Debug; 426 | }; 427 | 97C147071CF9000F007C117D /* Release */ = { 428 | isa = XCBuildConfiguration; 429 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 430 | buildSettings = { 431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 432 | CLANG_ENABLE_MODULES = YES; 433 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 434 | ENABLE_BITCODE = NO; 435 | INFOPLIST_FILE = Runner/Info.plist; 436 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 437 | PRODUCT_BUNDLE_IDENTIFIER = com.gia.game_store; 438 | PRODUCT_NAME = "$(TARGET_NAME)"; 439 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 440 | SWIFT_VERSION = 5.0; 441 | VERSIONING_SYSTEM = "apple-generic"; 442 | }; 443 | name = Release; 444 | }; 445 | /* End XCBuildConfiguration section */ 446 | 447 | /* Begin XCConfigurationList section */ 448 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 449 | isa = XCConfigurationList; 450 | buildConfigurations = ( 451 | 97C147031CF9000F007C117D /* Debug */, 452 | 97C147041CF9000F007C117D /* Release */, 453 | 249021D3217E4FDB00AE95B9 /* Profile */, 454 | ); 455 | defaultConfigurationIsVisible = 0; 456 | defaultConfigurationName = Release; 457 | }; 458 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 459 | isa = XCConfigurationList; 460 | buildConfigurations = ( 461 | 97C147061CF9000F007C117D /* Debug */, 462 | 97C147071CF9000F007C117D /* Release */, 463 | 249021D4217E4FDB00AE95B9 /* Profile */, 464 | ); 465 | defaultConfigurationIsVisible = 0; 466 | defaultConfigurationName = Release; 467 | }; 468 | /* End XCConfigurationList section */ 469 | }; 470 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 471 | } --------------------------------------------------------------------------------