├── .gitignore
├── .metadata
├── README.md
├── android
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── booksapp
│ │ │ │ └── MainActivity.java
│ │ └── res
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── fonts
└── lovelo.ttf
├── ios
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ └── contents.xcworkspacedata
└── Runner
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ └── main.m
├── lib
├── details.dart
├── main.dart
└── models
│ └── book.dart
├── pubspec.lock
├── pubspec.yaml
├── screenshots
├── first_page.jpeg
└── second_page.jpeg
└── test
└── widget_test.dart
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # Visual Studio Code related
19 | .vscode/
20 |
21 | # Flutter/Dart/Pub related
22 | **/doc/api/
23 | .dart_tool/
24 | .flutter-plugins
25 | .packages
26 | .pub-cache/
27 | .pub/
28 | /build/
29 |
30 | # Android related
31 | **/android/**/gradle-wrapper.jar
32 | **/android/.gradle
33 | **/android/captures/
34 | **/android/gradlew
35 | **/android/gradlew.bat
36 | **/android/local.properties
37 | **/android/**/GeneratedPluginRegistrant.java
38 |
39 | # iOS/XCode related
40 | **/ios/**/*.mode1v3
41 | **/ios/**/*.mode2v3
42 | **/ios/**/*.moved-aside
43 | **/ios/**/*.pbxuser
44 | **/ios/**/*.perspectivev3
45 | **/ios/**/*sync/
46 | **/ios/**/.sconsign.dblite
47 | **/ios/**/.tags*
48 | **/ios/**/.vagrant/
49 | **/ios/**/DerivedData/
50 | **/ios/**/Icon?
51 | **/ios/**/Pods/
52 | **/ios/**/.symlinks/
53 | **/ios/**/profile
54 | **/ios/**/xcuserdata
55 | **/ios/.generated/
56 | **/ios/Flutter/App.framework
57 | **/ios/Flutter/Flutter.framework
58 | **/ios/Flutter/Generated.xcconfig
59 | **/ios/Flutter/app.flx
60 | **/ios/Flutter/app.zip
61 | **/ios/Flutter/flutter_assets/
62 | **/ios/ServiceDefinitions.json
63 | **/ios/Runner/GeneratedPluginRegistrant.*
64 |
65 | # Exceptions to above rules.
66 | !**/ios/**/default.mode1v3
67 | !**/ios/**/default.mode2v3
68 | !**/ios/**/default.pbxuser
69 | !**/ios/**/default.perspectivev3
70 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
71 |
--------------------------------------------------------------------------------
/.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: 8661d8aecd626f7f57ccbcb735553edc05a2e713
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Flutter Speed Coding - BOOKS APP UI
2 | This repository hosts the complete code of the demo flutter app that I built, recorded and published the recording on youtube.
3 |
4 | [Watch the video](https://youtu.be/trbJ9cNLAHk)
5 |
6 | ## Branches
7 |
8 | Master branch has the complete code for the app.
9 |
10 | If you want the code for the first part, check out the Part-1 branch.
11 |
12 | ## Screenshots
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
26 |
27 | android {
28 | compileSdkVersion 28
29 |
30 | lintOptions {
31 | disable 'InvalidPackage'
32 | }
33 |
34 | defaultConfig {
35 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
36 | applicationId "com.example.booksapp"
37 | minSdkVersion 16
38 | targetSdkVersion 28
39 | versionCode flutterVersionCode.toInteger()
40 | versionName flutterVersionName
41 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
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 | testImplementation 'junit:junit:4.12'
59 | androidTestImplementation 'com.android.support.test:runner:1.0.2'
60 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
61 | }
62 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
9 |
13 |
20 |
24 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/booksapp/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.booksapp;
2 |
3 | import android.os.Bundle;
4 | import io.flutter.app.FlutterActivity;
5 | import io.flutter.plugins.GeneratedPluginRegistrant;
6 |
7 | public class MainActivity extends FlutterActivity {
8 | @Override
9 | protected void onCreate(Bundle savedInstanceState) {
10 | super.onCreate(savedInstanceState);
11 | GeneratedPluginRegistrant.registerWith(this);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | repositories {
3 | google()
4 | jcenter()
5 | }
6 |
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:3.2.1'
9 | }
10 | }
11 |
12 | allprojects {
13 | repositories {
14 | google()
15 | jcenter()
16 | }
17 | }
18 |
19 | rootProject.buildDir = '../build'
20 | subprojects {
21 | project.buildDir = "${rootProject.buildDir}/${project.name}"
22 | }
23 | subprojects {
24 | project.evaluationDependsOn(':app')
25 | }
26 |
27 | task clean(type: Delete) {
28 | delete rootProject.buildDir
29 | }
30 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 |
--------------------------------------------------------------------------------
/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-4.10.2-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/fonts/lovelo.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/fonts/lovelo.ttf
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
13 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
14 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
15 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
16 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };
17 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
18 | 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
19 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
20 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
21 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
22 | /* End PBXBuildFile section */
23 |
24 | /* Begin PBXCopyFilesBuildPhase section */
25 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
26 | isa = PBXCopyFilesBuildPhase;
27 | buildActionMask = 2147483647;
28 | dstPath = "";
29 | dstSubfolderSpec = 10;
30 | files = (
31 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
32 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
33 | );
34 | name = "Embed Frameworks";
35 | runOnlyForDeploymentPostprocessing = 0;
36 | };
37 | /* End PBXCopyFilesBuildPhase section */
38 |
39 | /* Begin PBXFileReference section */
40 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
41 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
42 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
43 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; };
44 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
45 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
46 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
47 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
48 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
49 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; };
50 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
51 | 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
52 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
53 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
54 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
55 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
56 | /* End PBXFileReference section */
57 |
58 | /* Begin PBXFrameworksBuildPhase section */
59 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
60 | isa = PBXFrameworksBuildPhase;
61 | buildActionMask = 2147483647;
62 | files = (
63 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
64 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
65 | );
66 | runOnlyForDeploymentPostprocessing = 0;
67 | };
68 | /* End PBXFrameworksBuildPhase section */
69 |
70 | /* Begin PBXGroup section */
71 | 9740EEB11CF90186004384FC /* Flutter */ = {
72 | isa = PBXGroup;
73 | children = (
74 | 3B80C3931E831B6300D905FE /* App.framework */,
75 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
76 | 9740EEBA1CF902C7004384FC /* Flutter.framework */,
77 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
78 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
79 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
80 | );
81 | name = Flutter;
82 | sourceTree = "";
83 | };
84 | 97C146E51CF9000F007C117D = {
85 | isa = PBXGroup;
86 | children = (
87 | 9740EEB11CF90186004384FC /* Flutter */,
88 | 97C146F01CF9000F007C117D /* Runner */,
89 | 97C146EF1CF9000F007C117D /* Products */,
90 | CF3B75C9A7D2FA2A4C99F110 /* Frameworks */,
91 | );
92 | sourceTree = "";
93 | };
94 | 97C146EF1CF9000F007C117D /* Products */ = {
95 | isa = PBXGroup;
96 | children = (
97 | 97C146EE1CF9000F007C117D /* Runner.app */,
98 | );
99 | name = Products;
100 | sourceTree = "";
101 | };
102 | 97C146F01CF9000F007C117D /* Runner */ = {
103 | isa = PBXGroup;
104 | children = (
105 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
106 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
107 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
108 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
109 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
110 | 97C147021CF9000F007C117D /* Info.plist */,
111 | 97C146F11CF9000F007C117D /* Supporting Files */,
112 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
113 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
114 | );
115 | path = Runner;
116 | sourceTree = "";
117 | };
118 | 97C146F11CF9000F007C117D /* Supporting Files */ = {
119 | isa = PBXGroup;
120 | children = (
121 | 97C146F21CF9000F007C117D /* main.m */,
122 | );
123 | name = "Supporting Files";
124 | sourceTree = "";
125 | };
126 | /* End PBXGroup section */
127 |
128 | /* Begin PBXNativeTarget section */
129 | 97C146ED1CF9000F007C117D /* Runner */ = {
130 | isa = PBXNativeTarget;
131 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
132 | buildPhases = (
133 | 9740EEB61CF901F6004384FC /* Run Script */,
134 | 97C146EA1CF9000F007C117D /* Sources */,
135 | 97C146EB1CF9000F007C117D /* Frameworks */,
136 | 97C146EC1CF9000F007C117D /* Resources */,
137 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
138 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
139 | );
140 | buildRules = (
141 | );
142 | dependencies = (
143 | );
144 | name = Runner;
145 | productName = Runner;
146 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
147 | productType = "com.apple.product-type.application";
148 | };
149 | /* End PBXNativeTarget section */
150 |
151 | /* Begin PBXProject section */
152 | 97C146E61CF9000F007C117D /* Project object */ = {
153 | isa = PBXProject;
154 | attributes = {
155 | LastUpgradeCheck = 0910;
156 | ORGANIZATIONNAME = "The Chromium Authors";
157 | TargetAttributes = {
158 | 97C146ED1CF9000F007C117D = {
159 | CreatedOnToolsVersion = 7.3.1;
160 | };
161 | };
162 | };
163 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
164 | compatibilityVersion = "Xcode 3.2";
165 | developmentRegion = English;
166 | hasScannedForEncodings = 0;
167 | knownRegions = (
168 | en,
169 | Base,
170 | );
171 | mainGroup = 97C146E51CF9000F007C117D;
172 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
173 | projectDirPath = "";
174 | projectRoot = "";
175 | targets = (
176 | 97C146ED1CF9000F007C117D /* Runner */,
177 | );
178 | };
179 | /* End PBXProject section */
180 |
181 | /* Begin PBXResourcesBuildPhase section */
182 | 97C146EC1CF9000F007C117D /* Resources */ = {
183 | isa = PBXResourcesBuildPhase;
184 | buildActionMask = 2147483647;
185 | files = (
186 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
187 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
188 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,
189 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
190 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
191 | );
192 | runOnlyForDeploymentPostprocessing = 0;
193 | };
194 | /* End PBXResourcesBuildPhase section */
195 |
196 | /* Begin PBXShellScriptBuildPhase section */
197 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
198 | isa = PBXShellScriptBuildPhase;
199 | buildActionMask = 2147483647;
200 | files = (
201 | );
202 | inputPaths = (
203 | );
204 | name = "Thin Binary";
205 | outputPaths = (
206 | );
207 | runOnlyForDeploymentPostprocessing = 0;
208 | shellPath = /bin/sh;
209 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
210 | };
211 | 9740EEB61CF901F6004384FC /* Run Script */ = {
212 | isa = PBXShellScriptBuildPhase;
213 | buildActionMask = 2147483647;
214 | files = (
215 | );
216 | inputPaths = (
217 | );
218 | name = "Run Script";
219 | outputPaths = (
220 | );
221 | runOnlyForDeploymentPostprocessing = 0;
222 | shellPath = /bin/sh;
223 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
224 | };
225 | /* End PBXShellScriptBuildPhase section */
226 |
227 | /* Begin PBXSourcesBuildPhase section */
228 | 97C146EA1CF9000F007C117D /* Sources */ = {
229 | isa = PBXSourcesBuildPhase;
230 | buildActionMask = 2147483647;
231 | files = (
232 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,
233 | 97C146F31CF9000F007C117D /* main.m in Sources */,
234 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
235 | );
236 | runOnlyForDeploymentPostprocessing = 0;
237 | };
238 | /* End PBXSourcesBuildPhase section */
239 |
240 | /* Begin PBXVariantGroup section */
241 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
242 | isa = PBXVariantGroup;
243 | children = (
244 | 97C146FB1CF9000F007C117D /* Base */,
245 | );
246 | name = Main.storyboard;
247 | sourceTree = "";
248 | };
249 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
250 | isa = PBXVariantGroup;
251 | children = (
252 | 97C147001CF9000F007C117D /* Base */,
253 | );
254 | name = LaunchScreen.storyboard;
255 | sourceTree = "";
256 | };
257 | /* End PBXVariantGroup section */
258 |
259 | /* Begin XCBuildConfiguration section */
260 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
261 | isa = XCBuildConfiguration;
262 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
263 | buildSettings = {
264 | ALWAYS_SEARCH_USER_PATHS = NO;
265 | CLANG_ANALYZER_NONNULL = YES;
266 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
267 | CLANG_CXX_LIBRARY = "libc++";
268 | CLANG_ENABLE_MODULES = YES;
269 | CLANG_ENABLE_OBJC_ARC = YES;
270 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
271 | CLANG_WARN_BOOL_CONVERSION = YES;
272 | CLANG_WARN_COMMA = YES;
273 | CLANG_WARN_CONSTANT_CONVERSION = YES;
274 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
275 | CLANG_WARN_EMPTY_BODY = YES;
276 | CLANG_WARN_ENUM_CONVERSION = YES;
277 | CLANG_WARN_INFINITE_RECURSION = YES;
278 | CLANG_WARN_INT_CONVERSION = YES;
279 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
280 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
281 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
282 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
283 | CLANG_WARN_STRICT_PROTOTYPES = YES;
284 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
285 | CLANG_WARN_UNREACHABLE_CODE = YES;
286 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
287 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
288 | COPY_PHASE_STRIP = NO;
289 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
290 | ENABLE_NS_ASSERTIONS = NO;
291 | ENABLE_STRICT_OBJC_MSGSEND = YES;
292 | GCC_C_LANGUAGE_STANDARD = gnu99;
293 | GCC_NO_COMMON_BLOCKS = YES;
294 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
295 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
296 | GCC_WARN_UNDECLARED_SELECTOR = YES;
297 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
298 | GCC_WARN_UNUSED_FUNCTION = YES;
299 | GCC_WARN_UNUSED_VARIABLE = YES;
300 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
301 | MTL_ENABLE_DEBUG_INFO = NO;
302 | SDKROOT = iphoneos;
303 | TARGETED_DEVICE_FAMILY = "1,2";
304 | VALIDATE_PRODUCT = YES;
305 | };
306 | name = Profile;
307 | };
308 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
309 | isa = XCBuildConfiguration;
310 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
311 | buildSettings = {
312 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
313 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
314 | DEVELOPMENT_TEAM = S8QB4VV633;
315 | ENABLE_BITCODE = NO;
316 | FRAMEWORK_SEARCH_PATHS = (
317 | "$(inherited)",
318 | "$(PROJECT_DIR)/Flutter",
319 | );
320 | INFOPLIST_FILE = Runner/Info.plist;
321 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
322 | LIBRARY_SEARCH_PATHS = (
323 | "$(inherited)",
324 | "$(PROJECT_DIR)/Flutter",
325 | );
326 | PRODUCT_BUNDLE_IDENTIFIER = com.example.booksapp;
327 | PRODUCT_NAME = "$(TARGET_NAME)";
328 | VERSIONING_SYSTEM = "apple-generic";
329 | };
330 | name = Profile;
331 | };
332 | 97C147031CF9000F007C117D /* Debug */ = {
333 | isa = XCBuildConfiguration;
334 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
335 | buildSettings = {
336 | ALWAYS_SEARCH_USER_PATHS = NO;
337 | CLANG_ANALYZER_NONNULL = YES;
338 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
339 | CLANG_CXX_LIBRARY = "libc++";
340 | CLANG_ENABLE_MODULES = YES;
341 | CLANG_ENABLE_OBJC_ARC = YES;
342 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
343 | CLANG_WARN_BOOL_CONVERSION = YES;
344 | CLANG_WARN_COMMA = YES;
345 | CLANG_WARN_CONSTANT_CONVERSION = YES;
346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
347 | CLANG_WARN_EMPTY_BODY = YES;
348 | CLANG_WARN_ENUM_CONVERSION = YES;
349 | CLANG_WARN_INFINITE_RECURSION = YES;
350 | CLANG_WARN_INT_CONVERSION = YES;
351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
352 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
353 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
354 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
355 | CLANG_WARN_STRICT_PROTOTYPES = YES;
356 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
357 | CLANG_WARN_UNREACHABLE_CODE = YES;
358 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
359 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
360 | COPY_PHASE_STRIP = NO;
361 | DEBUG_INFORMATION_FORMAT = dwarf;
362 | ENABLE_STRICT_OBJC_MSGSEND = YES;
363 | ENABLE_TESTABILITY = YES;
364 | GCC_C_LANGUAGE_STANDARD = gnu99;
365 | GCC_DYNAMIC_NO_PIC = NO;
366 | GCC_NO_COMMON_BLOCKS = YES;
367 | GCC_OPTIMIZATION_LEVEL = 0;
368 | GCC_PREPROCESSOR_DEFINITIONS = (
369 | "DEBUG=1",
370 | "$(inherited)",
371 | );
372 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
373 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
374 | GCC_WARN_UNDECLARED_SELECTOR = YES;
375 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
376 | GCC_WARN_UNUSED_FUNCTION = YES;
377 | GCC_WARN_UNUSED_VARIABLE = YES;
378 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
379 | MTL_ENABLE_DEBUG_INFO = YES;
380 | ONLY_ACTIVE_ARCH = YES;
381 | SDKROOT = iphoneos;
382 | TARGETED_DEVICE_FAMILY = "1,2";
383 | };
384 | name = Debug;
385 | };
386 | 97C147041CF9000F007C117D /* Release */ = {
387 | isa = XCBuildConfiguration;
388 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
389 | buildSettings = {
390 | ALWAYS_SEARCH_USER_PATHS = NO;
391 | CLANG_ANALYZER_NONNULL = YES;
392 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
393 | CLANG_CXX_LIBRARY = "libc++";
394 | CLANG_ENABLE_MODULES = YES;
395 | CLANG_ENABLE_OBJC_ARC = YES;
396 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
397 | CLANG_WARN_BOOL_CONVERSION = YES;
398 | CLANG_WARN_COMMA = YES;
399 | CLANG_WARN_CONSTANT_CONVERSION = YES;
400 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
401 | CLANG_WARN_EMPTY_BODY = YES;
402 | CLANG_WARN_ENUM_CONVERSION = YES;
403 | CLANG_WARN_INFINITE_RECURSION = YES;
404 | CLANG_WARN_INT_CONVERSION = YES;
405 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
406 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
407 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
408 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
409 | CLANG_WARN_STRICT_PROTOTYPES = YES;
410 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
411 | CLANG_WARN_UNREACHABLE_CODE = YES;
412 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
413 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
414 | COPY_PHASE_STRIP = NO;
415 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
416 | ENABLE_NS_ASSERTIONS = NO;
417 | ENABLE_STRICT_OBJC_MSGSEND = YES;
418 | GCC_C_LANGUAGE_STANDARD = gnu99;
419 | GCC_NO_COMMON_BLOCKS = YES;
420 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
421 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
422 | GCC_WARN_UNDECLARED_SELECTOR = YES;
423 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
424 | GCC_WARN_UNUSED_FUNCTION = YES;
425 | GCC_WARN_UNUSED_VARIABLE = YES;
426 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
427 | MTL_ENABLE_DEBUG_INFO = NO;
428 | SDKROOT = iphoneos;
429 | TARGETED_DEVICE_FAMILY = "1,2";
430 | VALIDATE_PRODUCT = YES;
431 | };
432 | name = Release;
433 | };
434 | 97C147061CF9000F007C117D /* Debug */ = {
435 | isa = XCBuildConfiguration;
436 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
437 | buildSettings = {
438 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
439 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
440 | ENABLE_BITCODE = NO;
441 | FRAMEWORK_SEARCH_PATHS = (
442 | "$(inherited)",
443 | "$(PROJECT_DIR)/Flutter",
444 | );
445 | INFOPLIST_FILE = Runner/Info.plist;
446 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
447 | LIBRARY_SEARCH_PATHS = (
448 | "$(inherited)",
449 | "$(PROJECT_DIR)/Flutter",
450 | );
451 | PRODUCT_BUNDLE_IDENTIFIER = com.example.booksapp;
452 | PRODUCT_NAME = "$(TARGET_NAME)";
453 | VERSIONING_SYSTEM = "apple-generic";
454 | };
455 | name = Debug;
456 | };
457 | 97C147071CF9000F007C117D /* Release */ = {
458 | isa = XCBuildConfiguration;
459 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
460 | buildSettings = {
461 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
462 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
463 | ENABLE_BITCODE = NO;
464 | FRAMEWORK_SEARCH_PATHS = (
465 | "$(inherited)",
466 | "$(PROJECT_DIR)/Flutter",
467 | );
468 | INFOPLIST_FILE = Runner/Info.plist;
469 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
470 | LIBRARY_SEARCH_PATHS = (
471 | "$(inherited)",
472 | "$(PROJECT_DIR)/Flutter",
473 | );
474 | PRODUCT_BUNDLE_IDENTIFIER = com.example.booksapp;
475 | PRODUCT_NAME = "$(TARGET_NAME)";
476 | VERSIONING_SYSTEM = "apple-generic";
477 | };
478 | name = Release;
479 | };
480 | /* End XCBuildConfiguration section */
481 |
482 | /* Begin XCConfigurationList section */
483 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
484 | isa = XCConfigurationList;
485 | buildConfigurations = (
486 | 97C147031CF9000F007C117D /* Debug */,
487 | 97C147041CF9000F007C117D /* Release */,
488 | 249021D3217E4FDB00AE95B9 /* Profile */,
489 | );
490 | defaultConfigurationIsVisible = 0;
491 | defaultConfigurationName = Release;
492 | };
493 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
494 | isa = XCConfigurationList;
495 | buildConfigurations = (
496 | 97C147061CF9000F007C117D /* Debug */,
497 | 97C147071CF9000F007C117D /* Release */,
498 | 249021D4217E4FDB00AE95B9 /* Profile */,
499 | );
500 | defaultConfigurationIsVisible = 0;
501 | defaultConfigurationName = Release;
502 | };
503 | /* End XCConfigurationList section */
504 | };
505 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
506 | }
507 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
33 |
34 |
40 |
41 |
42 |
43 |
44 |
45 |
56 |
58 |
64 |
65 |
66 |
67 |
68 |
69 |
75 |
77 |
83 |
84 |
85 |
86 |
88 |
89 |
92 |
93 |
94 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.h:
--------------------------------------------------------------------------------
1 | #import
2 | #import
3 |
4 | @interface AppDelegate : FlutterAppDelegate
5 |
6 | @end
7 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.m:
--------------------------------------------------------------------------------
1 | #include "AppDelegate.h"
2 | #include "GeneratedPluginRegistrant.h"
3 |
4 | @implementation AppDelegate
5 |
6 | - (BOOL)application:(UIApplication *)application
7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
8 | [GeneratedPluginRegistrant registerWithRegistry:self];
9 | // Override point for customization after application launch.
10 | return [super application:application didFinishLaunchingWithOptions:launchOptions];
11 | }
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/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/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | booksapp
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/ios/Runner/main.m:
--------------------------------------------------------------------------------
1 | #import
2 | #import
3 | #import "AppDelegate.h"
4 |
5 | int main(int argc, char* argv[]) {
6 | @autoreleasepool {
7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/lib/details.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'models/book.dart';
3 | import 'package:flutter_rating/flutter_rating.dart';
4 |
5 | bool inCart;
6 | bool isFav;
7 |
8 | class Details extends StatefulWidget {
9 | final Book bookObject;
10 |
11 | Details(this.bookObject);
12 |
13 | @override
14 | _DetailsState createState() => _DetailsState();
15 | }
16 |
17 | class _DetailsState extends State {
18 | @override
19 | void initState() {
20 | // TODO: implement initState
21 | inCart = false;
22 | isFav = false;
23 | super.initState();
24 | }
25 |
26 |
27 |
28 | @override
29 | Widget build(BuildContext context) {
30 | return Scaffold(
31 | appBar: PreferredSize(
32 | preferredSize: Size.fromHeight(70),
33 | child: Padding(
34 | padding: EdgeInsets.only(top: 20),
35 | child: AppBar(
36 | elevation: 0.0,
37 | backgroundColor: Colors.white,
38 | leading: GestureDetector(
39 | onTap: () {
40 | Navigator.pop(context);
41 | },
42 | child: Icon(
43 | Icons.arrow_back,
44 | color: Colors.black87,
45 | size: 25,
46 | ),
47 | ),
48 | actions: [
49 | Icon(
50 | Icons.file_upload,
51 | color: Colors.black87,
52 | size: 25,
53 | ),
54 | SizedBox(width: 25),
55 | GestureDetector(
56 | onTap: () {
57 | setState(() {
58 | isFav = !isFav;
59 |
60 | });
61 | },
62 | child: Icon(
63 | isFav ? Icons.favorite : Icons.favorite_border,
64 | color: isFav ? Colors.red : Colors.black87,
65 | size: 25,
66 | ),
67 | ),
68 | SizedBox(width: 25),
69 | ],
70 | ),
71 | ),
72 | ),
73 | body: DetailsPageBody(widget.bookObject),
74 | bottomNavigationBar: BottomBar(widget.bookObject),
75 | );
76 | }
77 | }
78 |
79 | class DetailsPageBody extends StatefulWidget {
80 | final Book bookObject;
81 |
82 | DetailsPageBody(this.bookObject);
83 |
84 | @override
85 | _DetailsPageBodyState createState() => _DetailsPageBodyState();
86 | }
87 |
88 | class _DetailsPageBodyState extends State {
89 | @override
90 | Widget build(BuildContext context) {
91 | return Container(
92 | child: ListView(
93 | children: [
94 | Stack(
95 | children: [
96 | Column(
97 | children: [
98 | TopContainer(widget: widget),
99 | AuthorContainer(widget: widget),
100 | Padding(
101 | padding: EdgeInsets.only(top: 43),
102 | child: GenreContainer(widget: widget),
103 | ),
104 | TabBarContainer(widget: widget),
105 | ],
106 | ),
107 | Positioned(
108 | left: 25,
109 | top: 20,
110 | child: Container(
111 | height: 260,
112 | width: MediaQuery.of(context).size.width / 2 - 30,
113 | child: ClipRRect(
114 | borderRadius: BorderRadius.circular(0),
115 | child: Image.network(widget.bookObject.cover,
116 | fit: BoxFit.contain),
117 | ),
118 | ),
119 | )
120 | ],
121 | )
122 | ],
123 | ),
124 | );
125 | }
126 | }
127 |
128 | class TopContainer extends StatelessWidget {
129 | const TopContainer({
130 | Key key,
131 | @required this.widget,
132 | }) : super(key: key);
133 |
134 | final DetailsPageBody widget;
135 |
136 | @override
137 | Widget build(BuildContext context) {
138 | return Container(
139 | width: double.infinity,
140 | padding: EdgeInsets.only(top: 30, bottom: 30),
141 | decoration: BoxDecoration(
142 | gradient: LinearGradient(
143 | begin: Alignment.bottomCenter,
144 | end: Alignment.topCenter,
145 | colors: [Color(0xfff8f8f8), Colors.white]),
146 | border:
147 | Border(bottom: BorderSide(color: Color(0xfff0f0f0), width: 2))),
148 | child: Column(
149 | children: [
150 | SizedBox(
151 | height: 50,
152 | ),
153 | Align(
154 | alignment: Alignment.centerRight,
155 | child: Container(
156 | padding: EdgeInsets.only(left: 10),
157 | width: MediaQuery.of(context).size.width / 2,
158 | child: Text(
159 | widget.bookObject.title,
160 | style: TextStyle(
161 | fontWeight: FontWeight.w700,
162 | color: Colors.black54,
163 | fontSize: 25),
164 | softWrap: true,
165 | ),
166 | ),
167 | )
168 | ],
169 | ),
170 | );
171 | }
172 | }
173 |
174 | class AuthorContainer extends StatelessWidget {
175 | final DetailsPageBody widget;
176 |
177 | const AuthorContainer({
178 | @required this.widget,
179 | });
180 |
181 | @override
182 | Widget build(BuildContext context) {
183 | return Align(
184 | alignment: Alignment.centerRight,
185 | child: Container(
186 | padding: EdgeInsets.only(
187 | top: 20,
188 | left: 10,
189 | right: 10,
190 | bottom: 0,
191 | ),
192 | width: MediaQuery.of(context).size.width / 2,
193 | height: 110,
194 | child: ListView(
195 | scrollDirection: Axis.horizontal,
196 | children: [
197 | Container(
198 | child: Column(
199 | crossAxisAlignment: CrossAxisAlignment.start,
200 | children: [
201 | Row(
202 | children: [
203 | Container(
204 | decoration: BoxDecoration(
205 | borderRadius: BorderRadius.circular(50),
206 | ),
207 | height: 50,
208 | width: 50,
209 | child: ClipRRect(
210 | borderRadius: BorderRadius.circular(50),
211 | child: Image.network(widget.bookObject.authorImg,
212 | fit: BoxFit.cover),
213 | ),
214 | ),
215 | SizedBox(
216 | width: 10,
217 | ),
218 | Text(
219 | widget.bookObject.author,
220 | style: TextStyle(
221 | fontSize: 20, fontWeight: FontWeight.w500),
222 | )
223 | ],
224 | ),
225 | SizedBox(
226 | height: 10,
227 | ),
228 | Row(
229 | children: [
230 | StarRating(
231 | rating: widget.bookObject.rating,
232 | size: 20,
233 | color: Colors.yellow.shade700,
234 | ),
235 | SizedBox(
236 | width: 5,
237 | ),
238 | Text(
239 | widget.bookObject.rating.toString(),
240 | style: TextStyle(color: Colors.black38, fontSize: 15),
241 | )
242 | ],
243 | )
244 | ],
245 | ),
246 | )
247 | ],
248 | ),
249 | ),
250 | );
251 | }
252 | }
253 |
254 | class GenreContainer extends StatelessWidget {
255 | final DetailsPageBody widget;
256 |
257 | const GenreContainer({@required this.widget});
258 |
259 | @override
260 | Widget build(BuildContext context) {
261 | return Container(
262 | height: 110,
263 | padding: EdgeInsets.only(top: 0, left: 20, right: 20, bottom: 20),
264 | child: ListView(
265 | scrollDirection: Axis.horizontal,
266 | children: [
267 | CategoryBox(
268 | category: "GENRE",
269 | categoryValue: widget.bookObject.genre,
270 | categoryIcon:
271 | "https://cdn3.vectorstock.com/i/thumb-large/93/62/psychology-icon-vector-15909362.jpg",
272 | ),
273 | SizedBox(
274 | width: 10,
275 | ),
276 | CategoryBox(
277 | category: "LANGUAGE",
278 | categoryValue: widget.bookObject.lanugage,
279 | categoryIcon:
280 | "https://cdn2.iconfinder.com/data/icons/translation-1/513/translation-translate-language-international-translating_2_copy_7-512.png",
281 | ),
282 | SizedBox(
283 | width: 10,
284 | ),
285 | CategoryBox(
286 | category: "AGE",
287 | categoryValue: widget.bookObject.age,
288 | categoryIcon:
289 | "https://image.flaticon.com/icons/png/512/31/31370.png",
290 | ),
291 | ],
292 | ),
293 | );
294 | }
295 | }
296 |
297 | class CategoryBox extends StatelessWidget {
298 | final String category;
299 | final String categoryValue;
300 | final String categoryIcon;
301 |
302 | const CategoryBox(
303 | {Key key, this.category, this.categoryValue, this.categoryIcon})
304 | : super(key: key);
305 |
306 | @override
307 | Widget build(BuildContext context) {
308 | return Container(
309 | decoration: BoxDecoration(
310 | borderRadius: BorderRadius.circular(20),
311 | border: Border.all(color: Colors.black12, width: 2)),
312 | padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20),
313 | child: Row(
314 | children: [
315 | Container(
316 | height: 50,
317 | width: 50,
318 | child: Image.network(categoryIcon, fit: BoxFit.contain),
319 | ),
320 | SizedBox(
321 | width: 15,
322 | ),
323 | Column(
324 | crossAxisAlignment: CrossAxisAlignment.start,
325 | mainAxisAlignment: MainAxisAlignment.center,
326 | children: [
327 | Text(
328 | category,
329 | style: TextStyle(
330 | letterSpacing: 1.5, color: Colors.black38, fontSize: 12),
331 | ),
332 | Text(
333 | categoryValue,
334 | style: TextStyle(
335 | color: Colors.black87,
336 | fontSize: 17,
337 | fontWeight: FontWeight.w600),
338 | )
339 | ],
340 | )
341 | ],
342 | ),
343 | );
344 | }
345 | }
346 |
347 | class TabBarContainer extends StatelessWidget {
348 | final DetailsPageBody widget;
349 |
350 | const TabBarContainer({
351 | @required this.widget,
352 | });
353 |
354 | @override
355 | Widget build(BuildContext context) {
356 | return SizedBox(
357 | height: 250,
358 | width: double.infinity,
359 | child: DefaultTabController(
360 | length: 2,
361 | child: Scaffold(
362 | appBar: PreferredSize(
363 | preferredSize: Size.fromHeight(50),
364 | child: Container(
365 | color: Colors.transparent,
366 | child: SafeArea(
367 | child: Column(
368 | children: [
369 | Expanded(
370 | child: Container(),
371 | ),
372 | TabBar(
373 | labelPadding: EdgeInsets.only(bottom: 15, top: 15),
374 | indicatorColor: Colors.yellow.shade700,
375 | labelColor: Colors.black87,
376 | unselectedLabelColor: Colors.black38,
377 | tabs: [
378 | Text("Info"),
379 | Text("Reviews"),
380 | ],
381 | )
382 | ],
383 | ),
384 | ),
385 | ),
386 | ),
387 | body: TabBarView(
388 | children: [
389 | Padding(
390 | padding: EdgeInsets.all(20),
391 | child: Container(
392 | child: ListView(
393 | children: [
394 | Padding(
395 | padding:
396 | EdgeInsets.symmetric(horizontal: 10, vertical: 20),
397 | child: Text("Plot Summary",
398 | style: TextStyle(
399 | fontSize: 28,
400 | fontWeight: FontWeight.w700,
401 | letterSpacing: 1.3)),
402 | ),
403 | Padding(
404 | padding:
405 | EdgeInsets.symmetric(horizontal: 10, vertical: 0),
406 | child: Text(
407 | widget.bookObject.summary,
408 | softWrap: true,
409 | style: TextStyle(
410 | fontSize: 15,
411 | ),
412 | ),
413 | ),
414 | ],
415 | ),
416 | ),
417 | ),
418 | Center(
419 | child: Text("NO REVIEWS",
420 | style: TextStyle(
421 | fontWeight: FontWeight.w700,
422 | fontSize: 25,
423 | color: Colors.black54)),
424 | )
425 | ],
426 | ),
427 | ),
428 | ),
429 | );
430 | }
431 | }
432 |
433 | class BottomBar extends StatefulWidget {
434 | final Book bookObject;
435 |
436 | BottomBar(this.bookObject);
437 |
438 | @override
439 | _BottomBarState createState() => _BottomBarState();
440 | }
441 |
442 | class _BottomBarState extends State {
443 | @override
444 | Widget build(BuildContext context) {
445 | return BottomAppBar(
446 | elevation: 0.0,
447 | child: Container(
448 | padding: EdgeInsets.all(15),
449 | decoration: BoxDecoration(
450 | color: Colors.white,
451 | border: Border(
452 | top: BorderSide(
453 | color: Colors.black12,
454 | width: 2,
455 | ))),
456 | child: Row(
457 | children: [PriceWidget(widget: widget), AddButton()],
458 | ),
459 | ),
460 | );
461 | }
462 | }
463 |
464 | class AddButton extends StatefulWidget {
465 | @override
466 | _AddButtonState createState() => _AddButtonState();
467 | }
468 |
469 | class _AddButtonState extends State {
470 | String _buttonText = "Add to cart";
471 |
472 | @override
473 | Widget build(BuildContext context) {
474 | return Padding(
475 | padding: EdgeInsets.only(right: 10),
476 | child: RaisedButton(
477 | padding: EdgeInsets.symmetric(horizontal: 22, vertical: 11),
478 | elevation: 1.0,
479 | onPressed: () {
480 | setState(() {
481 | _addToCart();
482 | });
483 | },
484 | child: Row(
485 | children: [
486 | Icon(
487 | Icons.shopping_cart,
488 | color: Colors.white,
489 | ),
490 | SizedBox(
491 | width: 5,
492 | ),
493 | Text(
494 | _buttonText,
495 | style: TextStyle(color: Colors.white),
496 | )
497 | ],
498 | ),
499 | color: inCart ? Colors.red : Colors.black54,
500 | ),
501 | );
502 | }
503 |
504 | _addToCart() {
505 | inCart = !inCart;
506 | _buttonText = (inCart == false) ? "Add to cart" : "Remove from cart";
507 | }
508 | }
509 |
510 | class PriceWidget extends StatelessWidget {
511 | const PriceWidget({@required this.widget});
512 |
513 | final BottomBar widget;
514 |
515 | @override
516 | Widget build(BuildContext context) {
517 | return Expanded(
518 | child: RichText(
519 | text: TextSpan(children: [
520 | TextSpan(
521 | text: "\$" + widget.bookObject.price.toString(),
522 | style: TextStyle(
523 | color: Colors.black87,
524 | fontFamily: "lovelo",
525 | fontSize: 30,
526 | fontWeight: FontWeight.w500)),
527 | TextSpan(text: " "),
528 | TextSpan(
529 | text: "\$" + (widget.bookObject.price + 5.45).toString(),
530 | style: TextStyle(
531 | color: Colors.black26,
532 | fontSize: 15,
533 | decoration: TextDecoration.lineThrough))
534 | ]),
535 | ),
536 | );
537 | }
538 | }
539 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'models/book.dart';
3 | import 'details.dart';
4 |
5 | void main() => runApp(BooksApp());
6 |
7 | class BooksApp extends StatelessWidget {
8 | @override
9 | Widget build(BuildContext context) {
10 | return MaterialApp(
11 | debugShowCheckedModeBanner: false,
12 | title: "BooksApp",
13 | home: BooksHome(),
14 | );
15 | }
16 | }
17 |
18 | class BooksHome extends StatelessWidget {
19 | @override
20 | Widget build(BuildContext context) {
21 | return Scaffold(
22 | body: Container(
23 | child: ListView(
24 | scrollDirection: Axis.vertical,
25 | children: [
26 | CustomTitleBar(),
27 | HorizontalListView(),
28 | HotList(),
29 | ],
30 | ),
31 | ),
32 | );
33 | }
34 | }
35 |
36 | class CustomTitleBar extends StatelessWidget {
37 | @override
38 | Widget build(BuildContext context) {
39 | return Padding(
40 | padding: EdgeInsets.symmetric(horizontal: 20, vertical: 35),
41 | child: Row(
42 | mainAxisAlignment: MainAxisAlignment.center,
43 | children: [
44 | Icon(
45 | Icons.book,
46 | size: 30,
47 | color: Colors.black,
48 | ),
49 | SizedBox(
50 | width: 15,
51 | ),
52 | Expanded(
53 | child: Text("BooksApp",
54 | style: TextStyle(
55 | fontSize: 30,
56 | fontFamily: "lovelo",
57 | )),
58 | )
59 | ],
60 | ),
61 | );
62 | }
63 | }
64 |
65 | class HorizontalListView extends StatelessWidget {
66 | @override
67 | Widget build(BuildContext context) {
68 | return Container(
69 | decoration: BoxDecoration(
70 | gradient: LinearGradient(
71 | begin: Alignment.bottomCenter,
72 | end: Alignment.topCenter,
73 | colors: [Color(0xfff8f8f8), Colors.white],
74 | ),
75 | border: Border(bottom: BorderSide(color: Color(0xfff0f0f0), width: 2)),
76 | ),
77 | padding: EdgeInsets.only(left: 20.0, right: 20.0, bottom: 20.0),
78 | child: Column(
79 | crossAxisAlignment: CrossAxisAlignment.start,
80 | children: [
81 | Container(
82 | height: 250,
83 | child: ListView.builder(
84 | scrollDirection: Axis.horizontal,
85 | itemCount: booklist.books.length,
86 | itemBuilder: (BuildContext context, int i) {
87 | if (booklist.books[i].franchise) {
88 | return ShowCase(
89 | wideImage: booklist.books[i].wideImage,
90 | bookObject: booklist.books[i],
91 | );
92 | } else {
93 | return Container();
94 | }
95 | },
96 | ),
97 | ),
98 | SizedBox(
99 | height: 25.0,
100 | ),
101 | Text(
102 | "BEST SELLERS",
103 | style: TextStyle(letterSpacing: 1.5, color: Colors.black54),
104 | ),
105 | Divider(
106 | color: Colors.black54,
107 | ),
108 | Text(
109 | "Novels with a popular franchise",
110 | style: TextStyle(
111 | color: Colors.black87,
112 | fontWeight: FontWeight.w700,
113 | fontSize: 30),
114 | softWrap: true,
115 | ),
116 | ],
117 | ),
118 | );
119 | }
120 | }
121 |
122 | class ShowCase extends StatelessWidget {
123 | const ShowCase({
124 | @required this.wideImage,
125 | @required this.bookObject,
126 | });
127 |
128 | final String wideImage;
129 | final Book bookObject;
130 |
131 | @override
132 | Widget build(BuildContext context) {
133 | return GestureDetector(
134 | onTap: () {
135 | Navigator.push(context,
136 | MaterialPageRoute(builder: (context) => Details(bookObject)));
137 | },
138 | child: Row(
139 | children: [
140 | Container(
141 | height: 250,
142 | width: 350,
143 | decoration: BoxDecoration(
144 | borderRadius: BorderRadius.circular(10),
145 | ),
146 | child: ClipRRect(
147 | borderRadius: BorderRadius.circular(10),
148 | child: Image.network(wideImage, fit: BoxFit.cover),
149 | ),
150 | ),
151 | SizedBox(
152 | width: 20,
153 | )
154 | ],
155 | ),
156 | );
157 | }
158 | }
159 |
160 | class HotList extends StatelessWidget {
161 | @override
162 | Widget build(BuildContext context) {
163 | return Container(
164 | decoration: BoxDecoration(
165 | gradient: LinearGradient(
166 | begin: Alignment.bottomCenter,
167 | end: Alignment.topCenter,
168 | colors: [Color(0xfff8f8f8), Colors.white],
169 | ),
170 | border:
171 | Border(bottom: BorderSide(color: Color(0xfff0f0f0), width: 2))),
172 | padding: EdgeInsets.only(left: 20, right: 20, top: 35, bottom: 15),
173 | child: Column(
174 | crossAxisAlignment: CrossAxisAlignment.start,
175 | children: [
176 | Padding(
177 | padding: EdgeInsets.only(bottom: 20.0),
178 | child: Text(
179 | "New Book Hot List",
180 | style: TextStyle(
181 | color: Colors.black,
182 | fontSize: 30,
183 | fontWeight: FontWeight.w600),
184 | ),
185 | ),
186 | Container(
187 | height: 320,
188 | child: ListView.builder(
189 | scrollDirection: Axis.horizontal,
190 | itemCount: booklist.books.length,
191 | itemBuilder: (BuildContext context, int i) {
192 | String title = booklist.books[i].title.length > 17
193 | ? booklist.books[i].title.substring(0, 15) + "..."
194 | : booklist.books[i].title;
195 |
196 | if (booklist.books[i].franchise) {
197 | return Container();
198 | } else {
199 | return ShowBooks(
200 | bookCoverImg: booklist.books[i].cover,
201 | price: booklist.books[i].price,
202 | author: booklist.books[i].author,
203 | title: title,
204 | bookObject: booklist.books[i],
205 | );
206 | }
207 | },
208 | ),
209 | )
210 | ],
211 | ),
212 | );
213 | }
214 | }
215 |
216 | class ShowBooks extends StatelessWidget {
217 | const ShowBooks(
218 | {@required this.bookCoverImg,
219 | @required this.title,
220 | @required this.author,
221 | @required this.price,
222 | @required this.bookObject});
223 |
224 | final String bookCoverImg;
225 | final String author;
226 | final String title;
227 | final double price;
228 | final Book bookObject;
229 |
230 | @override
231 | Widget build(BuildContext context) {
232 | return GestureDetector(
233 | onTap: () {
234 | Navigator.push(context,
235 | MaterialPageRoute(builder: (context) => Details(bookObject)));
236 | },
237 | child: Row(
238 | children: [
239 | Column(
240 | crossAxisAlignment: CrossAxisAlignment.start,
241 | children: [
242 | Container(
243 | height: 220,
244 | width: 150,
245 | decoration:
246 | BoxDecoration(borderRadius: BorderRadius.circular(5.0)),
247 | child: ClipRRect(
248 | borderRadius: BorderRadius.circular(5.0),
249 | child: Image.network(
250 | bookCoverImg,
251 | fit: BoxFit.cover,
252 | )),
253 | ),
254 | SizedBox(
255 | height: 15,
256 | ),
257 | Text(
258 | title,
259 | style: TextStyle(
260 | fontSize: 20,
261 | color: Colors.black87,
262 | fontWeight: FontWeight.w600),
263 | ),
264 | SizedBox(
265 | height: 7,
266 | ),
267 | Text(
268 | author,
269 | style: TextStyle(
270 | fontSize: 15,
271 | color: Colors.black45,
272 | fontWeight: FontWeight.w300,
273 | ),
274 | softWrap: true,
275 | ),
276 | SizedBox(
277 | height: 12,
278 | ),
279 | Text("\$$price",
280 | style: TextStyle(
281 | fontSize: 15,
282 | color: Colors.black,
283 | fontWeight: FontWeight.w500))
284 | ],
285 | ),
286 | SizedBox(
287 | width: 20,
288 | )
289 | ],
290 | ),
291 | );
292 | }
293 | }
294 |
--------------------------------------------------------------------------------
/lib/models/book.dart:
--------------------------------------------------------------------------------
1 | import 'package:meta/meta.dart';
2 |
3 | BookList booklist = BookList(books: [
4 | Book(
5 | title: "Harry Potter and the Deathly Hallows",
6 | cover:
7 | "https://upload.wikimedia.org/wikipedia/en/a/a9/Harry_Potter_and_the_Deathly_Hallows.jpg",
8 | age: "ALL AGE",
9 | author: "J. K. Rowling",
10 | authorImg:
11 | "https://images.gr-assets.com/authors/1510435123p5/1077326.jpg",
12 | franchise: true,
13 | genre: "Fantasy",
14 | lanugage: "ENGLISH",
15 | rating: 4.5,
16 | price: 13.49,
17 | summary:
18 | "Without the guidance and protection of their professors, Harry (Daniel Radcliffe), Ron (Rupert Grint) and Hermione (Emma Watson) begin a mission to destroy the Horcruxes, the sources of Voldemort's immortality. Though they must rely on one another more than ever, dark forces threaten to tear them apart. Voldemort's Death Eaters have seized control of the Ministry of Magic and Hogwarts, and they are searching for Harry -- even as he and his friends prepare for the ultimate showdown.",
19 | wideImage: "https://wallpaperplay.com/walls/full/9/a/9/64844.jpg"),
20 |
21 | Book(
22 | title: "A Song Of Ice And Fire",
23 | cover:
24 | "https://upload.wikimedia.org/wikipedia/en/thumb/d/dc/A_Song_of_Ice_and_Fire_book_collection_box_set_cover.jpg/220px-A_Song_of_Ice_and_Fire_book_collection_box_set_cover.jpg",
25 | age: "ABOVE 18",
26 | author: "George R. R. Martin",
27 | authorImg:
28 | "https://www.biography.com/.image/t_share/MTQ4NDc2MTkxNTY3NzgzMTE1/george_rr_martin_photo_mark_davis_wireimage_via_getty_images_164117282_resized.jpg",
29 | franchise: true,
30 | genre: "Sci-Fi",
31 | lanugage: "ENGLISH",
32 | price: 27.34,
33 | rating: 4.4,
34 | summary:
35 | "Game of Thrones is roughly based on the storylines of A Song of Ice and Fire, set in the fictional Seven Kingdoms of Westeros and the continent of Essos. The series chronicles the violent dynastic struggles among the realm's noble families for the Iron Throne, while other families fight for independence from it.",
36 | wideImage:
37 | "https://images-na.ssl-images-amazon.com/images/I/91KwasehsHL._RI_.jpg"),
38 |
39 | Book(
40 | title: "The Lord Of The Rings",
41 | cover:
42 | "https://images-na.ssl-images-amazon.com/images/I/51EstVXM1UL._SX331_BO1,204,203,200_.jpg",
43 | age: "ALL AGE",
44 | author: "J. R. R. Tolkien",
45 | authorImg:
46 | "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJA6kQWR4l52ykTTtyFuUb6WEmXixGqzU4_QWIOLS0bfIGCUMW",
47 | franchise: true,
48 | genre: "Sci-Fi",
49 | lanugage: "ENGLISH",
50 | rating: 4.0,
51 | price: 11.49,
52 | summary:
53 | "The future of civilization rests in the fate of the One Ring, which has been lost for centuries. Powerful forces are unrelenting in their search for it. But fate has placed it in the hands of a young Hobbit named Frodo Baggins (Elijah Wood), who inherits the Ring and steps into legend. A daunting task lies ahead for Frodo when he becomes the Ringbearer - to destroy the One Ring in the fires of Mount Doom where it was forged.",
54 | wideImage:
55 | "https://4.bp.blogspot.com/-CqmWhF3fPgA/WQlvMBGFILI/AAAAAAAAAbs/brv0zDl-lFUJWhofGthQXMoKJklDsNIjQCLcB/s1600/The%2BLord%2Bof%2Bthe%2BRings.jpg"),
56 |
57 | Book(
58 | title: "Rita Hayworth and Shawshank Redemption",
59 | cover:
60 | "https://upload.wikimedia.org/wikipedia/en/a/a9/Harry_Potter_and_the_Deathly_Hallows.jpg",
61 | age: "ABOVE 18",
62 | author: "Steven King",
63 | authorImg: "https://images.gr-assets.com/authors/1362814142p5/3389.jpg",
64 | franchise: true,
65 | genre: "Crime Fiction",
66 | lanugage: "ENGLISH",
67 | price: 10.87,
68 | rating: 4.9,
69 | summary:
70 | "Andy Dufresne (Tim Robbins) is sentenced to two consecutive life terms in prison for the murders of his wife and her lover and is sentenced to a tough prison. However, only Andy knows he didn't commit the crimes. While there, he forms a friendship with Red (Morgan Freeman), experiences brutality of prison life, adapts, helps the warden, etc., all in 19 years.",
71 | wideImage:
72 | "http://images2.fanpop.com/image/photos/10300000/Shawshank-Redemption-Wallpaper-the-shawshank-redemption-10336576-1024-768.jpg"),
73 |
74 | Book(
75 | title: "The Godfather",
76 | cover:
77 | "https://upload.wikimedia.org/wikipedia/en/thumb/f/f4/Godfather-Novel-Cover.png/175px-Godfather-Novel-Cover.png",
78 | age: "ALL AGE",
79 | author: "Mario Puzo",
80 | authorImg:
81 | "https://upload.wikimedia.org/wikipedia/en/thumb/0/0c/Mario_Puzo.jpg/220px-Mario_Puzo.jpg",
82 | franchise: true,
83 | genre: "Crime Fiction",
84 | lanugage: "ENGLISH",
85 | price: 13.60,
86 | rating: 4.8,
87 | summary:
88 | "Widely regarded as one of the greatest films of all time, this mob drama, based on Mario Puzo's novel of the same name, focuses on the powerful Italian-American crime family of Don Vito Corleone (Marlon Brando). When the don's youngest son, Michael (Al Pacino), reluctantly joins the Mafia, he becomes involved in the inevitable cycle of violence and betrayal. Although Michael tries to maintain a normal relationship with his wife, Kay (Diane Keaton), he is drawn deeper into the family business.",
89 | wideImage: "https://wallpapercave.com/wp/jwavrlw.jpg"),
90 | //after these all are the once which are not on the top shelf
91 |
92 | Book(
93 | title: "The Da Vinci Code",
94 | cover:
95 | "https://upload.wikimedia.org/wikipedia/en/thumb/6/6b/DaVinciCode.jpg/220px-DaVinciCode.jpg",
96 | age: "ALL AGE",
97 | author: "Dan Brown",
98 | authorImg:
99 | "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Dan_Brown_November_2015.jpg/220px-Dan_Brown_November_2015.jpg",
100 | franchise: false,
101 | genre: "Mystery-Thriller",
102 | lanugage: "ENGLISH",
103 | price: 8.34,
104 | rating: 4.2,
105 | summary:
106 | "A murder in Paris' Louvre Museum and cryptic clues in some of Leonardo da Vinci's most famous paintings lead to the discovery of a religious mystery. For 2,000 years a secret society closely guards information that -- should it come to light -- could rock the very foundations of Christianity.",
107 | wideImage: ""),
108 |
109 | Book(
110 | title: "Fantastic Beasts And Where To Find Them",
111 | cover:
112 | "https://upload.wikimedia.org/wikipedia/en/thumb/8/8d/Fantastic_beasts.JPG/220px-Fantastic_beasts.JPG",
113 | age: "ALL AGE",
114 | author: "J. K. Rowling",
115 | authorImg:
116 | "https://images.gr-assets.com/authors/1510435123p5/1077326.jpg",
117 | franchise: false,
118 | genre: "Fantasy",
119 | lanugage: "ENGLISH",
120 | price: 23.71,
121 | rating: 3.5,
122 | summary:
123 | "The year is 1926, and Newt Scamander (Eddie Redmayne) has just completed a global excursion to find and document an extraordinary array of magical creatures. Arriving in New York for a brief stopover, he might have come and gone without incident, were it not for a No-Maj (American for Muggle) named Jacob, a misplaced magical case, and the escape of some of Newt's fantastic beasts, which could spell trouble for both the wizarding and No-Maj worlds.",
124 | wideImage: ""),
125 |
126 | Book(
127 | title: "The Alchemist",
128 | cover:
129 | "https://images-na.ssl-images-amazon.com/images/I/410llGwMZGL._SX328_BO1,204,203,200_.jpg",
130 | age: "ALL AGE",
131 | author: "Paulo Coelho",
132 | authorImg:
133 | "https://tpoth-assets.s3.amazonaws.com/uploads/contributor/14/contributor_img/paulo_coelho.jpg",
134 | franchise: false,
135 | genre: "Quest",
136 | lanugage: "ENGLISH",
137 | price: 13.69,
138 | rating: 4.5,
139 | summary:
140 | "The Alchemist follows the journey of an Andalusian shepherd boy named Santiago. Believing a recurring dream to be prophetic, he asks a Romani fortune teller in a nearby town about its meaning. The woman interprets the dream as a prophecy telling the boy that he will discover a treasure at the Egyptian pyramids.",
141 | wideImage: ""),
142 |
143 | Book(
144 | title: "The Adventures Of Sherlock Holmes",
145 | cover:
146 | "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Adventures_of_sherlock_holmes.jpg/220px-Adventures_of_sherlock_holmes.jpg",
147 | age: "ALL AGE",
148 | author: "Arthur Conan Doyle",
149 | authorImg:
150 | "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Arthur_Conan_Doyle_by_Walter_Benington%2C_1914.png/220px-Arthur_Conan_Doyle_by_Walter_Benington%2C_1914.png",
151 | franchise: false,
152 | genre: "Suspense",
153 | lanugage: "ENGLISH",
154 | price: 15.31,
155 | rating: 4.0,
156 | summary:
157 | "All of the stories within The Adventures of Sherlock Holmes are told in a first-person narrative from the point of view of Dr. Watson, as is the case for all but four of the Sherlock Holmes stories. The Oxford Dictionary of National Biography entry for Doyle suggests that the short stories contained in The Adventures of Sherlock Holmes tend to point out social injustices, such as 'a king's betrayal of an opera singer, a stepfather's deception of his ward as a fictitious lover, an aristocratic crook's exploitation of a failing pawnbroker, a beggar's extensive estate in Kent.' ",
158 | wideImage: ""),
159 |
160 | Book(
161 | title: "How to build a Billion Dollar App",
162 | cover: "https://images.gr-assets.com/books/1420791474l/23658963.jpg",
163 | age: "ALL AGE",
164 | author: "George Berkowski",
165 | authorImg:
166 | "https://images-na.ssl-images-amazon.com/images/I/6100CMqLo6L._UY200_.jpg",
167 | franchise: false,
168 | genre: "Self Analysis",
169 | lanugage: "ENGLISH",
170 | price: 18.94,
171 | rating: 3.5,
172 | summary:
173 | "Berkowski draws exclusively on the inside stories of the billion-dollar app club members, including Instagram, Whatsapp, Snapchat, Candy Crush and Uber to provide all the information you need to create your own spectacularly successful mobile business. He guides you through each step, from an idea scribbled on the back of an envelope, through to finding a cofounder, building a team, attracting (and keeping) millions of users, all the way through to juggling the pressures of being CEO of a billion-dollar company (and still staying ahead of the competition).",
174 | wideImage: ""),
175 |
176 | Book(
177 | title: "ChandraKanta",
178 | cover: "https://images-na.ssl-images-amazon.com/images/I/81jtlDN-XbL.jpg",
179 | age: "ALL AGE",
180 | author: "Devaki Nandan Khatri",
181 | authorImg:
182 | "https://upload.wikimedia.org/wikipedia/commons/thumb/2/24/Devaki_Nandan_Khatri_Portrait.JPG/220px-Devaki_Nandan_Khatri_Portrait.JPG",
183 | franchise: false,
184 | genre: "Romantic Fantasy",
185 | lanugage: "HINDI",
186 | price: 11.99,
187 | rating: 4.0,
188 | summary:
189 | "Story. The story is a romantic fantasy about two lovers who belong to rival kingdoms: the princess Chandrakanta of Vijaygarh, and the prince Virendra Singh of Naugarh. The Story slowly unfolds into Chandrakanta being kidnapped and getting rescued by Chapla. However, they get trapped into a Tilism by a quirk of fate.",
190 | wideImage: ""),
191 | ]);
192 |
193 | class BookList {
194 | List books;
195 |
196 | BookList({
197 | @required this.books,
198 | });
199 | }
200 |
201 | class Book {
202 | String title;
203 |
204 | double price;
205 | String cover;
206 | String author;
207 | String genre;
208 | String lanugage;
209 | String authorImg;
210 | bool franchise;
211 | String summary;
212 | String wideImage;
213 | String age;
214 | double rating;
215 |
216 | Book(
217 | {@required this.title,
218 | @required this.price,
219 | @required this.cover,
220 | @required this.author,
221 | @required this.age,
222 | @required this.authorImg,
223 | @required this.franchise,
224 | @required this.genre,
225 | @required this.lanugage,
226 | @required this.summary,
227 | @required this.wideImage,
228 | @required this.rating,
229 |
230 | });
231 | }
232 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile
3 | packages:
4 | async:
5 | dependency: transitive
6 | description:
7 | name: async
8 | url: "https://pub.dartlang.org"
9 | source: hosted
10 | version: "2.0.8"
11 | boolean_selector:
12 | dependency: transitive
13 | description:
14 | name: boolean_selector
15 | url: "https://pub.dartlang.org"
16 | source: hosted
17 | version: "1.0.4"
18 | charcode:
19 | dependency: transitive
20 | description:
21 | name: charcode
22 | url: "https://pub.dartlang.org"
23 | source: hosted
24 | version: "1.1.2"
25 | collection:
26 | dependency: transitive
27 | description:
28 | name: collection
29 | url: "https://pub.dartlang.org"
30 | source: hosted
31 | version: "1.14.11"
32 | cupertino_icons:
33 | dependency: "direct main"
34 | description:
35 | name: cupertino_icons
36 | url: "https://pub.dartlang.org"
37 | source: hosted
38 | version: "0.1.2"
39 | flutter:
40 | dependency: "direct main"
41 | description: flutter
42 | source: sdk
43 | version: "0.0.0"
44 | flutter_rating:
45 | dependency: "direct main"
46 | description:
47 | name: flutter_rating
48 | url: "https://pub.dartlang.org"
49 | source: hosted
50 | version: "0.0.2"
51 | flutter_test:
52 | dependency: "direct dev"
53 | description: flutter
54 | source: sdk
55 | version: "0.0.0"
56 | matcher:
57 | dependency: transitive
58 | description:
59 | name: matcher
60 | url: "https://pub.dartlang.org"
61 | source: hosted
62 | version: "0.12.3+1"
63 | meta:
64 | dependency: transitive
65 | description:
66 | name: meta
67 | url: "https://pub.dartlang.org"
68 | source: hosted
69 | version: "1.1.6"
70 | path:
71 | dependency: transitive
72 | description:
73 | name: path
74 | url: "https://pub.dartlang.org"
75 | source: hosted
76 | version: "1.6.2"
77 | pedantic:
78 | dependency: transitive
79 | description:
80 | name: pedantic
81 | url: "https://pub.dartlang.org"
82 | source: hosted
83 | version: "1.4.0"
84 | quiver:
85 | dependency: transitive
86 | description:
87 | name: quiver
88 | url: "https://pub.dartlang.org"
89 | source: hosted
90 | version: "2.0.1"
91 | sky_engine:
92 | dependency: transitive
93 | description: flutter
94 | source: sdk
95 | version: "0.0.99"
96 | source_span:
97 | dependency: transitive
98 | description:
99 | name: source_span
100 | url: "https://pub.dartlang.org"
101 | source: hosted
102 | version: "1.5.4"
103 | stack_trace:
104 | dependency: transitive
105 | description:
106 | name: stack_trace
107 | url: "https://pub.dartlang.org"
108 | source: hosted
109 | version: "1.9.3"
110 | stream_channel:
111 | dependency: transitive
112 | description:
113 | name: stream_channel
114 | url: "https://pub.dartlang.org"
115 | source: hosted
116 | version: "1.6.8"
117 | string_scanner:
118 | dependency: transitive
119 | description:
120 | name: string_scanner
121 | url: "https://pub.dartlang.org"
122 | source: hosted
123 | version: "1.0.4"
124 | term_glyph:
125 | dependency: transitive
126 | description:
127 | name: term_glyph
128 | url: "https://pub.dartlang.org"
129 | source: hosted
130 | version: "1.1.0"
131 | test_api:
132 | dependency: transitive
133 | description:
134 | name: test_api
135 | url: "https://pub.dartlang.org"
136 | source: hosted
137 | version: "0.2.2"
138 | typed_data:
139 | dependency: transitive
140 | description:
141 | name: typed_data
142 | url: "https://pub.dartlang.org"
143 | source: hosted
144 | version: "1.1.6"
145 | vector_math:
146 | dependency: transitive
147 | description:
148 | name: vector_math
149 | url: "https://pub.dartlang.org"
150 | source: hosted
151 | version: "2.0.8"
152 | sdks:
153 | dart: ">=2.1.0 <3.0.0"
154 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: booksapp
2 | description: A new Flutter project.
3 |
4 | # The following defines the version and build number for your application.
5 | # A version number is three numbers separated by dots, like 1.2.43
6 | # followed by an optional build number separated by a +.
7 | # Both the version and the builder number may be overridden in flutter
8 | # build by specifying --build-name and --build-number, respectively.
9 | # In Android, build-name is used as versionName while build-number used as versionCode.
10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
12 | # Read more about iOS versioning at
13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
14 | version: 1.0.0+1
15 |
16 | environment:
17 | sdk: ">=2.1.0 <3.0.0"
18 |
19 | dependencies:
20 | flutter:
21 | sdk: flutter
22 |
23 | flutter_rating: ^0.0.2
24 |
25 | # The following adds the Cupertino Icons font to your application.
26 | # Use with the CupertinoIcons class for iOS style icons.
27 | cupertino_icons: ^0.1.2
28 |
29 | dev_dependencies:
30 | flutter_test:
31 | sdk: flutter
32 |
33 |
34 | # For information on the generic Dart part of this file, see the
35 | # following page: https://www.dartlang.org/tools/pub/pubspec
36 |
37 | # The following section is specific to Flutter.
38 | flutter:
39 |
40 | # The following line ensures that the Material Icons font is
41 | # included with your application, so that you can use the icons in
42 | # the material Icons class.
43 | uses-material-design: true
44 |
45 | # To add assets to your application, add an assets section, like this:
46 | # assets:
47 | # - images/a_dot_burr.jpeg
48 | # - images/a_dot_ham.jpeg
49 |
50 | # An image asset can refer to one or more resolution-specific "variants", see
51 | # https://flutter.io/assets-and-images/#resolution-aware.
52 |
53 | # For details regarding adding assets from package dependencies, see
54 | # https://flutter.io/assets-and-images/#from-packages
55 |
56 | # To add custom fonts to your application, add a fonts section here,
57 | # in this "flutter" section. Each entry in this list should have a
58 | # "family" key with the font family name, and a "fonts" key with a
59 | # list giving the asset and other descriptors for the font. For
60 | # example:
61 | fonts:
62 | - family: lovelo
63 | fonts:
64 | - asset: fonts/lovelo.ttf
65 |
66 | # - family: Trajan Pro
67 | # fonts:
68 | # - asset: fonts/TrajanPro.ttf
69 | # - asset: fonts/TrajanPro_Bold.ttf
70 | # weight: 700
71 | #
72 | # For details regarding fonts from package dependencies,
73 | # see https://flutter.io/custom-fonts/#from-packages
74 |
--------------------------------------------------------------------------------
/screenshots/first_page.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/screenshots/first_page.jpeg
--------------------------------------------------------------------------------
/screenshots/second_page.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ronak99/Flutter-Speed-Coding---BooksApp/a1844e16947dbcbb5bfbfb2c014f3cdc1cacce6d/screenshots/second_page.jpeg
--------------------------------------------------------------------------------
/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:booksapp/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(BooksApp());
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 |
--------------------------------------------------------------------------------