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