├── .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 | --------------------------------------------------------------------------------