├── 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 | 
8 | 
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 | }
--------------------------------------------------------------------------------