├── ui.png ├── assets ├── bg.png ├── ds.png ├── fg.png └── wiki_logo.png ├── ios ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 180.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ ├── 1024.png │ │ │ └── Contents.json │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── LaunchBackground.imageset │ │ │ ├── background.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── .gitignore ├── Podfile └── Podfile.lock ├── implementation.png ├── lib ├── enums │ └── loading_states_enum.dart ├── model │ ├── recents.model.dart │ └── search_result.dart ├── custom_widgets │ ├── dynamic_text.dart │ ├── share.dart │ ├── app_bar.dart │ ├── shimmer_image.dart │ ├── gradient_circle.dart │ ├── theme_toggle.dart │ ├── loading_states.dart │ ├── input_feild.dart │ └── recent_history.dart ├── utils │ ├── setup.dart │ └── theme_controller.dart ├── main.dart ├── screens │ ├── search_result_screen.dart │ └── app.dart └── provider │ └── search_provider.dart ├── android ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── drawable-hdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-mdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ │ ├── splash.png │ │ │ │ │ ├── ic_launcher_background.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── 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 │ │ │ │ │ ├── colors.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ └── ic_launcher.xml │ │ │ │ └── drawable │ │ │ │ │ └── launch_background.xml │ │ │ ├── kotlin │ │ │ │ └── io │ │ │ │ │ └── imgkl │ │ │ │ │ └── flikipedia │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── settings.gradle └── build.gradle ├── .metadata ├── .gitignore ├── README.md ├── pubspec.yaml ├── test └── widget_test.dart └── pubspec.lock /ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ui.png -------------------------------------------------------------------------------- /assets/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/assets/bg.png -------------------------------------------------------------------------------- /assets/ds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/assets/ds.png -------------------------------------------------------------------------------- /assets/fg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/assets/fg.png -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /implementation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/implementation.png -------------------------------------------------------------------------------- /assets/wiki_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/assets/wiki_logo.png -------------------------------------------------------------------------------- /lib/enums/loading_states_enum.dart: -------------------------------------------------------------------------------- 1 | enum LOADING_STATES { 2 | IDLE, 3 | EMPTY, 4 | } 5 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xhdpi/splash.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.enableR8=true 5 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Imgkl/Fliki/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /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-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/io/imgkl/flikipedia/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package io.imgkl.flikipedia 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | import android.os.Build 6 | import android.view.ViewTreeObserver 7 | import android.view.WindowManager 8 | class MainActivity: FlutterActivity() { 9 | } -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /lib/model/recents.model.dart: -------------------------------------------------------------------------------- 1 | //Model for the RecentHistory 2 | class Recents { 3 | String title; 4 | 5 | Recents({ 6 | this.title, 7 | }); 8 | 9 | Recents.fromMap(Map map) : this.title = map['title']; 10 | 11 | Map toMap() { 12 | return { 13 | 'title': this.title, 14 | }; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 78910062997c3a836feee883712c241a5fd22983 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /lib/custom_widgets/dynamic_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | class DynamicColor { 5 | Color getColor(opacity) { 6 | return Get.theme.brightness.toString() == "Brightness.light" 7 | ? Colors.black.withOpacity(opacity) 8 | : Colors.white.withOpacity(opacity); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "background.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "LaunchImage.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "LaunchImage@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "LaunchImage@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | var flutter_native_splash = 1 11 | UIApplication.shared.isStatusBarHidden = false 12 | 13 | GeneratedPluginRegistrant.register(with: self) 14 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 15 | } 16 | } -------------------------------------------------------------------------------- /lib/utils/setup.dart: -------------------------------------------------------------------------------- 1 | import 'package:flikipedia/utils/theme_controller.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter/services.dart'; 4 | import 'package:get/get.dart'; 5 | 6 | class Util { 7 | static Future initializeApp() async { 8 | WidgetsFlutterBinding.ensureInitialized(); 9 | Get.lazyPut(() => ThemeController()); 10 | ThemeController.to.getThemeModeFromPreferences(); 11 | SystemChrome.setPreferredOrientations( 12 | [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/custom_widgets/share.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:share/share.dart'; 3 | import 'package:url_launcher/url_launcher.dart'; 4 | 5 | launchURL(url) async { 6 | if (await canLaunch(url)) { 7 | await launch(url); 8 | } else { 9 | throw 'Could not launch $url'; 10 | } 11 | } 12 | 13 | share(BuildContext ctx, String extract, String url) { 14 | Share.share( 15 | "Found this Interesting article on Wikipedia\n\n${extract != null ? extract : ""}\n\n$url", 16 | subject: "Found this Interesting article on Wikipedia", 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | .vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fliki      [](https://play.google.com/store/apps/details?id=io.imgkl.flikipedia) 2 | A Minimalistic flutter application which uses Wiki Search API. 3 | 4 | ## Mockup and Implementation 5 |      6 | 7 | 8 | ## Features 9 | - State management (Provider) 10 | - Caching API responses 11 | - Adaptive icons on Android 12 | - Long press to share a result to other apps. 13 | - Clear caches in a single click 14 | - Toast messages to denote the user if he is seeing the cached data or from API 15 | - Native Splash screen 16 | - Dynamic Theme support (Persistant) 17 | - Haptic feedback in some places to improve UX 18 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flikipedia 2 | description: A Flutter application to get posts from wikipedia api 3 | 4 | publish_to: "none" 5 | 6 | version: 1.0.0+1 7 | 8 | environment: 9 | sdk: ">=2.7.0 <3.0.0" 10 | 11 | dependencies: 12 | flutter: 13 | sdk: flutter 14 | 15 | #Essentials 16 | path_provider: ^1.6.24 17 | provider: ^4.3.2+3 18 | google_fonts: ^1.1.1 19 | http: ^0.12.2 20 | cupertino_icons: ^1.0.0 21 | url_launcher: ^5.7.10 22 | shared_preferences: ^0.5.12+4 23 | cached_network_image: ^2.5.0 24 | get: ^3.24.0 25 | 26 | 27 | 28 | #Misc 29 | flutter_neumorphic: ^3.0.3 30 | flutter_spinkit: ^4.1.2+1 31 | fluttertoast: ^7.1.6 32 | shimmer: ^1.1.2 33 | share: ^0.6.5+4 34 | font_awesome_flutter: ^8.11.0 35 | 36 | 37 | 38 | dev_dependencies: 39 | flutter_test: 40 | sdk: flutter 41 | 42 | flutter: 43 | uses-material-design: true 44 | assets: 45 | - assets/ 46 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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 | -------------------------------------------------------------------------------- /lib/custom_widgets/app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flikipedia/custom_widgets/dynamic_text.dart'; 2 | import 'package:flikipedia/custom_widgets/theme_toggle.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class Appbar extends StatelessWidget { 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: const EdgeInsets.only(top: 58.0, right: 10, left: 10), 10 | child: Row( 11 | crossAxisAlignment: CrossAxisAlignment.center, 12 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 13 | children: [ 14 | ThemeToggle(), 15 | Align( 16 | alignment: Alignment.centerRight, 17 | child: Text( 18 | "fliki", 19 | style: Theme.of(context).textTheme.headline4.copyWith( 20 | fontWeight: FontWeight.bold, 21 | color: DynamicColor().getColor(1.0)), 22 | ), 23 | ), 24 | ], 25 | ), 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/custom_widgets/shimmer_image.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:shimmer/shimmer.dart'; 4 | 5 | class CacheImage extends StatelessWidget { 6 | final String url; 7 | 8 | const CacheImage({Key key, this.url}) : super(key: key); 9 | @override 10 | Widget build(BuildContext context) { 11 | return CachedNetworkImage( 12 | imageUrl: url, 13 | progressIndicatorBuilder: (context, url, downloadProgress) => 14 | Shimmer.fromColors( 15 | enabled: false, 16 | direction: ShimmerDirection.ltr, 17 | baseColor: Colors.transparent, 18 | highlightColor: Colors.white, 19 | child: Container( 20 | decoration: BoxDecoration( 21 | borderRadius: BorderRadius.circular(0), 22 | color: Colors.black, 23 | ), 24 | width: 80, 25 | height: 80, 26 | ), 27 | ), 28 | errorWidget: (context, url, error) => Image.network(url), 29 | height: 80, 30 | width: 80, 31 | fit: BoxFit.cover, 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 16 | 20 | -------------------------------------------------------------------------------- /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:flikipedia/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flikipedia/provider/search_provider.dart'; 2 | import 'package:flikipedia/screens/app.dart'; 3 | import 'package:flikipedia/utils/setup.dart'; 4 | import 'package:flikipedia/utils/theme_controller.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:get/get.dart'; 7 | import 'package:get/get_navigation/src/root/get_material_app.dart'; 8 | import 'package:google_fonts/google_fonts.dart'; 9 | import 'package:provider/provider.dart'; 10 | 11 | void main() async { 12 | //Initializing the necessary components 13 | await Util.initializeApp(); 14 | runApp(MyApp()); 15 | } 16 | 17 | class MyApp extends StatelessWidget { 18 | @override 19 | Widget build(BuildContext context) { 20 | //Setting the provider 21 | return ChangeNotifierProvider( 22 | create: (_) => SearchProvider(), 23 | child: GetMaterialApp( 24 | initialRoute: '/', 25 | debugShowCheckedModeBanner: false, 26 | title: 'Flikipedia', 27 | theme: ThemeData.light().copyWith( 28 | primaryColor: Colors.black, 29 | textTheme: GoogleFonts.ubuntuTextTheme( 30 | Theme.of(context).textTheme, 31 | ), 32 | ), 33 | darkTheme: ThemeData.dark().copyWith( 34 | primaryColor: Colors.black, 35 | textTheme: GoogleFonts.ubuntuTextTheme( 36 | Theme.of(context).textTheme, 37 | ), 38 | ), 39 | themeMode: ThemeController.to.themeMode, 40 | home: App(), 41 | ), 42 | ); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /lib/custom_widgets/gradient_circle.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | var smallGradient = new LinearGradient( 4 | colors: [const Color(0xFFFFFFFF), const Color(0xFF000000)], 5 | tileMode: TileMode.clamp, 6 | begin: Alignment.topCenter, 7 | end: Alignment.bottomCenter, 8 | stops: [0.0, 1.0]); 9 | 10 | var biggerGradinet = new LinearGradient( 11 | colors: [const Color(0xFFFFFFFF), const Color(0xFF000000)], 12 | tileMode: TileMode.clamp, 13 | begin: Alignment.bottomLeft, 14 | end: Alignment.topRight, 15 | stops: [0.0, 1.0]); 16 | 17 | class GradientCircles extends StatelessWidget { 18 | @override 19 | Widget build(BuildContext context) { 20 | return Stack( 21 | children: [ 22 | Positioned( 23 | top: -95.0, 24 | left: 110, 25 | right: -195.0, 26 | child: Opacity( 27 | opacity: 0.1, 28 | child: new Container( 29 | height: 900.0, 30 | decoration: BoxDecoration( 31 | gradient: smallGradient, shape: BoxShape.circle), 32 | ), 33 | ), 34 | ), 35 | Positioned( 36 | top: -65.0, 37 | right: -15.0, 38 | child: Opacity( 39 | opacity: 0.5, 40 | child: new Container( 41 | height: 120.0, 42 | width: 140.0, 43 | decoration: BoxDecoration( 44 | gradient: biggerGradinet, shape: BoxShape.circle), 45 | ), 46 | ), 47 | ), 48 | ], 49 | ); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"}]} -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | Fliki 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 | UIStatusBarHidden 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /lib/custom_widgets/theme_toggle.dart: -------------------------------------------------------------------------------- 1 | import 'package:flikipedia/utils/theme_controller.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 4 | import 'package:get/get.dart'; 5 | import 'package:flutter/services.dart'; 6 | 7 | class ThemeToggle extends StatelessWidget { 8 | @override 9 | Widget build(BuildContext context) { 10 | return Padding( 11 | padding: const EdgeInsets.all(8.0), 12 | child: GestureDetector( 13 | onTap: () { 14 | HapticFeedback.heavyImpact(); 15 | if (Get.theme.brightness == Brightness.light) { 16 | ThemeController.to.setThemeMode(ThemeMode.dark); 17 | } else { 18 | ThemeController.to.setThemeMode(ThemeMode.light); 19 | } 20 | }, 21 | child: Stack( 22 | children: [ 23 | Container( 24 | width: 40, 25 | height: 40, 26 | decoration: BoxDecoration( 27 | shape: BoxShape.circle, 28 | gradient: LinearGradient( 29 | colors: Get.theme.brightness == Brightness.light 30 | ? [ 31 | const Color(0xFF8983F7), 32 | const Color(0xFFA3DAFB), 33 | ] 34 | : [ 35 | const Color(0xDDFF0080), 36 | const Color(0xDDFF8C00), 37 | ], 38 | begin: Alignment.bottomLeft, 39 | end: Alignment.topRight, 40 | ), 41 | ), 42 | ), 43 | Positioned.fill( 44 | child: Icon(Get.theme.brightness != Brightness.light 45 | ? FontAwesomeIcons.sun 46 | : FontAwesomeIcons.moon), 47 | ), 48 | ], 49 | ), 50 | ), 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/custom_widgets/loading_states.dart: -------------------------------------------------------------------------------- 1 | import 'package:flikipedia/custom_widgets/dynamic_text.dart'; 2 | import 'package:flikipedia/enums/loading_states_enum.dart'; 3 | import 'package:flikipedia/provider/search_provider.dart'; 4 | import 'package:flutter/cupertino.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_spinkit/flutter_spinkit.dart'; 7 | 8 | class LoadingStates extends StatelessWidget { 9 | final SearchProvider searchProvider; 10 | 11 | const LoadingStates({Key key, this.searchProvider}) : super(key: key); 12 | @override 13 | Widget build(BuildContext context) { 14 | return searchProvider.isLoading 15 | ? Padding( 16 | padding: const EdgeInsets.only(top: 118.0), 17 | child: Align( 18 | alignment: Alignment.center, 19 | child: SpinKitDoubleBounce( 20 | color: Colors.grey, 21 | size: 60, 22 | )), 23 | ) 24 | : searchProvider.loadingStates == LOADING_STATES.EMPTY 25 | ? Padding( 26 | padding: const EdgeInsets.only(top: 118.0), 27 | child: Align( 28 | alignment: Alignment.center, 29 | child: Text("No results found.", 30 | style: Theme.of(context).textTheme.headline6.copyWith( 31 | color: DynamicColor().getColor(0.3), 32 | ))), 33 | ) 34 | : Padding( 35 | padding: const EdgeInsets.only(top: 118.0, left: 50), 36 | child: Align( 37 | alignment: Alignment.centerLeft, 38 | child: Text( 39 | "Type what you are looking for...", 40 | style: Theme.of(context).textTheme.headline6.copyWith( 41 | color: DynamicColor().getColor(0.3), 42 | ), 43 | ), 44 | ), 45 | ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - fluttertoast (0.0.2): 4 | - Flutter 5 | - Toast 6 | - FMDB (2.7.5): 7 | - FMDB/standard (= 2.7.5) 8 | - FMDB/standard (2.7.5) 9 | - path_provider (0.0.1): 10 | - Flutter 11 | - share (0.0.1): 12 | - Flutter 13 | - shared_preferences (0.0.1): 14 | - Flutter 15 | - sqflite (0.0.2): 16 | - Flutter 17 | - FMDB (>= 2.7.5) 18 | - Toast (4.0.0) 19 | - url_launcher (0.0.1): 20 | - Flutter 21 | 22 | DEPENDENCIES: 23 | - Flutter (from `Flutter`) 24 | - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) 25 | - path_provider (from `.symlinks/plugins/path_provider/ios`) 26 | - share (from `.symlinks/plugins/share/ios`) 27 | - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) 28 | - sqflite (from `.symlinks/plugins/sqflite/ios`) 29 | - url_launcher (from `.symlinks/plugins/url_launcher/ios`) 30 | 31 | SPEC REPOS: 32 | trunk: 33 | - FMDB 34 | - Toast 35 | 36 | EXTERNAL SOURCES: 37 | Flutter: 38 | :path: Flutter 39 | fluttertoast: 40 | :path: ".symlinks/plugins/fluttertoast/ios" 41 | path_provider: 42 | :path: ".symlinks/plugins/path_provider/ios" 43 | share: 44 | :path: ".symlinks/plugins/share/ios" 45 | shared_preferences: 46 | :path: ".symlinks/plugins/shared_preferences/ios" 47 | sqflite: 48 | :path: ".symlinks/plugins/sqflite/ios" 49 | url_launcher: 50 | :path: ".symlinks/plugins/url_launcher/ios" 51 | 52 | SPEC CHECKSUMS: 53 | Flutter: 0e3d915762c693b495b44d77113d4970485de6ec 54 | fluttertoast: 6122fa75143e992b1d3470f61000f591a798cc58 55 | FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a 56 | path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c 57 | share: 0b2c3e82132f5888bccca3351c504d0003b3b410 58 | shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d 59 | sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 60 | Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 61 | url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef 62 | 63 | PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c 64 | 65 | COCOAPODS: 1.9.3 66 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | def keystoreProperties = new Properties() 29 | def keystorePropertiesFile = rootProject.file('key.properties') 30 | if (keystorePropertiesFile.exists()) { 31 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 32 | } 33 | 34 | android { 35 | compileSdkVersion 29 36 | 37 | sourceSets { 38 | main.java.srcDirs += 'src/main/kotlin' 39 | } 40 | 41 | lintOptions { 42 | disable 'InvalidPackage' 43 | } 44 | 45 | defaultConfig { 46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 47 | applicationId "io.imgkl.flikipedia" 48 | minSdkVersion 16 49 | targetSdkVersion 29 50 | versionCode flutterVersionCode.toInteger() 51 | versionName flutterVersionName 52 | } 53 | 54 | signingConfigs { 55 | release { 56 | keyAlias keystoreProperties['keyAlias'] 57 | keyPassword keystoreProperties['keyPassword'] 58 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null 59 | storePassword keystoreProperties['storePassword'] 60 | } 61 | } 62 | 63 | buildTypes { 64 | release { 65 | signingConfig signingConfigs.release 66 | } 67 | } 68 | } 69 | 70 | flutter { 71 | source '../..' 72 | } 73 | 74 | dependencies { 75 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 76 | } 77 | -------------------------------------------------------------------------------- /lib/utils/theme_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | import 'package:get/get.dart'; 4 | 5 | import 'package:shared_preferences/shared_preferences.dart'; 6 | 7 | class ThemeController extends GetxController { 8 | static ThemeController get to => Get.find(); 9 | 10 | SharedPreferences prefs; 11 | ThemeMode _themeMode; 12 | ThemeMode get themeMode => _themeMode; 13 | Future setThemeMode(ThemeMode themeMode) async { 14 | Get.changeThemeMode(themeMode); 15 | _themeMode = themeMode; 16 | update(); 17 | prefs = await SharedPreferences.getInstance(); 18 | String themeTextString = themeMode.toString().split('.')[1]; 19 | setStatusBarBrightness(themeTextString); 20 | await prefs.setString('theme', themeTextString); 21 | } 22 | 23 | getThemeModeFromPreferences() async { 24 | ThemeMode themeMode; 25 | prefs = await SharedPreferences.getInstance(); 26 | String themeTextString = prefs.getString('theme') ?? 'system'; 27 | setStatusBarBrightness(themeTextString); 28 | if (themeTextString == "dark") { 29 | themeMode = ThemeMode.dark; 30 | } else if (themeTextString == "light") { 31 | themeMode = ThemeMode.light; 32 | } else { 33 | themeMode = ThemeMode.light; 34 | } 35 | setThemeMode(themeMode); 36 | } 37 | 38 | setStatusBarBrightness(themeTextString) { 39 | if (themeTextString == "dark") { 40 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( 41 | statusBarColor: Colors.transparent, 42 | statusBarBrightness: Brightness.dark, 43 | statusBarIconBrightness: Brightness.light, 44 | systemNavigationBarColor: Colors.black, 45 | systemNavigationBarIconBrightness: Brightness.light, 46 | )); 47 | } else if (themeTextString == "light") { 48 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( 49 | statusBarColor: Colors.transparent, 50 | statusBarBrightness: Brightness.light, 51 | statusBarIconBrightness: Brightness.dark, 52 | systemNavigationBarColor: Color(0xFFFFFFFF), 53 | systemNavigationBarIconBrightness: Brightness.dark, 54 | )); 55 | } else { 56 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( 57 | statusBarColor: Colors.transparent, 58 | statusBarBrightness: Brightness.dark, 59 | statusBarIconBrightness: Brightness.light, 60 | systemNavigationBarColor: Colors.black, 61 | systemNavigationBarIconBrightness: Brightness.light, 62 | )); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 9 | 10 | 14 | 21 | 25 | 29 | 34 | 38 | 39 | 40 | 41 | 42 | 43 | 45 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /lib/custom_widgets/input_feild.dart: -------------------------------------------------------------------------------- 1 | import 'package:flikipedia/custom_widgets/dynamic_text.dart'; 2 | import 'package:flikipedia/provider/search_provider.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | import 'package:get/get.dart'; 6 | 7 | class InputFeild extends StatefulWidget { 8 | final TextEditingController textController; 9 | final SearchProvider searchProvider; 10 | final Function addItem; 11 | 12 | const InputFeild( 13 | {Key key, this.textController, this.searchProvider, this.addItem}) 14 | : super(key: key); 15 | 16 | @override 17 | _InputFeildState createState() => _InputFeildState(); 18 | } 19 | 20 | class _InputFeildState extends State { 21 | @override 22 | void initState() { 23 | super.initState(); 24 | } 25 | 26 | @override 27 | Widget build(BuildContext context) { 28 | return TextField( 29 | style: Theme.of(context).textTheme.headline2.copyWith( 30 | color: Get.theme.brightness.toString() == "Brightness.light" 31 | ? Colors.black 32 | : Colors.white, 33 | fontWeight: FontWeight.bold, 34 | ), 35 | textCapitalization: TextCapitalization.words, 36 | controller: widget.textController, 37 | textInputAction: TextInputAction.search, 38 | onSubmitted: (text) { 39 | HapticFeedback.lightImpact(); 40 | setState(() async { 41 | if (text != null && text.length > 0) { 42 | widget.textController.text = text; 43 | widget.searchProvider.searchApi(text, context); 44 | widget.addItem(); 45 | } 46 | FocusScope.of(context).unfocus(); 47 | }); 48 | }, 49 | cursorColor: DynamicColor().getColor(1.0), 50 | decoration: InputDecoration( 51 | suffixIcon: (widget.textController.text.length > 0) 52 | ? IconButton( 53 | icon: Icon(Icons.clear, color: DynamicColor().getColor(1.0)), 54 | onPressed: () { 55 | setState(() { 56 | widget.textController.clear(); 57 | }); 58 | }) 59 | : Container( 60 | height: 0, 61 | width: 0, 62 | ), 63 | focusedBorder: OutlineInputBorder( 64 | borderRadius: BorderRadius.circular(0), 65 | borderSide: BorderSide( 66 | color: DynamicColor().getColor(0.1), 67 | )), 68 | enabledBorder: OutlineInputBorder( 69 | borderRadius: BorderRadius.circular(0), 70 | borderSide: BorderSide( 71 | color: DynamicColor().getColor(0.1), 72 | )), 73 | contentPadding: 74 | const EdgeInsets.symmetric(vertical: 40.0, horizontal: 10), 75 | border: OutlineInputBorder( 76 | borderRadius: BorderRadius.circular(0), 77 | borderSide: BorderSide( 78 | color: DynamicColor().getColor(0.1), 79 | ), 80 | ), 81 | hintText: " Search", 82 | hintStyle: TextStyle( 83 | color: DynamicColor().getColor(0.3), 84 | )), 85 | ); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /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 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /lib/screens/search_result_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flikipedia/custom_widgets/share.dart'; 2 | import 'package:flikipedia/custom_widgets/shimmer_image.dart'; 3 | import 'package:flikipedia/model/search_result.dart'; 4 | import 'package:flikipedia/provider/search_provider.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter/services.dart'; 7 | import 'package:provider/provider.dart'; 8 | 9 | class SearchResultScreen extends StatelessWidget { 10 | final SearchResult searchResult; 11 | final String resultQuery; 12 | 13 | const SearchResultScreen({Key key, this.searchResult, this.resultQuery}) 14 | : super(key: key); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | var searchResultData = searchResult.query; 19 | return Consumer( 20 | builder: (context, searchProvider, _) { 21 | return Scaffold( 22 | // backgroundColor: Colors.white, 23 | appBar: AppBar( 24 | title: Text("Results for '$resultQuery'"), 25 | backgroundColor: Colors.black, 26 | ), 27 | body: ListView.builder( 28 | itemCount: searchResult.query.pages.length, 29 | itemBuilder: (context, index) { 30 | return Padding( 31 | padding: const EdgeInsets.all(8.0), 32 | child: Card( 33 | shape: RoundedRectangleBorder( 34 | borderRadius: BorderRadius.circular(10)), 35 | elevation: 5, 36 | // color: DynamicColor().getColor(1.0), 37 | child: ClipRRect( 38 | borderRadius: BorderRadius.circular(10), 39 | child: ListTile( 40 | onLongPress: () { 41 | HapticFeedback.heavyImpact(); 42 | share(context, searchResultData.pages[index].extract, 43 | searchResultData.pages[index].url); 44 | }, 45 | onTap: () { 46 | launchURL(searchResultData.pages[index].url); 47 | }, 48 | tileColor: Colors.white, 49 | contentPadding: EdgeInsets.all(8.0), 50 | leading: searchResultData.pages[index].thumbnail != null 51 | ? searchResultData.pages[index] != null 52 | ? CacheImage( 53 | url: searchResultData 54 | .pages[index].thumbnail.source, 55 | ) 56 | : Image.asset("assets/wiki_logo.png") 57 | : Image.asset( 58 | "assets/wiki_logo.png", 59 | scale: 8, 60 | height: 80, 61 | width: 80, 62 | ), 63 | subtitle: Text( 64 | searchResultData.pages[index].terms != null 65 | ? searchResultData 66 | .pages[index].terms.description[0] 67 | : "Description not available", 68 | ), 69 | title: Text( 70 | searchResult.query.pages[index].title, 71 | style: Theme.of(context).textTheme.headline6, 72 | ), 73 | isThreeLine: true, 74 | ), 75 | ), 76 | ), 77 | ); 78 | }), 79 | ); 80 | }, 81 | ); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /lib/provider/search_provider.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | import 'package:flikipedia/enums/loading_states_enum.dart'; 4 | import 'package:flikipedia/model/search_result.dart'; 5 | import 'package:flikipedia/screens/search_result_screen.dart'; 6 | import 'package:flutter/cupertino.dart'; 7 | import 'package:flutter/material.dart'; 8 | import 'package:fluttertoast/fluttertoast.dart'; 9 | import 'package:http/http.dart' as http; 10 | import 'package:path_provider/path_provider.dart'; 11 | 12 | class SearchProvider extends ChangeNotifier { 13 | SearchResult searchResult; 14 | bool emptyResult = false; 15 | bool isLoading = false; 16 | bool isCache = false; 17 | int screen = 0; 18 | LOADING_STATES loadingStates = LOADING_STATES.IDLE; 19 | 20 | SearchProvider get searchProvider => SearchProvider(); 21 | 22 | deleteAllCache() async { 23 | //Deleting the cache files which is stored in the temporary directory 24 | var cacheDir = (await getTemporaryDirectory()).path; 25 | Directory(cacheDir).delete(recursive: true); 26 | } 27 | 28 | searchApi(String substring, BuildContext ctx) async { 29 | this.loadingStates = LOADING_STATES.IDLE; 30 | isLoading = true; 31 | notifyListeners(); 32 | String fileName = "$substring.json"; 33 | var cacheDir = await getTemporaryDirectory(); 34 | if (await File(cacheDir.path + "/" + fileName).exists()) { 35 | print("Loading from cache"); 36 | var jsonData = File(cacheDir.path + "/" + fileName).readAsStringSync(); 37 | searchResult = SearchResult.fromJson(json.decode(jsonData)); 38 | isLoading = false; 39 | notifyListeners(); 40 | if (searchResult.query != null) { 41 | isCache = true; 42 | notifyListeners(); 43 | Navigator.push( 44 | ctx, 45 | CupertinoPageRoute( 46 | builder: (context) => SearchResultScreen( 47 | searchResult: searchResult, 48 | resultQuery: substring, 49 | ), 50 | )); 51 | Fluttertoast.showToast( 52 | msg: "This is a cached response.", 53 | toastLength: Toast.LENGTH_SHORT, 54 | gravity: ToastGravity.BOTTOM, 55 | timeInSecForIosWeb: 1, 56 | backgroundColor: Colors.black, 57 | textColor: Colors.white, 58 | fontSize: 16.0); 59 | notifyListeners(); 60 | } else { 61 | this.loadingStates = LOADING_STATES.EMPTY; 62 | notifyListeners(); 63 | } 64 | } else { 65 | print("fetching from API"); 66 | var sepString = substring.trim().split(' '); 67 | var searchString = sepString.join('_'); 68 | await http 69 | .get( 70 | "https://en.wikipedia.org//w/api.php?action=query&format=json&prop=extracts%7Cpageimages%7Cpageterms%7Cinfo&inprop=url&generator=prefixsearch&formatversion=2&piprop=thumbnail&pithumbsize=600&wbptterms=description&gpssearch=$searchString&exsentences=5&exintro=1&explaintext=1&gpslimit=50") 71 | .then((value) async { 72 | this.isLoading = false; 73 | notifyListeners(); 74 | searchResult = SearchResult.fromJson(json.decode(value.body)); 75 | var jsonResponse = value.body; 76 | var tempDir = await getTemporaryDirectory(); 77 | File file = new File(tempDir.path + "/" + fileName); 78 | file.writeAsString(jsonResponse, flush: true, mode: FileMode.write); 79 | if (searchResult.query != null) { 80 | Navigator.push( 81 | ctx, 82 | CupertinoPageRoute( 83 | builder: (context) => SearchResultScreen( 84 | searchResult: searchResult, 85 | resultQuery: substring, 86 | ), 87 | )); 88 | } else { 89 | this.loadingStates = LOADING_STATES.EMPTY; 90 | notifyListeners(); 91 | } 92 | }); 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /lib/screens/app.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'package:flikipedia/custom_widgets/app_bar.dart'; 3 | import 'package:flikipedia/custom_widgets/gradient_circle.dart'; 4 | import 'package:flikipedia/custom_widgets/input_feild.dart'; 5 | import 'package:flikipedia/custom_widgets/loading_states.dart'; 6 | import 'package:flikipedia/custom_widgets/recent_history.dart'; 7 | import 'package:flikipedia/model/recents.model.dart'; 8 | import 'package:flikipedia/provider/search_provider.dart'; 9 | import 'package:flutter/cupertino.dart'; 10 | import 'package:flutter/material.dart'; 11 | import 'package:provider/provider.dart'; 12 | import 'package:shared_preferences/shared_preferences.dart'; 13 | 14 | class App extends StatefulWidget { 15 | @override 16 | _AppState createState() => _AppState(); 17 | } 18 | 19 | class _AppState extends State with SingleTickerProviderStateMixin { 20 | String query = ""; 21 | List list = new List(); 22 | SharedPreferences sharedPreferences; 23 | TextEditingController textController = TextEditingController(); 24 | 25 | @override 26 | void initState() { 27 | //Getting the recents which is stored in Shared Pref 28 | loadSharedPreferencesAndData(); 29 | super.initState(); 30 | } 31 | 32 | void loadData() { 33 | //Loading the reselts data and mapping them to List of Type "Result" 34 | List listString = sharedPreferences.getStringList('list'); 35 | if (listString != null) { 36 | setState(() { 37 | list = listString 38 | .map((item) => Recents.fromMap(json.decode(item))) 39 | .toList(); 40 | }); 41 | } else { 42 | list = List(); 43 | } 44 | } 45 | 46 | removeData() async { 47 | //Remove all recents 48 | await sharedPreferences.clear(); 49 | loadData(); 50 | } 51 | 52 | void loadSharedPreferencesAndData() async { 53 | //Initializing the shared preferences 54 | sharedPreferences = await SharedPreferences.getInstance(); 55 | loadData(); 56 | } 57 | 58 | addItem(Recents item) { 59 | //Adding the item to the recents 60 | if (list.isEmpty || list[0].title != item.title) { 61 | list.insert(0, item); 62 | } 63 | saveData(); 64 | } 65 | 66 | void saveData() { 67 | //Saving the recents data in the shared preferences 68 | List stringList = 69 | list.map((item) => json.encode(item.toMap())).toList(); 70 | sharedPreferences.setStringList('list', stringList); 71 | } 72 | 73 | @override 74 | Widget build(BuildContext context) { 75 | return Consumer( 76 | builder: (context, searchProvider, _) { 77 | return Scaffold( 78 | resizeToAvoidBottomInset: false, 79 | body: Stack( 80 | children: [ 81 | GradientCircles(), 82 | LoadingStates( 83 | searchProvider: searchProvider, 84 | ), 85 | Column( 86 | children: [ 87 | Appbar(), 88 | Expanded( 89 | child: Center( 90 | child: Padding( 91 | padding: const EdgeInsets.only( 92 | left: 18.0, right: 18.0, bottom: 120), 93 | child: InputFeild( 94 | textController: textController, 95 | searchProvider: searchProvider, 96 | addItem: () { 97 | addItem(Recents(title: textController.text)); 98 | }), 99 | ), 100 | ), 101 | ), 102 | RecentHistory( 103 | searchProvider: searchProvider, 104 | recentList: list, 105 | removeRecent: () => removeData(), 106 | loadList: () => loadSharedPreferencesAndData(), 107 | ) 108 | ], 109 | ), 110 | ], 111 | ), 112 | ); 113 | }, 114 | ); 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /lib/model/search_result.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | // Model for the SearchResult 4 | 5 | SearchResult searchResultFromJson(String str) => 6 | SearchResult.fromJson(json.decode(str)); 7 | 8 | String searchResultToJson(SearchResult data) => json.encode(data.toJson()); 9 | 10 | class SearchResult { 11 | SearchResult({ 12 | this.batchcomplete, 13 | this.searchResultContinue, 14 | this.query, 15 | }); 16 | 17 | bool batchcomplete; 18 | Continue searchResultContinue; 19 | Query query; 20 | 21 | factory SearchResult.fromJson(Map json) => SearchResult( 22 | batchcomplete: 23 | json["batchcomplete"] == null ? null : json["batchcomplete"], 24 | searchResultContinue: json["continue"] == null 25 | ? null 26 | : Continue.fromJson(json["continue"]), 27 | query: json["query"] == null ? null : Query.fromJson(json["query"]), 28 | ); 29 | 30 | Map toJson() => { 31 | "batchcomplete": batchcomplete == null ? null : batchcomplete, 32 | "continue": 33 | searchResultContinue == null ? null : searchResultContinue.toJson(), 34 | "query": query == null ? null : query.toJson(), 35 | }; 36 | } 37 | 38 | class Query { 39 | Query({ 40 | this.pages, 41 | }); 42 | 43 | List pages; 44 | 45 | factory Query.fromJson(Map json) => Query( 46 | pages: json["pages"] == null 47 | ? null 48 | : List.from(json["pages"].map((x) => Page.fromJson(x))), 49 | ); 50 | 51 | Map toJson() => { 52 | "pages": pages == null 53 | ? null 54 | : List.from(pages.map((x) => x.toJson())), 55 | }; 56 | } 57 | 58 | class Page { 59 | Page({ 60 | this.pageid, 61 | this.ns, 62 | this.title, 63 | this.index, 64 | this.extract, 65 | this.thumbnail, 66 | this.terms, 67 | this.url, 68 | }); 69 | String extract; 70 | int pageid; 71 | int ns; 72 | String url; 73 | String title; 74 | int index; 75 | Thumbnail thumbnail; 76 | Terms terms; 77 | 78 | factory Page.fromJson(Map json) => Page( 79 | pageid: json["pageid"] == null ? null : json["pageid"], 80 | ns: json["ns"] == null ? null : json["ns"], 81 | title: json["title"] == null ? null : json["title"], 82 | index: json["index"] == null ? null : json["index"], 83 | thumbnail: json["thumbnail"] == null 84 | ? null 85 | : Thumbnail.fromJson(json["thumbnail"]), 86 | extract: json["extract"] == null ? null : json["extract"], 87 | url: json["fullurl"] == null ? null : json["fullurl"], 88 | terms: json["terms"] == null ? null : Terms.fromJson(json["terms"]), 89 | ); 90 | 91 | Map toJson() => { 92 | "pageid": pageid == null ? null : pageid, 93 | "ns": ns == null ? null : ns, 94 | "title": title == null ? null : title, 95 | "index": index == null ? null : index, 96 | "url": url == null ? null : url, 97 | "extract": extract == null ? null : extract, 98 | "thumbnail": thumbnail == null ? null : thumbnail.toJson(), 99 | "terms": terms == null ? null : terms.toJson(), 100 | }; 101 | } 102 | 103 | class Terms { 104 | Terms({ 105 | this.description, 106 | }); 107 | 108 | List description; 109 | 110 | factory Terms.fromJson(Map json) => Terms( 111 | description: json["description"] == null 112 | ? null 113 | : List.from(json["description"].map((x) => x)), 114 | ); 115 | 116 | Map toJson() => { 117 | "description": description == null 118 | ? null 119 | : List.from(description.map((x) => x)), 120 | }; 121 | } 122 | 123 | class Thumbnail { 124 | Thumbnail({ 125 | this.source, 126 | this.width, 127 | this.height, 128 | }); 129 | 130 | String source; 131 | int width; 132 | int height; 133 | 134 | factory Thumbnail.fromJson(Map json) => Thumbnail( 135 | source: json["source"] == null ? null : json["source"], 136 | width: json["width"] == null ? null : json["width"], 137 | height: json["height"] == null ? null : json["height"], 138 | ); 139 | 140 | Map toJson() => { 141 | "source": source == null ? null : source, 142 | "width": width == null ? null : width, 143 | "height": height == null ? null : height, 144 | }; 145 | } 146 | 147 | class Continue { 148 | Continue({ 149 | this.gpsoffset, 150 | this.continueContinue, 151 | }); 152 | 153 | int gpsoffset; 154 | String continueContinue; 155 | 156 | factory Continue.fromJson(Map json) => Continue( 157 | gpsoffset: json["gpsoffset"] == null ? null : json["gpsoffset"], 158 | continueContinue: json["continue"] == null ? null : json["continue"], 159 | ); 160 | 161 | Map toJson() => { 162 | "gpsoffset": gpsoffset == null ? null : gpsoffset, 163 | "continue": continueContinue == null ? null : continueContinue, 164 | }; 165 | } 166 | -------------------------------------------------------------------------------- /lib/custom_widgets/recent_history.dart: -------------------------------------------------------------------------------- 1 | import 'package:flikipedia/model/recents.model.dart'; 2 | import 'package:flikipedia/provider/search_provider.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | import 'package:flutter_neumorphic/flutter_neumorphic.dart'; 6 | 7 | class RecentHistory extends StatefulWidget { 8 | final SearchProvider searchProvider; 9 | final List recentList; 10 | final Function removeRecent; 11 | final Function loadList; 12 | 13 | const RecentHistory( 14 | {Key key, 15 | this.searchProvider, 16 | this.loadList, 17 | this.recentList, 18 | this.removeRecent}) 19 | : super(key: key); 20 | @override 21 | _RecentHistoryState createState() => _RecentHistoryState(); 22 | } 23 | 24 | class _RecentHistoryState extends State { 25 | List list = new List(); 26 | 27 | @override 28 | void initState() { 29 | widget.loadList(); 30 | super.initState(); 31 | } 32 | 33 | @override 34 | Widget build(BuildContext context) { 35 | final screenWidth = MediaQuery.of(context).size.width; 36 | final screenHeight = MediaQuery.of(context).size.height; 37 | return Align( 38 | alignment: Alignment.bottomRight, 39 | child: Container( 40 | decoration: BoxDecoration( 41 | color: Colors.black, 42 | boxShadow: [ 43 | BoxShadow( 44 | color: Colors.black, 45 | blurRadius: 25.0, 46 | ), 47 | ], 48 | borderRadius: BorderRadius.only( 49 | topLeft: Radius.circular(40.0), 50 | ), 51 | ), 52 | height: screenHeight * 0.22, 53 | width: screenWidth * 0.9, 54 | child: Padding( 55 | padding: const EdgeInsets.only(top: 18.0, left: 20), 56 | child: Column( 57 | crossAxisAlignment: CrossAxisAlignment.start, 58 | children: [ 59 | Row( 60 | crossAxisAlignment: CrossAxisAlignment.center, 61 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 62 | children: [ 63 | Padding( 64 | padding: const EdgeInsets.only(top: 8.0), 65 | child: Text( 66 | "Your recent history...", 67 | style: TextStyle( 68 | color: Colors.white.withOpacity(0.5), fontSize: 17), 69 | ), 70 | ), 71 | if (widget.recentList.isNotEmpty) 72 | Padding( 73 | padding: const EdgeInsets.only(right: 8.0), 74 | child: OutlineButton( 75 | borderSide: BorderSide(color: Colors.red), 76 | shape: new RoundedRectangleBorder( 77 | borderRadius: new BorderRadius.circular(20.0)), 78 | onPressed: () async { 79 | HapticFeedback.heavyImpact(); 80 | setState(() { 81 | widget.removeRecent(); 82 | widget.loadList(); 83 | widget.recentList.clear(); 84 | widget.searchProvider.deleteAllCache(); 85 | }); 86 | }, 87 | child: Text( 88 | "Clear All", 89 | style: TextStyle(color: Colors.red, fontSize: 17), 90 | ), 91 | ), 92 | ), 93 | ], 94 | ), 95 | if (widget.recentList.isEmpty) 96 | Padding( 97 | padding: const EdgeInsets.only(top: 18.0), 98 | child: Text("Search something...", 99 | style: TextStyle(color: Colors.white, fontSize: 17)), 100 | ), 101 | Container( 102 | height: 53, 103 | child: ListView.builder( 104 | scrollDirection: Axis.horizontal, 105 | shrinkWrap: true, 106 | itemCount: (widget.recentList != null && 107 | widget.recentList.isNotEmpty) 108 | ? (widget.recentList.length >= 5) 109 | ? 5 110 | : widget.recentList.length 111 | : 0, 112 | itemBuilder: (context, index) { 113 | return Padding( 114 | padding: const EdgeInsets.all(8.0), 115 | child: GestureDetector( 116 | onTap: () { 117 | widget.searchProvider.searchApi( 118 | widget.recentList[index].title, context); 119 | }, 120 | child: NeumorphicButton( 121 | style: NeumorphicStyle( 122 | color: Colors.white, 123 | shape: NeumorphicShape.convex, 124 | border: NeumorphicBorder()), 125 | onPressed: () { 126 | widget.searchProvider.searchApi( 127 | widget.recentList[index].title, context); 128 | }, 129 | child: Text( 130 | widget.recentList[index].title, 131 | ), 132 | ), 133 | ), 134 | ); 135 | }), 136 | ) 137 | ], 138 | ), 139 | ), 140 | ), 141 | ); 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.0.13" 11 | args: 12 | dependency: transitive 13 | description: 14 | name: args 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "1.6.0" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.5.0-nullsafety.1" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.1.0-nullsafety.1" 32 | cached_network_image: 33 | dependency: "direct main" 34 | description: 35 | name: cached_network_image 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "2.5.0" 39 | characters: 40 | dependency: transitive 41 | description: 42 | name: characters 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.1.0-nullsafety.3" 46 | charcode: 47 | dependency: transitive 48 | description: 49 | name: charcode 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.2.0-nullsafety.1" 53 | clock: 54 | dependency: transitive 55 | description: 56 | name: clock 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.1.0-nullsafety.1" 60 | collection: 61 | dependency: transitive 62 | description: 63 | name: collection 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.15.0-nullsafety.3" 67 | convert: 68 | dependency: transitive 69 | description: 70 | name: convert 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "2.1.1" 74 | crypto: 75 | dependency: transitive 76 | description: 77 | name: crypto 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "2.1.5" 81 | cupertino_icons: 82 | dependency: "direct main" 83 | description: 84 | name: cupertino_icons 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "1.0.0" 88 | fake_async: 89 | dependency: transitive 90 | description: 91 | name: fake_async 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "1.2.0-nullsafety.1" 95 | ffi: 96 | dependency: transitive 97 | description: 98 | name: ffi 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "0.1.3" 102 | file: 103 | dependency: transitive 104 | description: 105 | name: file 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "5.2.1" 109 | flutter: 110 | dependency: "direct main" 111 | description: flutter 112 | source: sdk 113 | version: "0.0.0" 114 | flutter_blurhash: 115 | dependency: transitive 116 | description: 117 | name: flutter_blurhash 118 | url: "https://pub.dartlang.org" 119 | source: hosted 120 | version: "0.5.0" 121 | flutter_cache_manager: 122 | dependency: transitive 123 | description: 124 | name: flutter_cache_manager 125 | url: "https://pub.dartlang.org" 126 | source: hosted 127 | version: "2.1.0" 128 | flutter_test: 129 | dependency: "direct dev" 130 | description: flutter 131 | source: sdk 132 | version: "0.0.0" 133 | flutter_web_plugins: 134 | dependency: transitive 135 | description: flutter 136 | source: sdk 137 | version: "0.0.0" 138 | fluttertoast: 139 | dependency: "direct main" 140 | description: 141 | name: fluttertoast 142 | url: "https://pub.dartlang.org" 143 | source: hosted 144 | version: "7.1.6" 145 | google_fonts: 146 | dependency: "direct main" 147 | description: 148 | name: google_fonts 149 | url: "https://pub.dartlang.org" 150 | source: hosted 151 | version: "1.1.1" 152 | http: 153 | dependency: "direct main" 154 | description: 155 | name: http 156 | url: "https://pub.dartlang.org" 157 | source: hosted 158 | version: "0.12.2" 159 | http_parser: 160 | dependency: transitive 161 | description: 162 | name: http_parser 163 | url: "https://pub.dartlang.org" 164 | source: hosted 165 | version: "3.1.4" 166 | image: 167 | dependency: transitive 168 | description: 169 | name: image 170 | url: "https://pub.dartlang.org" 171 | source: hosted 172 | version: "2.1.19" 173 | intl: 174 | dependency: transitive 175 | description: 176 | name: intl 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "0.16.1" 180 | matcher: 181 | dependency: transitive 182 | description: 183 | name: matcher 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "0.12.10-nullsafety.1" 187 | meta: 188 | dependency: transitive 189 | description: 190 | name: meta 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "1.3.0-nullsafety.3" 194 | mime: 195 | dependency: transitive 196 | description: 197 | name: mime 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "0.9.7" 201 | nested: 202 | dependency: transitive 203 | description: 204 | name: nested 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "0.0.4" 208 | octo_image: 209 | dependency: transitive 210 | description: 211 | name: octo_image 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "0.3.0" 215 | path: 216 | dependency: transitive 217 | description: 218 | name: path 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "1.8.0-nullsafety.1" 222 | path_provider: 223 | dependency: "direct main" 224 | description: 225 | name: path_provider 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "1.6.24" 229 | path_provider_linux: 230 | dependency: transitive 231 | description: 232 | name: path_provider_linux 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "0.0.1+2" 236 | path_provider_macos: 237 | dependency: transitive 238 | description: 239 | name: path_provider_macos 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "0.0.4+6" 243 | path_provider_platform_interface: 244 | dependency: transitive 245 | description: 246 | name: path_provider_platform_interface 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "1.0.4" 250 | path_provider_windows: 251 | dependency: transitive 252 | description: 253 | name: path_provider_windows 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "0.0.4+3" 257 | pedantic: 258 | dependency: transitive 259 | description: 260 | name: pedantic 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "1.9.2" 264 | petitparser: 265 | dependency: transitive 266 | description: 267 | name: petitparser 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "3.1.0" 271 | platform: 272 | dependency: transitive 273 | description: 274 | name: platform 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "2.2.1" 278 | plugin_platform_interface: 279 | dependency: transitive 280 | description: 281 | name: plugin_platform_interface 282 | url: "https://pub.dartlang.org" 283 | source: hosted 284 | version: "1.0.3" 285 | process: 286 | dependency: transitive 287 | description: 288 | name: process 289 | url: "https://pub.dartlang.org" 290 | source: hosted 291 | version: "3.0.13" 292 | provider: 293 | dependency: "direct main" 294 | description: 295 | name: provider 296 | url: "https://pub.dartlang.org" 297 | source: hosted 298 | version: "4.3.2+3" 299 | rxdart: 300 | dependency: transitive 301 | description: 302 | name: rxdart 303 | url: "https://pub.dartlang.org" 304 | source: hosted 305 | version: "0.25.0" 306 | share: 307 | dependency: "direct main" 308 | description: 309 | name: share 310 | url: "https://pub.dartlang.org" 311 | source: hosted 312 | version: "0.6.5+4" 313 | shared_preferences: 314 | dependency: "direct main" 315 | description: 316 | name: shared_preferences 317 | url: "https://pub.dartlang.org" 318 | source: hosted 319 | version: "0.5.12+4" 320 | shared_preferences_linux: 321 | dependency: transitive 322 | description: 323 | name: shared_preferences_linux 324 | url: "https://pub.dartlang.org" 325 | source: hosted 326 | version: "0.0.2+4" 327 | shared_preferences_macos: 328 | dependency: transitive 329 | description: 330 | name: shared_preferences_macos 331 | url: "https://pub.dartlang.org" 332 | source: hosted 333 | version: "0.0.1+11" 334 | shared_preferences_platform_interface: 335 | dependency: transitive 336 | description: 337 | name: shared_preferences_platform_interface 338 | url: "https://pub.dartlang.org" 339 | source: hosted 340 | version: "1.0.4" 341 | shared_preferences_web: 342 | dependency: transitive 343 | description: 344 | name: shared_preferences_web 345 | url: "https://pub.dartlang.org" 346 | source: hosted 347 | version: "0.1.2+7" 348 | shared_preferences_windows: 349 | dependency: transitive 350 | description: 351 | name: shared_preferences_windows 352 | url: "https://pub.dartlang.org" 353 | source: hosted 354 | version: "0.0.1+3" 355 | shimmer: 356 | dependency: "direct main" 357 | description: 358 | name: shimmer 359 | url: "https://pub.dartlang.org" 360 | source: hosted 361 | version: "1.1.2" 362 | sky_engine: 363 | dependency: transitive 364 | description: flutter 365 | source: sdk 366 | version: "0.0.99" 367 | source_span: 368 | dependency: transitive 369 | description: 370 | name: source_span 371 | url: "https://pub.dartlang.org" 372 | source: hosted 373 | version: "1.8.0-nullsafety.2" 374 | sqflite: 375 | dependency: transitive 376 | description: 377 | name: sqflite 378 | url: "https://pub.dartlang.org" 379 | source: hosted 380 | version: "1.3.2+1" 381 | sqflite_common: 382 | dependency: transitive 383 | description: 384 | name: sqflite_common 385 | url: "https://pub.dartlang.org" 386 | source: hosted 387 | version: "1.0.2+1" 388 | stack_trace: 389 | dependency: transitive 390 | description: 391 | name: stack_trace 392 | url: "https://pub.dartlang.org" 393 | source: hosted 394 | version: "1.10.0-nullsafety.1" 395 | stream_channel: 396 | dependency: transitive 397 | description: 398 | name: stream_channel 399 | url: "https://pub.dartlang.org" 400 | source: hosted 401 | version: "2.1.0-nullsafety.1" 402 | string_scanner: 403 | dependency: transitive 404 | description: 405 | name: string_scanner 406 | url: "https://pub.dartlang.org" 407 | source: hosted 408 | version: "1.1.0-nullsafety.1" 409 | synchronized: 410 | dependency: transitive 411 | description: 412 | name: synchronized 413 | url: "https://pub.dartlang.org" 414 | source: hosted 415 | version: "2.2.0+2" 416 | term_glyph: 417 | dependency: transitive 418 | description: 419 | name: term_glyph 420 | url: "https://pub.dartlang.org" 421 | source: hosted 422 | version: "1.2.0-nullsafety.1" 423 | test_api: 424 | dependency: transitive 425 | description: 426 | name: test_api 427 | url: "https://pub.dartlang.org" 428 | source: hosted 429 | version: "0.2.19-nullsafety.2" 430 | typed_data: 431 | dependency: transitive 432 | description: 433 | name: typed_data 434 | url: "https://pub.dartlang.org" 435 | source: hosted 436 | version: "1.3.0-nullsafety.3" 437 | url_launcher: 438 | dependency: "direct main" 439 | description: 440 | name: url_launcher 441 | url: "https://pub.dartlang.org" 442 | source: hosted 443 | version: "5.7.10" 444 | url_launcher_linux: 445 | dependency: transitive 446 | description: 447 | name: url_launcher_linux 448 | url: "https://pub.dartlang.org" 449 | source: hosted 450 | version: "0.0.1+4" 451 | url_launcher_macos: 452 | dependency: transitive 453 | description: 454 | name: url_launcher_macos 455 | url: "https://pub.dartlang.org" 456 | source: hosted 457 | version: "0.0.1+9" 458 | url_launcher_platform_interface: 459 | dependency: transitive 460 | description: 461 | name: url_launcher_platform_interface 462 | url: "https://pub.dartlang.org" 463 | source: hosted 464 | version: "1.0.9" 465 | url_launcher_web: 466 | dependency: transitive 467 | description: 468 | name: url_launcher_web 469 | url: "https://pub.dartlang.org" 470 | source: hosted 471 | version: "0.1.5+1" 472 | url_launcher_windows: 473 | dependency: transitive 474 | description: 475 | name: url_launcher_windows 476 | url: "https://pub.dartlang.org" 477 | source: hosted 478 | version: "0.0.1+3" 479 | uuid: 480 | dependency: transitive 481 | description: 482 | name: uuid 483 | url: "https://pub.dartlang.org" 484 | source: hosted 485 | version: "2.2.2" 486 | vector_math: 487 | dependency: transitive 488 | description: 489 | name: vector_math 490 | url: "https://pub.dartlang.org" 491 | source: hosted 492 | version: "2.1.0-nullsafety.3" 493 | win32: 494 | dependency: transitive 495 | description: 496 | name: win32 497 | url: "https://pub.dartlang.org" 498 | source: hosted 499 | version: "1.7.4" 500 | xdg_directories: 501 | dependency: transitive 502 | description: 503 | name: xdg_directories 504 | url: "https://pub.dartlang.org" 505 | source: hosted 506 | version: "0.1.2" 507 | xml: 508 | dependency: transitive 509 | description: 510 | name: xml 511 | url: "https://pub.dartlang.org" 512 | source: hosted 513 | version: "4.5.1" 514 | sdks: 515 | dart: ">=2.10.2 <2.11.0" 516 | flutter: ">=1.22.2 <2.0.0" 517 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | E900586C03012F15CF49A340 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E57D19E5200C5117D1AB3A1B /* Pods_Runner.framework */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXCopyFilesBuildPhase section */ 20 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 21 | isa = PBXCopyFilesBuildPhase; 22 | buildActionMask = 2147483647; 23 | dstPath = ""; 24 | dstSubfolderSpec = 10; 25 | files = ( 26 | ); 27 | name = "Embed Frameworks"; 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 34 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 35 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 36 | 3E899E8ACE8D0B7B0E658D12 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 37 | 56E79C0BB0A4376B94385DA4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 38 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 39 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 40 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 41 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 42 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 43 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 45 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 46 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 47 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | ABCF1A30C2217C9DF05ADE09 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 49 | E57D19E5200C5117D1AB3A1B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | E900586C03012F15CF49A340 /* Pods_Runner.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXFrameworksBuildPhase section */ 62 | 63 | /* Begin PBXGroup section */ 64 | 3D6E8BA14FC06B5D64605637 /* Pods */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 3E899E8ACE8D0B7B0E658D12 /* Pods-Runner.debug.xcconfig */, 68 | ABCF1A30C2217C9DF05ADE09 /* Pods-Runner.release.xcconfig */, 69 | 56E79C0BB0A4376B94385DA4 /* Pods-Runner.profile.xcconfig */, 70 | ); 71 | path = Pods; 72 | sourceTree = ""; 73 | }; 74 | 8F507EE1B20D36AC385B41C7 /* Frameworks */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | E57D19E5200C5117D1AB3A1B /* Pods_Runner.framework */, 78 | ); 79 | name = Frameworks; 80 | sourceTree = ""; 81 | }; 82 | 9740EEB11CF90186004384FC /* Flutter */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 86 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 87 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 88 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 89 | ); 90 | name = Flutter; 91 | sourceTree = ""; 92 | }; 93 | 97C146E51CF9000F007C117D = { 94 | isa = PBXGroup; 95 | children = ( 96 | 9740EEB11CF90186004384FC /* Flutter */, 97 | 97C146F01CF9000F007C117D /* Runner */, 98 | 97C146EF1CF9000F007C117D /* Products */, 99 | 3D6E8BA14FC06B5D64605637 /* Pods */, 100 | 8F507EE1B20D36AC385B41C7 /* Frameworks */, 101 | ); 102 | sourceTree = ""; 103 | }; 104 | 97C146EF1CF9000F007C117D /* Products */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 97C146EE1CF9000F007C117D /* Runner.app */, 108 | ); 109 | name = Products; 110 | sourceTree = ""; 111 | }; 112 | 97C146F01CF9000F007C117D /* Runner */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 116 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 117 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 118 | 97C147021CF9000F007C117D /* Info.plist */, 119 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 120 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 121 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 122 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 123 | ); 124 | path = Runner; 125 | sourceTree = ""; 126 | }; 127 | /* End PBXGroup section */ 128 | 129 | /* Begin PBXNativeTarget section */ 130 | 97C146ED1CF9000F007C117D /* Runner */ = { 131 | isa = PBXNativeTarget; 132 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 133 | buildPhases = ( 134 | A556C86708DD1D085327E325 /* [CP] Check Pods Manifest.lock */, 135 | 9740EEB61CF901F6004384FC /* Run Script */, 136 | 97C146EA1CF9000F007C117D /* Sources */, 137 | 97C146EB1CF9000F007C117D /* Frameworks */, 138 | 97C146EC1CF9000F007C117D /* Resources */, 139 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 140 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 141 | 8B3C1FE3D67F18E502226898 /* [CP] Embed Pods Frameworks */, 142 | ); 143 | buildRules = ( 144 | ); 145 | dependencies = ( 146 | ); 147 | name = Runner; 148 | productName = Runner; 149 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 150 | productType = "com.apple.product-type.application"; 151 | }; 152 | /* End PBXNativeTarget section */ 153 | 154 | /* Begin PBXProject section */ 155 | 97C146E61CF9000F007C117D /* Project object */ = { 156 | isa = PBXProject; 157 | attributes = { 158 | LastUpgradeCheck = 1020; 159 | ORGANIZATIONNAME = ""; 160 | TargetAttributes = { 161 | 97C146ED1CF9000F007C117D = { 162 | CreatedOnToolsVersion = 7.3.1; 163 | LastSwiftMigration = 1100; 164 | }; 165 | }; 166 | }; 167 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 168 | compatibilityVersion = "Xcode 9.3"; 169 | developmentRegion = en; 170 | hasScannedForEncodings = 0; 171 | knownRegions = ( 172 | en, 173 | Base, 174 | ); 175 | mainGroup = 97C146E51CF9000F007C117D; 176 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 177 | projectDirPath = ""; 178 | projectRoot = ""; 179 | targets = ( 180 | 97C146ED1CF9000F007C117D /* Runner */, 181 | ); 182 | }; 183 | /* End PBXProject section */ 184 | 185 | /* Begin PBXResourcesBuildPhase section */ 186 | 97C146EC1CF9000F007C117D /* Resources */ = { 187 | isa = PBXResourcesBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 191 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 192 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 193 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | /* End PBXResourcesBuildPhase section */ 198 | 199 | /* Begin PBXShellScriptBuildPhase section */ 200 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 201 | isa = PBXShellScriptBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | ); 205 | inputPaths = ( 206 | ); 207 | name = "Thin Binary"; 208 | outputPaths = ( 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | shellPath = /bin/sh; 212 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 213 | }; 214 | 8B3C1FE3D67F18E502226898 /* [CP] Embed Pods Frameworks */ = { 215 | isa = PBXShellScriptBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | ); 219 | inputFileListPaths = ( 220 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 221 | ); 222 | name = "[CP] Embed Pods Frameworks"; 223 | outputFileListPaths = ( 224 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | shellPath = /bin/sh; 228 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 229 | showEnvVarsInLog = 0; 230 | }; 231 | 9740EEB61CF901F6004384FC /* Run Script */ = { 232 | isa = PBXShellScriptBuildPhase; 233 | buildActionMask = 2147483647; 234 | files = ( 235 | ); 236 | inputPaths = ( 237 | ); 238 | name = "Run Script"; 239 | outputPaths = ( 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | shellPath = /bin/sh; 243 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 244 | }; 245 | A556C86708DD1D085327E325 /* [CP] Check Pods Manifest.lock */ = { 246 | isa = PBXShellScriptBuildPhase; 247 | buildActionMask = 2147483647; 248 | files = ( 249 | ); 250 | inputFileListPaths = ( 251 | ); 252 | inputPaths = ( 253 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 254 | "${PODS_ROOT}/Manifest.lock", 255 | ); 256 | name = "[CP] Check Pods Manifest.lock"; 257 | outputFileListPaths = ( 258 | ); 259 | outputPaths = ( 260 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | shellPath = /bin/sh; 264 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 265 | showEnvVarsInLog = 0; 266 | }; 267 | /* End PBXShellScriptBuildPhase section */ 268 | 269 | /* Begin PBXSourcesBuildPhase section */ 270 | 97C146EA1CF9000F007C117D /* Sources */ = { 271 | isa = PBXSourcesBuildPhase; 272 | buildActionMask = 2147483647; 273 | files = ( 274 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 275 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | /* End PBXSourcesBuildPhase section */ 280 | 281 | /* Begin PBXVariantGroup section */ 282 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 283 | isa = PBXVariantGroup; 284 | children = ( 285 | 97C146FB1CF9000F007C117D /* Base */, 286 | ); 287 | name = Main.storyboard; 288 | sourceTree = ""; 289 | }; 290 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 291 | isa = PBXVariantGroup; 292 | children = ( 293 | 97C147001CF9000F007C117D /* Base */, 294 | ); 295 | name = LaunchScreen.storyboard; 296 | sourceTree = ""; 297 | }; 298 | /* End PBXVariantGroup section */ 299 | 300 | /* Begin XCBuildConfiguration section */ 301 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 302 | isa = XCBuildConfiguration; 303 | buildSettings = { 304 | ALWAYS_SEARCH_USER_PATHS = NO; 305 | CLANG_ANALYZER_NONNULL = YES; 306 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 307 | CLANG_CXX_LIBRARY = "libc++"; 308 | CLANG_ENABLE_MODULES = YES; 309 | CLANG_ENABLE_OBJC_ARC = YES; 310 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 311 | CLANG_WARN_BOOL_CONVERSION = YES; 312 | CLANG_WARN_COMMA = YES; 313 | CLANG_WARN_CONSTANT_CONVERSION = YES; 314 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 315 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 316 | CLANG_WARN_EMPTY_BODY = YES; 317 | CLANG_WARN_ENUM_CONVERSION = YES; 318 | CLANG_WARN_INFINITE_RECURSION = YES; 319 | CLANG_WARN_INT_CONVERSION = YES; 320 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 321 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 322 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 323 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 324 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 325 | CLANG_WARN_STRICT_PROTOTYPES = YES; 326 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 327 | CLANG_WARN_UNREACHABLE_CODE = YES; 328 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 329 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 330 | COPY_PHASE_STRIP = NO; 331 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 332 | ENABLE_NS_ASSERTIONS = NO; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | GCC_C_LANGUAGE_STANDARD = gnu99; 335 | GCC_NO_COMMON_BLOCKS = YES; 336 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 337 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 338 | GCC_WARN_UNDECLARED_SELECTOR = YES; 339 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 340 | GCC_WARN_UNUSED_FUNCTION = YES; 341 | GCC_WARN_UNUSED_VARIABLE = YES; 342 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 343 | MTL_ENABLE_DEBUG_INFO = NO; 344 | SDKROOT = iphoneos; 345 | SUPPORTED_PLATFORMS = iphoneos; 346 | TARGETED_DEVICE_FAMILY = "1,2"; 347 | VALIDATE_PRODUCT = YES; 348 | }; 349 | name = Profile; 350 | }; 351 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 352 | isa = XCBuildConfiguration; 353 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 354 | buildSettings = { 355 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 356 | CLANG_ENABLE_MODULES = YES; 357 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 358 | DEVELOPMENT_TEAM = N82TT8G47H; 359 | ENABLE_BITCODE = NO; 360 | FRAMEWORK_SEARCH_PATHS = ( 361 | "$(inherited)", 362 | "$(PROJECT_DIR)/Flutter", 363 | ); 364 | INFOPLIST_FILE = Runner/Info.plist; 365 | LD_RUNPATH_SEARCH_PATHS = ( 366 | "$(inherited)", 367 | "@executable_path/Frameworks", 368 | ); 369 | LIBRARY_SEARCH_PATHS = ( 370 | "$(inherited)", 371 | "$(PROJECT_DIR)/Flutter", 372 | ); 373 | PRODUCT_BUNDLE_IDENTIFIER = io.imgkl.flikipedia; 374 | PRODUCT_NAME = "$(TARGET_NAME)"; 375 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 376 | SWIFT_VERSION = 5.0; 377 | VERSIONING_SYSTEM = "apple-generic"; 378 | }; 379 | name = Profile; 380 | }; 381 | 97C147031CF9000F007C117D /* Debug */ = { 382 | isa = XCBuildConfiguration; 383 | buildSettings = { 384 | ALWAYS_SEARCH_USER_PATHS = NO; 385 | CLANG_ANALYZER_NONNULL = YES; 386 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 387 | CLANG_CXX_LIBRARY = "libc++"; 388 | CLANG_ENABLE_MODULES = YES; 389 | CLANG_ENABLE_OBJC_ARC = YES; 390 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 391 | CLANG_WARN_BOOL_CONVERSION = YES; 392 | CLANG_WARN_COMMA = YES; 393 | CLANG_WARN_CONSTANT_CONVERSION = YES; 394 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 395 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 396 | CLANG_WARN_EMPTY_BODY = YES; 397 | CLANG_WARN_ENUM_CONVERSION = YES; 398 | CLANG_WARN_INFINITE_RECURSION = YES; 399 | CLANG_WARN_INT_CONVERSION = YES; 400 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 401 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 402 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 403 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 404 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 405 | CLANG_WARN_STRICT_PROTOTYPES = YES; 406 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 407 | CLANG_WARN_UNREACHABLE_CODE = YES; 408 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 409 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 410 | COPY_PHASE_STRIP = NO; 411 | DEBUG_INFORMATION_FORMAT = dwarf; 412 | ENABLE_STRICT_OBJC_MSGSEND = YES; 413 | ENABLE_TESTABILITY = YES; 414 | GCC_C_LANGUAGE_STANDARD = gnu99; 415 | GCC_DYNAMIC_NO_PIC = NO; 416 | GCC_NO_COMMON_BLOCKS = YES; 417 | GCC_OPTIMIZATION_LEVEL = 0; 418 | GCC_PREPROCESSOR_DEFINITIONS = ( 419 | "DEBUG=1", 420 | "$(inherited)", 421 | ); 422 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 423 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 424 | GCC_WARN_UNDECLARED_SELECTOR = YES; 425 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 426 | GCC_WARN_UNUSED_FUNCTION = YES; 427 | GCC_WARN_UNUSED_VARIABLE = YES; 428 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 429 | MTL_ENABLE_DEBUG_INFO = YES; 430 | ONLY_ACTIVE_ARCH = YES; 431 | SDKROOT = iphoneos; 432 | TARGETED_DEVICE_FAMILY = "1,2"; 433 | }; 434 | name = Debug; 435 | }; 436 | 97C147041CF9000F007C117D /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | buildSettings = { 439 | ALWAYS_SEARCH_USER_PATHS = NO; 440 | CLANG_ANALYZER_NONNULL = YES; 441 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 442 | CLANG_CXX_LIBRARY = "libc++"; 443 | CLANG_ENABLE_MODULES = YES; 444 | CLANG_ENABLE_OBJC_ARC = YES; 445 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 446 | CLANG_WARN_BOOL_CONVERSION = YES; 447 | CLANG_WARN_COMMA = YES; 448 | CLANG_WARN_CONSTANT_CONVERSION = YES; 449 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 450 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 451 | CLANG_WARN_EMPTY_BODY = YES; 452 | CLANG_WARN_ENUM_CONVERSION = YES; 453 | CLANG_WARN_INFINITE_RECURSION = YES; 454 | CLANG_WARN_INT_CONVERSION = YES; 455 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 456 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 457 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 458 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 459 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 460 | CLANG_WARN_STRICT_PROTOTYPES = YES; 461 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 462 | CLANG_WARN_UNREACHABLE_CODE = YES; 463 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 464 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 465 | COPY_PHASE_STRIP = NO; 466 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 467 | ENABLE_NS_ASSERTIONS = NO; 468 | ENABLE_STRICT_OBJC_MSGSEND = YES; 469 | GCC_C_LANGUAGE_STANDARD = gnu99; 470 | GCC_NO_COMMON_BLOCKS = YES; 471 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 472 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 473 | GCC_WARN_UNDECLARED_SELECTOR = YES; 474 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 475 | GCC_WARN_UNUSED_FUNCTION = YES; 476 | GCC_WARN_UNUSED_VARIABLE = YES; 477 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 478 | MTL_ENABLE_DEBUG_INFO = NO; 479 | SDKROOT = iphoneos; 480 | SUPPORTED_PLATFORMS = iphoneos; 481 | SWIFT_COMPILATION_MODE = wholemodule; 482 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 483 | TARGETED_DEVICE_FAMILY = "1,2"; 484 | VALIDATE_PRODUCT = YES; 485 | }; 486 | name = Release; 487 | }; 488 | 97C147061CF9000F007C117D /* Debug */ = { 489 | isa = XCBuildConfiguration; 490 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 491 | buildSettings = { 492 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 493 | CLANG_ENABLE_MODULES = YES; 494 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 495 | DEVELOPMENT_TEAM = N82TT8G47H; 496 | ENABLE_BITCODE = NO; 497 | FRAMEWORK_SEARCH_PATHS = ( 498 | "$(inherited)", 499 | "$(PROJECT_DIR)/Flutter", 500 | ); 501 | INFOPLIST_FILE = Runner/Info.plist; 502 | LD_RUNPATH_SEARCH_PATHS = ( 503 | "$(inherited)", 504 | "@executable_path/Frameworks", 505 | ); 506 | LIBRARY_SEARCH_PATHS = ( 507 | "$(inherited)", 508 | "$(PROJECT_DIR)/Flutter", 509 | ); 510 | PRODUCT_BUNDLE_IDENTIFIER = io.imgkl.flikipedia; 511 | PRODUCT_NAME = "$(TARGET_NAME)"; 512 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 513 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 514 | SWIFT_VERSION = 5.0; 515 | VERSIONING_SYSTEM = "apple-generic"; 516 | }; 517 | name = Debug; 518 | }; 519 | 97C147071CF9000F007C117D /* Release */ = { 520 | isa = XCBuildConfiguration; 521 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 522 | buildSettings = { 523 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 524 | CLANG_ENABLE_MODULES = YES; 525 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 526 | DEVELOPMENT_TEAM = N82TT8G47H; 527 | ENABLE_BITCODE = NO; 528 | FRAMEWORK_SEARCH_PATHS = ( 529 | "$(inherited)", 530 | "$(PROJECT_DIR)/Flutter", 531 | ); 532 | INFOPLIST_FILE = Runner/Info.plist; 533 | LD_RUNPATH_SEARCH_PATHS = ( 534 | "$(inherited)", 535 | "@executable_path/Frameworks", 536 | ); 537 | LIBRARY_SEARCH_PATHS = ( 538 | "$(inherited)", 539 | "$(PROJECT_DIR)/Flutter", 540 | ); 541 | PRODUCT_BUNDLE_IDENTIFIER = io.imgkl.flikipedia; 542 | PRODUCT_NAME = "$(TARGET_NAME)"; 543 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 544 | SWIFT_VERSION = 5.0; 545 | VERSIONING_SYSTEM = "apple-generic"; 546 | }; 547 | name = Release; 548 | }; 549 | /* End XCBuildConfiguration section */ 550 | 551 | /* Begin XCConfigurationList section */ 552 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 553 | isa = XCConfigurationList; 554 | buildConfigurations = ( 555 | 97C147031CF9000F007C117D /* Debug */, 556 | 97C147041CF9000F007C117D /* Release */, 557 | 249021D3217E4FDB00AE95B9 /* Profile */, 558 | ); 559 | defaultConfigurationIsVisible = 0; 560 | defaultConfigurationName = Release; 561 | }; 562 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 563 | isa = XCConfigurationList; 564 | buildConfigurations = ( 565 | 97C147061CF9000F007C117D /* Debug */, 566 | 97C147071CF9000F007C117D /* Release */, 567 | 249021D4217E4FDB00AE95B9 /* Profile */, 568 | ); 569 | defaultConfigurationIsVisible = 0; 570 | defaultConfigurationName = Release; 571 | }; 572 | /* End XCConfigurationList section */ 573 | }; 574 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 575 | } 576 | --------------------------------------------------------------------------------