├── .gitignore ├── .metadata ├── .vscode └── launch.json ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── flutter_wordpress_app │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── boxed │ ├── fashion.png │ ├── health.png │ ├── lifestyle.png │ ├── music.png │ ├── photography.png │ ├── recipies.png │ ├── sport.png │ ├── travel.png │ └── world.png ├── icon.png ├── launcher_icon.png ├── more │ ├── contact.png │ ├── favourite.png │ ├── notification.png │ └── share.png ├── no-internet.png └── play-button.png ├── fonts ├── Poppins │ ├── Poppins-Black.ttf │ ├── Poppins-BlackItalic.ttf │ ├── Poppins-Bold.ttf │ ├── Poppins-BoldItalic.ttf │ ├── Poppins-ExtraBold.ttf │ ├── Poppins-ExtraBoldItalic.ttf │ ├── Poppins-ExtraLight.ttf │ ├── Poppins-ExtraLightItalic.ttf │ ├── Poppins-Italic.ttf │ ├── Poppins-Light.ttf │ ├── Poppins-LightItalic.ttf │ ├── Poppins-Medium.ttf │ ├── Poppins-MediumItalic.ttf │ ├── Poppins-Regular.ttf │ ├── Poppins-SemiBold.ttf │ ├── Poppins-SemiBoldItalic.ttf │ ├── Poppins-Thin.ttf │ └── Poppins-ThinItalic.ttf └── Soleil │ ├── Soleil-Bold-Italic.otf │ ├── Soleil-Bold.otf │ ├── Soleil-ExtraBold-Italic.otf │ ├── Soleil-ExtraBold.otf │ ├── Soleil-Italic.otf │ ├── Soleil-Light-Italic.otf │ ├── Soleil-Light.otf │ ├── Soleil-Regular.otf │ ├── Soleil-SemiBold-Italic.otf │ └── Soleil-SemiBold.otf ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── common │ └── constants.dart ├── main.dart ├── models │ ├── Category.dart │ ├── Comment.dart │ └── article.dart ├── pages │ ├── add_comment.dart │ ├── articles.dart │ ├── category_articles.dart │ ├── comments.dart │ ├── local_articles.dart │ ├── search.dart │ ├── settings.dart │ └── single_article.dart └── widgets │ ├── articleBox.dart │ ├── articleBoxFeatured.dart │ ├── commentBox.dart │ └── searchBoxes.dart ├── pubspec.lock ├── pubspec.yaml ├── resources ├── Screenshot_1.png ├── Screenshot_10.png ├── Screenshot_11.png ├── Screenshot_12.png ├── Screenshot_2.png ├── Screenshot_3.png ├── Screenshot_4.png ├── Screenshot_5.png ├── Screenshot_6.png ├── Screenshot_7.png ├── Screenshot_8.png ├── Screenshot_9.png ├── banner.png ├── button_download.png ├── button_purchase.png ├── fwp.png ├── google-play-badge.png ├── icon.png └── wp_pro.png ├── test └── widget_test.dart └── web ├── favicon.png ├── icons ├── Icon-192.png ├── Icon-512.png ├── Icon-maskable-192.png └── Icon-maskable-512.png ├── index.html └── manifest.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /.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: ffb2ecea5223acdd139a5039be2f9c796962833d 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "flutter_wordpress_app", 9 | "request": "launch", 10 | "type": "dart" 11 | }, 12 | { 13 | "name": "flutter_wordpress_app (profile mode)", 14 | "request": "launch", 15 | "type": "dart", 16 | "flutterMode": "profile" 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Codemagic build status](https://api.codemagic.io/apps/5dda7273011bc91bb5e1e928/5dda7273011bc91bb5e1e927/status_badge.svg)](https://codemagic.io/apps/5dda7273011bc91bb5e1e928/5dda7273011bc91bb5e1e927/latest_build) 2 | 3 | 4 | ![alt text](resources/banner.png "Banner") 5 | 6 | ## 📌 Get Flutter for Wordpress 7 | 8 | Flutter for wordpress is currently available in free and pro version: 9 | 10 | |Flutter for Wordpress|Flutter for Wordpress Pro| 11 | |

![alt text](resources/fwp.png "Flutter for wordpress")

|

![alt text](resources/wp_pro.png "Flutter for wordpress pro")

| 12 | ||| 13 | |

[![alt text](resources/google-play-badge.png "Banner")](https://play.google.com/store/apps/details?id=com.wordpress.flutter.app)

|

[![alt text](resources/google-play-badge.png "Banner")](https://play.google.com/store/apps/details?id=com.wordpress.flutter.pro)

| 14 | |

Free and Open Source

|

39$ on codecanyon

| 15 | |

[![alt text](resources/button_download.png "Download")](https://github.com/l3lackcurtains/Flutter-for-Wordpress-App/releases)

|

[![alt text](resources/button_purchase.png "Purchase")](https://codecanyon.net/item/flutter-for-wordpress-pro/27977169)

| 16 | 17 | 18 | # 🚀 Installation 19 | 20 | You need to have a wordpress website before you implement the app. 21 | 22 | If you have a wordpress website already then follow the simple steps given below to build your own **Wordpress Flutter App**. 23 | 24 | ### 🔔 Push Notification (Optional) 25 | gh 26 | This project uses firebase messaging for push notification. 27 | 28 | To integrate push notification from firebase follow the steps: 29 | - Go to firebase console 30 | - Generate and Download **google-services.json** file 31 | - Place **google-services.json** file inside android/app 32 | - It should be ready now. Test your push notification. 33 | 34 | For further instruction read documentation from https://pub.dev/packages/firebase_messaging 35 | 36 | ## 📱 Screenshots 37 | 38 | | | | | 39 | |---|---|---| 40 | |![alt text](resources/Screenshot_1.png "Screenshot 1")|![alt text](resources/Screenshot_2.png "Screenshot 2")|![alt text](resources/Screenshot_3.png "Screenshot 4")| 41 | |![alt text](resources/Screenshot_4.png "Screenshot 3")|![alt text](resources/Screenshot_5.png "Screenshot 6")|![alt text](resources/Screenshot_6.png "Screenshot 5")| 42 | 43 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /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 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 30 30 | 31 | compileOptions { 32 | sourceCompatibility JavaVersion.VERSION_1_8 33 | targetCompatibility JavaVersion.VERSION_1_8 34 | } 35 | 36 | kotlinOptions { 37 | jvmTarget = '1.8' 38 | } 39 | 40 | sourceSets { 41 | main.java.srcDirs += 'src/main/kotlin' 42 | } 43 | 44 | defaultConfig { 45 | applicationId "com.wordpress.flutter.app" 46 | minSdkVersion 19 47 | targetSdkVersion 30 48 | versionCode flutterVersionCode.toInteger() 49 | versionName flutterVersionName 50 | multiDexEnabled true 51 | } 52 | 53 | buildTypes { 54 | release { 55 | signingConfig signingConfigs.debug 56 | } 57 | } 58 | } 59 | 60 | flutter { 61 | source '../..' 62 | } 63 | 64 | dependencies { 65 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 66 | implementation 'com.android.support:multidex:1.0.3' 67 | } 68 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 13 | 17 | 21 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/flutter_wordpress_app/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.flutter_wordpress_app 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | project.evaluationDependsOn(':app') 25 | } 26 | 27 | task clean(type: Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /assets/boxed/fashion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/fashion.png -------------------------------------------------------------------------------- /assets/boxed/health.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/health.png -------------------------------------------------------------------------------- /assets/boxed/lifestyle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/lifestyle.png -------------------------------------------------------------------------------- /assets/boxed/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/music.png -------------------------------------------------------------------------------- /assets/boxed/photography.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/photography.png -------------------------------------------------------------------------------- /assets/boxed/recipies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/recipies.png -------------------------------------------------------------------------------- /assets/boxed/sport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/sport.png -------------------------------------------------------------------------------- /assets/boxed/travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/travel.png -------------------------------------------------------------------------------- /assets/boxed/world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/boxed/world.png -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/icon.png -------------------------------------------------------------------------------- /assets/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/launcher_icon.png -------------------------------------------------------------------------------- /assets/more/contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/more/contact.png -------------------------------------------------------------------------------- /assets/more/favourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/more/favourite.png -------------------------------------------------------------------------------- /assets/more/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/more/notification.png -------------------------------------------------------------------------------- /assets/more/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/more/share.png -------------------------------------------------------------------------------- /assets/no-internet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/no-internet.png -------------------------------------------------------------------------------- /assets/play-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/assets/play-button.png -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-Black.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-BlackItalic.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-Bold.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-BoldItalic.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-ExtraBold.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-ExtraLight.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-Italic.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-Light.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-LightItalic.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-Medium.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-MediumItalic.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-Regular.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-SemiBold.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-Thin.ttf -------------------------------------------------------------------------------- /fonts/Poppins/Poppins-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Poppins/Poppins-ThinItalic.ttf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-Bold-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-Bold-Italic.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-Bold.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-ExtraBold-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-ExtraBold-Italic.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-ExtraBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-ExtraBold.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-Italic.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-Light-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-Light-Italic.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-Light.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-Regular.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-SemiBold-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-SemiBold-Italic.otf -------------------------------------------------------------------------------- /fonts/Soleil/Soleil-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/fonts/Soleil/Soleil-SemiBold.otf -------------------------------------------------------------------------------- /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/ephemeral/ 22 | Flutter/app.flx 23 | Flutter/app.zip 24 | Flutter/flutter_assets/ 25 | Flutter/flutter_export_environment.sh 26 | ServiceDefinitions.json 27 | Runner/GeneratedPluginRegistrant.* 28 | 29 | # Exceptions to above rules. 30 | !default.mode1v3 31 | !default.mode2v3 32 | !default.pbxuser 33 | !default.perspectivev3 34 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 9.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1020; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = ""; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = ""; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | ENABLE_BITCODE = NO; 292 | INFOPLIST_FILE = Runner/Info.plist; 293 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 294 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWordpressApp; 295 | PRODUCT_NAME = "$(TARGET_NAME)"; 296 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 297 | SWIFT_VERSION = 5.0; 298 | VERSIONING_SYSTEM = "apple-generic"; 299 | }; 300 | name = Profile; 301 | }; 302 | 97C147031CF9000F007C117D /* Debug */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_ANALYZER_NONNULL = YES; 307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 308 | CLANG_CXX_LIBRARY = "libc++"; 309 | CLANG_ENABLE_MODULES = YES; 310 | CLANG_ENABLE_OBJC_ARC = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INFINITE_RECURSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 331 | COPY_PHASE_STRIP = NO; 332 | DEBUG_INFORMATION_FORMAT = dwarf; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | ENABLE_TESTABILITY = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_DYNAMIC_NO_PIC = NO; 337 | GCC_NO_COMMON_BLOCKS = YES; 338 | GCC_OPTIMIZATION_LEVEL = 0; 339 | GCC_PREPROCESSOR_DEFINITIONS = ( 340 | "DEBUG=1", 341 | "$(inherited)", 342 | ); 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNDECLARED_SELECTOR = YES; 346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 | GCC_WARN_UNUSED_FUNCTION = YES; 348 | GCC_WARN_UNUSED_VARIABLE = YES; 349 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 350 | MTL_ENABLE_DEBUG_INFO = YES; 351 | ONLY_ACTIVE_ARCH = YES; 352 | SDKROOT = iphoneos; 353 | TARGETED_DEVICE_FAMILY = "1,2"; 354 | }; 355 | name = Debug; 356 | }; 357 | 97C147041CF9000F007C117D /* Release */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | ALWAYS_SEARCH_USER_PATHS = NO; 361 | CLANG_ANALYZER_NONNULL = YES; 362 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 363 | CLANG_CXX_LIBRARY = "libc++"; 364 | CLANG_ENABLE_MODULES = YES; 365 | CLANG_ENABLE_OBJC_ARC = YES; 366 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 367 | CLANG_WARN_BOOL_CONVERSION = YES; 368 | CLANG_WARN_COMMA = YES; 369 | CLANG_WARN_CONSTANT_CONVERSION = YES; 370 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 371 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 372 | CLANG_WARN_EMPTY_BODY = YES; 373 | CLANG_WARN_ENUM_CONVERSION = YES; 374 | CLANG_WARN_INFINITE_RECURSION = YES; 375 | CLANG_WARN_INT_CONVERSION = YES; 376 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 377 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 378 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 379 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 381 | CLANG_WARN_STRICT_PROTOTYPES = YES; 382 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 383 | CLANG_WARN_UNREACHABLE_CODE = YES; 384 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 385 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 386 | COPY_PHASE_STRIP = NO; 387 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 388 | ENABLE_NS_ASSERTIONS = NO; 389 | ENABLE_STRICT_OBJC_MSGSEND = YES; 390 | GCC_C_LANGUAGE_STANDARD = gnu99; 391 | GCC_NO_COMMON_BLOCKS = YES; 392 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 393 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 394 | GCC_WARN_UNDECLARED_SELECTOR = YES; 395 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 396 | GCC_WARN_UNUSED_FUNCTION = YES; 397 | GCC_WARN_UNUSED_VARIABLE = YES; 398 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 399 | MTL_ENABLE_DEBUG_INFO = NO; 400 | SDKROOT = iphoneos; 401 | SUPPORTED_PLATFORMS = iphoneos; 402 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 403 | TARGETED_DEVICE_FAMILY = "1,2"; 404 | VALIDATE_PRODUCT = YES; 405 | }; 406 | name = Release; 407 | }; 408 | 97C147061CF9000F007C117D /* Debug */ = { 409 | isa = XCBuildConfiguration; 410 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 411 | buildSettings = { 412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 413 | CLANG_ENABLE_MODULES = YES; 414 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 415 | ENABLE_BITCODE = NO; 416 | INFOPLIST_FILE = Runner/Info.plist; 417 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 418 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWordpressApp; 419 | PRODUCT_NAME = "$(TARGET_NAME)"; 420 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 421 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 422 | SWIFT_VERSION = 5.0; 423 | VERSIONING_SYSTEM = "apple-generic"; 424 | }; 425 | name = Debug; 426 | }; 427 | 97C147071CF9000F007C117D /* Release */ = { 428 | isa = XCBuildConfiguration; 429 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 430 | buildSettings = { 431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 432 | CLANG_ENABLE_MODULES = YES; 433 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 434 | ENABLE_BITCODE = NO; 435 | INFOPLIST_FILE = Runner/Info.plist; 436 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 437 | PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterWordpressApp; 438 | PRODUCT_NAME = "$(TARGET_NAME)"; 439 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 440 | SWIFT_VERSION = 5.0; 441 | VERSIONING_SYSTEM = "apple-generic"; 442 | }; 443 | name = Release; 444 | }; 445 | /* End XCBuildConfiguration section */ 446 | 447 | /* Begin XCConfigurationList section */ 448 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 449 | isa = XCConfigurationList; 450 | buildConfigurations = ( 451 | 97C147031CF9000F007C117D /* Debug */, 452 | 97C147041CF9000F007C117D /* Release */, 453 | 249021D3217E4FDB00AE95B9 /* Profile */, 454 | ); 455 | defaultConfigurationIsVisible = 0; 456 | defaultConfigurationName = Release; 457 | }; 458 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 459 | isa = XCConfigurationList; 460 | buildConfigurations = ( 461 | 97C147061CF9000F007C117D /* Debug */, 462 | 97C147071CF9000F007C117D /* Release */, 463 | 249021D4217E4FDB00AE95B9 /* Profile */, 464 | ); 465 | defaultConfigurationIsVisible = 0; 466 | defaultConfigurationName = Release; 467 | }; 468 | /* End XCConfigurationList section */ 469 | }; 470 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 471 | } -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | flutter_wordpress_app 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/common/constants.dart: -------------------------------------------------------------------------------- 1 | library constants; 2 | 3 | // Your wordpress website URL 4 | const String WORDPRESS_URL = "https://flutterblog.crumet.com"; 5 | 6 | // Featured category ID (for Home Screen top section) 7 | const int FEATURED_ID = 2; 8 | 9 | // Tab 2 page category name 10 | const String PAGE2_CATEGORY_NAME = "Lifestyle"; 11 | 12 | // Tab 2 page category ID 13 | const int PAGE2_CATEGORY_ID = 6; 14 | 15 | // Custom categories in search tab 16 | // Array in format 17 | // ["Category Name", "Image Link", "Category ID"] 18 | const List CUSTOM_CATEGORIES = [ 19 | ["Lifestyle", "assets/boxed/lifestyle.png", 6], 20 | ["Fashion", "assets/boxed/fashion.png", 12], 21 | ["Music", "assets/boxed/music.png", 14], 22 | ["Photography", "assets/boxed/photography.png", 15], 23 | ["Sport", "assets/boxed/sport.png", 13], 24 | ["World", "assets/boxed/world.png", 11], 25 | ["Health", "assets/boxed/health.png", 8], 26 | ["Travel", "assets/boxed/travel.png", 7], 27 | ["Recipies", "assets/boxed/recipies.png", 10], 28 | ]; 29 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_wordpress_app/common/constants.dart'; 3 | import 'package:flutter_wordpress_app/pages/articles.dart'; 4 | import 'package:flutter_wordpress_app/pages/local_articles.dart'; 5 | import 'package:flutter_wordpress_app/pages/search.dart'; 6 | import 'package:flutter_wordpress_app/pages/settings.dart'; 7 | 8 | void main() => runApp(MyApp()); 9 | 10 | class MyApp extends StatelessWidget { 11 | @override 12 | Widget build(BuildContext context) { 13 | return MaterialApp( 14 | title: 'Icilome', 15 | theme: ThemeData( 16 | brightness: Brightness.light, 17 | primaryColor: Color(0xFF385C7B), 18 | primaryColorLight: Colors.white, 19 | primaryColorDark: Colors.black, 20 | textTheme: TextTheme( 21 | headline1: TextStyle( 22 | fontSize: 17, 23 | color: Colors.black, 24 | height: 1.2, 25 | fontWeight: FontWeight.w500, 26 | fontFamily: "Soleil", 27 | ), 28 | caption: TextStyle(color: Colors.black45, fontSize: 10), 29 | bodyText1: TextStyle( 30 | fontSize: 16, 31 | height: 1.5, 32 | color: Colors.black87, 33 | fontWeight: FontWeight.normal 34 | )), 35 | ), 36 | home: MyHomePage()); 37 | } 38 | } 39 | 40 | class MyHomePage extends StatefulWidget { 41 | @override 42 | _MyHomePageState createState() => _MyHomePageState(); 43 | } 44 | 45 | class _MyHomePageState extends State { 46 | 47 | int _selectedIndex = 0; 48 | final List _widgetOptions = [ 49 | Articles(), 50 | LocalArticles(), 51 | Search(), 52 | Settings() 53 | ]; 54 | 55 | @override 56 | void initState() { 57 | super.initState(); 58 | } 59 | 60 | 61 | @override 62 | Widget build(BuildContext context) { 63 | return Scaffold( 64 | body: Center( 65 | child: _widgetOptions.elementAt(_selectedIndex), 66 | ), 67 | bottomNavigationBar: BottomNavigationBar( 68 | backgroundColor: Colors.white, 69 | selectedLabelStyle: 70 | TextStyle(fontWeight: FontWeight.w500, fontFamily: "Soleil"), 71 | unselectedLabelStyle: TextStyle(fontFamily: "Soleil"), 72 | items: [ 73 | BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'), 74 | BottomNavigationBarItem( 75 | icon: Icon(Icons.flare), label: PAGE2_CATEGORY_NAME), 76 | BottomNavigationBarItem(icon: Icon(Icons.search), label: 'Search'), 77 | BottomNavigationBarItem(icon: Icon(Icons.menu), label: 'More'), 78 | ], 79 | currentIndex: _selectedIndex, 80 | fixedColor: Theme.of(context).primaryColor, 81 | onTap: _onItemTapped, 82 | type: BottomNavigationBarType.fixed), 83 | ); 84 | } 85 | 86 | void _onItemTapped(int index) { 87 | setState(() { 88 | _selectedIndex = index; 89 | }); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /lib/models/Category.dart: -------------------------------------------------------------------------------- 1 | class Category { 2 | final int? id; 3 | final String? name; 4 | final int? parent; 5 | final int? count; 6 | 7 | Category({this.id, this.name, this.parent, this.count}); 8 | 9 | factory Category.fromJson(Map json) { 10 | return Category( 11 | id: json['id'], 12 | name: json['name'], 13 | parent: json['parent'], 14 | count: json["count"]); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/models/Comment.dart: -------------------------------------------------------------------------------- 1 | class Comment { 2 | final int? id; 3 | final String? author; 4 | final String? avatar; 5 | final String? content; 6 | 7 | Comment({this.id, this.author, this.avatar, this.content}); 8 | 9 | factory Comment.fromJson(Map json) { 10 | return Comment( 11 | id: json['id'], 12 | author: json['author_name'], 13 | avatar: json['author_avatar_urls']["48"], 14 | content: json["content"]["rendered"]); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/models/article.dart: -------------------------------------------------------------------------------- 1 | import 'package:intl/intl.dart'; 2 | 3 | class Article { 4 | final int? id; 5 | final String? title; 6 | final String? content; 7 | final String? image; 8 | final String? video; 9 | final String? author; 10 | final String? avatar; 11 | final String? category; 12 | final String? date; 13 | final String? link; 14 | final int? catId; 15 | 16 | Article( 17 | {this.id, 18 | this.title, 19 | this.content, 20 | this.image, 21 | this.video, 22 | this.author, 23 | this.avatar, 24 | this.category, 25 | this.date, 26 | this.link, 27 | this.catId}); 28 | 29 | factory Article.fromJson(Map json) { 30 | String content = json['content'] != null ? json['content']['rendered'] : ""; 31 | 32 | String image = json['custom']["featured_image"] != "" 33 | ? json['custom']["featured_image"] 34 | : "https://images.wallpaperscraft.com/image/surface_dark_background_texture_50754_1920x1080.jpg"; 35 | 36 | String video = json['custom']["td_video"]; 37 | 38 | String author = json['custom']["author"]["name"]; 39 | 40 | String avatar = json['custom']["author"]["avatar"]; 41 | 42 | String category = json["custom"]["categories"] != "" 43 | ? json["custom"]["categories"][0]["name"] 44 | : ""; 45 | 46 | int catId = json["custom"]["categories"] != "" 47 | ? json["custom"]["categories"][0]["cat_ID"] 48 | : 0; 49 | 50 | String date = DateFormat('dd MMMM, yyyy', 'en_US') 51 | .format(DateTime.parse(json["date"])) 52 | .toString(); 53 | 54 | return Article( 55 | id: json['id'], 56 | title: json['title']['rendered'], 57 | content: content, 58 | image: image, 59 | video: video, 60 | author: author, 61 | avatar: avatar, 62 | category: category, 63 | date: date, 64 | link: json["link"], 65 | catId: catId); 66 | } 67 | 68 | factory Article.fromDatabaseJson(Map data) => Article( 69 | id: data['id'], 70 | title: data['title'], 71 | content: data['content'], 72 | image: data['image'], 73 | video: data['video'], 74 | author: data['author'], 75 | avatar: data['avatar'], 76 | category: data['category'], 77 | date: data['date'], 78 | link: data['link'], 79 | catId: data["catId"]); 80 | 81 | Map toDatabaseJson() => { 82 | 'id': this.id, 83 | 'title': this.title, 84 | 'content': this.content, 85 | 'image': this.image, 86 | 'video': this.video, 87 | 'author': this.author, 88 | 'avatar': this.avatar, 89 | 'category': this.category, 90 | 'date': this.date, 91 | 'link': this.link, 92 | 'catId': this.catId 93 | }; 94 | } 95 | -------------------------------------------------------------------------------- /lib/pages/add_comment.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_wordpress_app/common/constants.dart'; 5 | import 'package:http/http.dart' as http; 6 | 7 | Future postComment( 8 | int id, String name, String email, String website, String comment) async { 9 | try { 10 | var response = 11 | await http.post(Uri.parse("$WORDPRESS_URL/wp-json/wp/v2/comments"), body: { 12 | "author_email": email.trim().toLowerCase(), 13 | "author_name": name, 14 | "author_website": website, 15 | "content": comment, 16 | "post": id.toString() 17 | }); 18 | 19 | if (response.statusCode == 201) { 20 | return true; 21 | } 22 | return false; 23 | } catch (e) { 24 | throw Exception('Failed to post comment'); 25 | } 26 | } 27 | 28 | class AddComment extends StatefulWidget { 29 | final int commentId; 30 | 31 | AddComment(this.commentId, {Key? key}) : super(key: key); 32 | @override 33 | _AddCommentState createState() => _AddCommentState(); 34 | } 35 | 36 | class _AddCommentState extends State { 37 | final _formKey = GlobalKey(); 38 | 39 | String _name = ""; 40 | String _email = ""; 41 | String _website = ""; 42 | String _comment = ""; 43 | 44 | @override 45 | Widget build(BuildContext context) { 46 | int commentId = widget.commentId; 47 | 48 | return Scaffold( 49 | appBar: AppBar( 50 | leading: IconButton( 51 | icon: Icon(Icons.close), 52 | color: Colors.black, 53 | onPressed: () { 54 | Navigator.of(context).pop(); 55 | }, 56 | ), 57 | title: Text('Add Comment', 58 | style: TextStyle( 59 | color: Colors.black, 60 | fontWeight: FontWeight.bold, 61 | fontSize: 20, 62 | fontFamily: 'Poppins')), 63 | elevation: 5, 64 | backgroundColor: Colors.white, 65 | ), 66 | body: Builder(builder: (BuildContext context) { 67 | return Container( 68 | child: SingleChildScrollView( 69 | scrollDirection: Axis.vertical, 70 | child: Container( 71 | padding: EdgeInsets.fromLTRB(24, 36, 24, 36), 72 | child: Form( 73 | key: _formKey, 74 | child: Column( 75 | children: [ 76 | TextFormField( 77 | decoration: InputDecoration( 78 | labelText: 'Name *', 79 | ), 80 | keyboardType: TextInputType.text, 81 | validator: (value) { 82 | if (value!.isEmpty) { 83 | return 'Please enter your name.'; 84 | } 85 | return null; 86 | }, 87 | onSaved: (String? val) { 88 | _name = val.toString(); 89 | }), 90 | TextFormField( 91 | decoration: InputDecoration( 92 | labelText: 'Email *', 93 | ), 94 | keyboardType: TextInputType.emailAddress, 95 | validator: (value) { 96 | if (value!.isEmpty) { 97 | return 'Please enter your email.'; 98 | } 99 | return null; 100 | }, 101 | onSaved: (String? val) { 102 | _email = val.toString(); 103 | }), 104 | TextFormField( 105 | keyboardType: TextInputType.text, 106 | decoration: InputDecoration( 107 | labelText: 'Website', 108 | ), 109 | onSaved: (String? val) { 110 | _website = val.toString(); 111 | }), 112 | TextFormField( 113 | decoration: InputDecoration( 114 | labelText: 'Comment *', 115 | ), 116 | keyboardType: TextInputType.multiline, 117 | maxLines: 5, 118 | validator: (value) { 119 | if (value!.isEmpty) { 120 | return 'Write some comment.'; 121 | } 122 | return null; 123 | }, 124 | onSaved: (String? val) { 125 | _comment = val.toString(); 126 | }), 127 | Container( 128 | padding: EdgeInsets.symmetric(vertical: 36.0), 129 | height: 120, 130 | child: ElevatedButton.icon( 131 | icon: Icon( 132 | Icons.check, 133 | color: Colors.white, 134 | ), 135 | onPressed: () { 136 | if (_formKey.currentState!.validate()) { 137 | _formKey.currentState!.save(); 138 | postComment(commentId, _name, _email, _website, 139 | _comment) 140 | .then((back) { 141 | if (back) { 142 | Navigator.of(context).pop(); 143 | } else { 144 | final snackBar = SnackBar( 145 | content: Text( 146 | 'Error while posting comment. Try again.')); 147 | ScaffoldMessenger.of(context).showSnackBar(snackBar); 148 | } 149 | }); 150 | } 151 | }, 152 | label: Text( 153 | 'Send Comment', 154 | style: TextStyle(color: Colors.white), 155 | ), 156 | ), 157 | ), 158 | Text( 159 | "Note: Your posted comment will appear in comments section once admin approve it.", 160 | textAlign: TextAlign.center, 161 | ) 162 | ], 163 | ) // Build this out in the next steps. 164 | ), 165 | ), 166 | ), 167 | ); 168 | })); 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /lib/pages/articles.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:convert'; 3 | import 'dart:io'; 4 | 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_wordpress_app/common/constants.dart'; 7 | import 'package:flutter_wordpress_app/models/Article.dart'; 8 | import 'package:flutter_wordpress_app/pages/single_Article.dart'; 9 | import 'package:flutter_wordpress_app/widgets/articleBox.dart'; 10 | import 'package:flutter_wordpress_app/widgets/articleBoxFeatured.dart'; 11 | import 'package:http/http.dart' as http; 12 | 13 | class Articles extends StatefulWidget { 14 | @override 15 | _ArticlesState createState() => _ArticlesState(); 16 | } 17 | 18 | class _ArticlesState extends State { 19 | List featuredArticles = []; 20 | List latestArticles = []; 21 | Future>? _futureLastestArticles; 22 | Future>? _futureFeaturedArticles; 23 | ScrollController? _controller; 24 | int page = 1; 25 | bool _infiniteStop = false; 26 | 27 | @override 28 | void initState() { 29 | super.initState(); 30 | _futureLastestArticles = fetchLatestArticles(1); 31 | _futureFeaturedArticles = fetchFeaturedArticles(1); 32 | _controller = 33 | ScrollController(initialScrollOffset: 0.0, keepScrollOffset: true); 34 | _controller!.addListener(_scrollListener); 35 | _infiniteStop = false; 36 | } 37 | 38 | @override 39 | void dispose() { 40 | super.dispose(); 41 | _controller!.dispose(); 42 | } 43 | 44 | Future> fetchLatestArticles(int page) async { 45 | try { 46 | var response = await http.get( 47 | Uri.parse('$WORDPRESS_URL/wp-json/wp/v2/posts/?page=$page&per_page=10&_fields=id,date,title,content,custom,link')); 48 | if (this.mounted) { 49 | if (response.statusCode == 200) { 50 | setState(() { 51 | latestArticles.addAll(json 52 | .decode(response.body) 53 | .map((m) => Article.fromJson(m)) 54 | .toList()); 55 | if (latestArticles.length % 10 != 0) { 56 | _infiniteStop = true; 57 | } 58 | }); 59 | return latestArticles; 60 | } 61 | setState(() { 62 | _infiniteStop = true; 63 | }); 64 | } 65 | } on SocketException { 66 | throw 'No Internet connection'; 67 | } 68 | return latestArticles; 69 | } 70 | 71 | Future> fetchFeaturedArticles(int page) async { 72 | try { 73 | var response = await http.get( 74 | Uri.parse("$WORDPRESS_URL/wp-json/wp/v2/posts/?categories[]=$FEATURED_ID&page=$page&per_page=10&_fields=id,date,title,content,custom,link")); 75 | 76 | if (this.mounted) { 77 | if (response.statusCode == 200) { 78 | setState(() { 79 | featuredArticles.addAll(json 80 | .decode(response.body) 81 | .map((m) => Article.fromJson(m)) 82 | .toList()); 83 | }); 84 | 85 | return featuredArticles; 86 | } else { 87 | setState(() { 88 | _infiniteStop = true; 89 | }); 90 | } 91 | } 92 | } on SocketException { 93 | throw 'No Internet connection'; 94 | } 95 | return featuredArticles; 96 | } 97 | 98 | _scrollListener() { 99 | var isEnd = _controller!.offset >= _controller!.position.maxScrollExtent && 100 | !_controller!.position.outOfRange; 101 | if (isEnd) { 102 | setState(() { 103 | page += 1; 104 | _futureLastestArticles = fetchLatestArticles(page); 105 | }); 106 | } 107 | } 108 | 109 | @override 110 | Widget build(BuildContext context) { 111 | return Scaffold( 112 | backgroundColor: Colors.white, 113 | appBar: AppBar( 114 | title: Image( 115 | image: AssetImage('assets/icon.png'), 116 | height: 45, 117 | ), 118 | elevation: 5, 119 | backgroundColor: Colors.white, 120 | ), 121 | body: Container( 122 | decoration: BoxDecoration(color: Colors.white70), 123 | child: SingleChildScrollView( 124 | controller: _controller, 125 | scrollDirection: Axis.vertical, 126 | child: Column( 127 | children: [ 128 | featuredPost(_futureFeaturedArticles as Future>), 129 | latestPosts(_futureLastestArticles as Future>) 130 | ], 131 | ), 132 | ), 133 | )); 134 | } 135 | 136 | Widget latestPosts(Future> latestArticles) { 137 | return FutureBuilder>( 138 | future: latestArticles, 139 | builder: (context, articleSnapshot) { 140 | if (articleSnapshot.hasData) { 141 | if (articleSnapshot.data!.length == 0) return Container(); 142 | return Column( 143 | children: [ 144 | Column( 145 | children: articleSnapshot.data!.map((item) { 146 | final heroId = item.id.toString() + "-latest"; 147 | return InkWell( 148 | onTap: () { 149 | Navigator.push( 150 | context, 151 | MaterialPageRoute( 152 | builder: (context) => SingleArticle(item, heroId), 153 | ), 154 | ); 155 | }, 156 | child: articleBox(context, item, heroId), 157 | ); 158 | }).toList()), 159 | !_infiniteStop 160 | ? Container() 161 | : Container() 162 | ], 163 | ); 164 | } else if (articleSnapshot.hasError) { 165 | return Container(); 166 | } 167 | return Container( 168 | alignment: Alignment.center, 169 | width: MediaQuery.of(context).size.width, 170 | height: 150, 171 | ); 172 | }, 173 | ); 174 | } 175 | 176 | Widget featuredPost(Future> featuredArticles) { 177 | return SingleChildScrollView( 178 | scrollDirection: Axis.horizontal, 179 | child: FutureBuilder>( 180 | future: featuredArticles, 181 | builder: (context, articleSnapshot) { 182 | if (articleSnapshot.hasData) { 183 | if (articleSnapshot.data!.length == 0) return Container(); 184 | return Row( 185 | children: articleSnapshot.data!.map((item) { 186 | final heroId = item.id.toString() + "-featured"; 187 | return InkWell( 188 | onTap: () { 189 | Navigator.push( 190 | context, 191 | MaterialPageRoute( 192 | builder: (context) => SingleArticle(item, heroId), 193 | ), 194 | ); 195 | }, 196 | child: articleBoxFeatured(context, item, heroId)); 197 | }).toList()); 198 | } else if (articleSnapshot.hasError) { 199 | return Container( 200 | alignment: Alignment.center, 201 | margin: EdgeInsets.fromLTRB(0, 60, 0, 0), 202 | width: MediaQuery.of(context).size.width, 203 | height: MediaQuery.of(context).size.height, 204 | child: Column( 205 | children: [ 206 | Image.asset( 207 | "assets/no-internet.png", 208 | width: 250, 209 | ), 210 | Text("No Internet Connection."), 211 | TextButton.icon( 212 | icon: Icon(Icons.refresh), 213 | label: Text("Reload"), 214 | onPressed: () { 215 | _futureLastestArticles = fetchLatestArticles(1); 216 | _futureFeaturedArticles = fetchFeaturedArticles(1); 217 | }, 218 | ) 219 | ], 220 | ), 221 | ); 222 | } 223 | return Container( 224 | alignment: Alignment.center, 225 | width: MediaQuery.of(context).size.width, 226 | height: 280, 227 | 228 | ); 229 | }, 230 | ), 231 | ); 232 | } 233 | } 234 | -------------------------------------------------------------------------------- /lib/pages/category_articles.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_wordpress_app/common/constants.dart'; 6 | import 'package:flutter_wordpress_app/models/Article.dart'; 7 | import 'package:flutter_wordpress_app/pages/single_Article.dart'; 8 | import 'package:flutter_wordpress_app/widgets/articleBox.dart'; 9 | import 'package:http/http.dart' as http; 10 | 11 | class CategoryArticles extends StatefulWidget { 12 | final int id; 13 | final String name; 14 | CategoryArticles(this.id, this.name, {Key? key}) : super(key: key); 15 | @override 16 | _CategoryArticlesState createState() => _CategoryArticlesState(); 17 | } 18 | 19 | class _CategoryArticlesState extends State { 20 | List categoryArticles = []; 21 | Future>? _futureCategoryArticles; 22 | ScrollController? _controller; 23 | int page = 1; 24 | bool _infiniteStop = false; 25 | 26 | @override 27 | void initState() { 28 | super.initState(); 29 | _futureCategoryArticles = fetchCategoryArticles(1); 30 | _controller = 31 | ScrollController(initialScrollOffset: 0.0, keepScrollOffset: true); 32 | _controller!.addListener(_scrollListener); 33 | _infiniteStop = false; 34 | } 35 | 36 | @override 37 | void dispose() { 38 | super.dispose(); 39 | _controller!.dispose(); 40 | } 41 | 42 | Future> fetchCategoryArticles(int page) async { 43 | try { 44 | var response = await http.get( 45 | Uri.parse("$WORDPRESS_URL/wp-json/wp/v2/posts?categories[]=" + 46 | widget.id.toString() + 47 | "&page=$page&per_page=10&_fields=id,date,title,content,custom,link")); 48 | 49 | if (this.mounted) { 50 | if (response.statusCode == 200) { 51 | setState(() { 52 | categoryArticles.addAll(json 53 | .decode(response.body) 54 | .map((m) => Article.fromJson(m)) 55 | .toList()); 56 | if (categoryArticles.length % 10 != 0) { 57 | _infiniteStop = true; 58 | } 59 | }); 60 | 61 | return categoryArticles; 62 | } 63 | setState(() { 64 | _infiniteStop = true; 65 | }); 66 | } 67 | } on SocketException { 68 | throw 'No Internet connection'; 69 | } 70 | return categoryArticles; 71 | } 72 | 73 | _scrollListener() { 74 | var isEnd = _controller!.offset >= _controller!.position.maxScrollExtent && 75 | !_controller!.position.outOfRange; 76 | if (isEnd) { 77 | setState(() { 78 | page += 1; 79 | _futureCategoryArticles = fetchCategoryArticles(page); 80 | }); 81 | } 82 | } 83 | 84 | @override 85 | Widget build(BuildContext context) { 86 | return Scaffold( 87 | backgroundColor: Colors.white, 88 | appBar: AppBar( 89 | leading: IconButton( 90 | icon: Icon(Icons.arrow_back), 91 | color: Colors.black, 92 | onPressed: () { 93 | Navigator.of(context).pop(); 94 | }, 95 | ), 96 | title: Text(widget.name, 97 | textAlign: TextAlign.left, 98 | style: TextStyle( 99 | color: Colors.black, 100 | fontWeight: FontWeight.bold, 101 | fontSize: 20, 102 | fontFamily: 'Poppins')), 103 | elevation: 5, 104 | backgroundColor: Colors.white, 105 | ), 106 | body: Container( 107 | decoration: BoxDecoration(color: Colors.white), 108 | child: SingleChildScrollView( 109 | controller: _controller, 110 | scrollDirection: Axis.vertical, 111 | child: Column( 112 | children: [categoryPosts(_futureCategoryArticles as Future>)])), 113 | ), 114 | ); 115 | } 116 | 117 | Widget categoryPosts(Future> categoryArticles) { 118 | return FutureBuilder>( 119 | future: categoryArticles, 120 | builder: (context, articleSnapshot) { 121 | if (articleSnapshot.hasData) { 122 | if (articleSnapshot.data!.length == 0) return Container(); 123 | return Column( 124 | children: [ 125 | Column( 126 | children: articleSnapshot.data!.map((item) { 127 | final heroId = item.id.toString() + "-categorypost"; 128 | return InkWell( 129 | onTap: () { 130 | Navigator.push( 131 | context, 132 | MaterialPageRoute( 133 | builder: (context) => SingleArticle(item, heroId), 134 | ), 135 | ); 136 | }, 137 | child: articleBox(context, item, heroId), 138 | ); 139 | }).toList()), 140 | !_infiniteStop 141 | ? Container( 142 | alignment: Alignment.center, 143 | height: 30, 144 | ) 145 | : Container() 146 | ], 147 | ); 148 | } else if (articleSnapshot.hasError) { 149 | return Container( 150 | height: 500, 151 | alignment: Alignment.center, 152 | child: Text("${articleSnapshot.error}")); 153 | } 154 | return Container( 155 | alignment: Alignment.center, 156 | height: 400, 157 | 158 | ); 159 | }, 160 | ); 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /lib/pages/comments.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:convert'; 3 | import 'dart:io'; 4 | 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_wordpress_app/common/constants.dart'; 7 | import 'package:flutter_wordpress_app/models/Comment.dart'; 8 | import 'package:flutter_wordpress_app/widgets/commentBox.dart'; 9 | import 'package:http/http.dart' as http; 10 | 11 | import 'add_comment.dart'; 12 | 13 | Future> fetchComments(int id) async { 14 | try { 15 | var response = await http 16 | .get(Uri.parse("$WORDPRESS_URL/wp-json/wp/v2/comments?post=" + id.toString())); 17 | 18 | if (response.statusCode == 200) { 19 | return json 20 | .decode(response.body) 21 | .map((m) => Comment.fromJson(m)) 22 | .toList(); 23 | } else { 24 | throw "Error loading posts"; 25 | } 26 | } on SocketException { 27 | throw 'No Internet connection'; 28 | } 29 | } 30 | 31 | class Comments extends StatefulWidget { 32 | final int commentId; 33 | 34 | Comments(this.commentId, {Key? key}) : super(key: key); 35 | @override 36 | _CommentsState createState() => _CommentsState(); 37 | } 38 | 39 | class _CommentsState extends State { 40 | @override 41 | Widget build(BuildContext context) { 42 | int commentId = widget.commentId; 43 | return Scaffold( 44 | appBar: AppBar( 45 | leading: IconButton( 46 | icon: Icon(Icons.close), 47 | color: Colors.black, 48 | onPressed: () { 49 | Navigator.of(context).pop(); 50 | }, 51 | ), 52 | title: const Text('Comments', 53 | style: TextStyle( 54 | color: Colors.black, 55 | fontWeight: FontWeight.bold, 56 | fontSize: 20, 57 | fontFamily: 'Poppins')), 58 | elevation: 5, 59 | backgroundColor: Colors.white, 60 | ), 61 | body: Container( 62 | child: SingleChildScrollView( 63 | scrollDirection: Axis.vertical, 64 | child: Column( 65 | children: [commentSection(fetchComments(commentId))]), 66 | ), 67 | ), 68 | floatingActionButton: FloatingActionButton( 69 | onPressed: () { 70 | Navigator.push( 71 | context, 72 | MaterialPageRoute( 73 | builder: (context) => AddComment(commentId), 74 | fullscreenDialog: true, 75 | )); 76 | }, 77 | child: Icon(Icons.add_comment), 78 | backgroundColor: Theme.of(context).primaryColor, 79 | ), 80 | ); 81 | } 82 | } 83 | 84 | Widget commentSection(Future> comments) { 85 | return FutureBuilder>( 86 | future: comments, 87 | builder: (context, commentSnapshot) { 88 | if (commentSnapshot.hasData) { 89 | if (commentSnapshot.data!.length == 0) 90 | return Container( 91 | height: 500, 92 | alignment: Alignment.center, 93 | child: Text( 94 | "No Comments.\nBe the first to write one.", 95 | textAlign: TextAlign.center, 96 | ), 97 | ); 98 | return Column( 99 | children: commentSnapshot.data!.map((item) { 100 | return InkWell( 101 | onTap: () {}, 102 | child: commentBox(context, item.author, item.avatar, item.content), 103 | ); 104 | }).toList()); 105 | } else if (commentSnapshot.hasError) { 106 | return Container( 107 | height: 500, 108 | alignment: Alignment.center, 109 | child: Text("${commentSnapshot.error}")); 110 | } 111 | return Container( 112 | alignment: Alignment.center, 113 | height: 400, 114 | ); 115 | }, 116 | ); 117 | } 118 | -------------------------------------------------------------------------------- /lib/pages/local_articles.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_wordpress_app/common/constants.dart'; 6 | import 'package:flutter_wordpress_app/models/Article.dart'; 7 | import 'package:flutter_wordpress_app/pages/single_Article.dart'; 8 | import 'package:flutter_wordpress_app/widgets/articleBox.dart'; 9 | import 'package:http/http.dart' as http; 10 | 11 | class LocalArticles extends StatefulWidget { 12 | @override 13 | _LocalArticlesState createState() => _LocalArticlesState(); 14 | } 15 | 16 | class _LocalArticlesState extends State { 17 | List articles = []; 18 | Future>? _futureArticles; 19 | 20 | ScrollController? _controller; 21 | int page = 1; 22 | bool _infiniteStop = false; 23 | 24 | @override 25 | void initState() { 26 | super.initState(); 27 | _futureArticles = fetchLocalArticles(1); 28 | _controller = 29 | ScrollController(initialScrollOffset: 0.0, keepScrollOffset: true); 30 | _controller!.addListener(_scrollListener); 31 | _infiniteStop = false; 32 | } 33 | 34 | @override 35 | void dispose() { 36 | super.dispose(); 37 | _controller!.dispose(); 38 | } 39 | 40 | Future> fetchLocalArticles(int page) async { 41 | try { 42 | http.Response response = await http.get( 43 | Uri.parse("$WORDPRESS_URL/wp-json/wp/v2/posts/?categories[]=$PAGE2_CATEGORY_ID&page=$page&per_page=10&_fields=id,date,title,content,custom,link")); 44 | if (this.mounted) { 45 | if (response.statusCode == 200) { 46 | setState(() { 47 | articles.addAll(json 48 | .decode(response.body) 49 | .map((m) => Article.fromJson(m)) 50 | .toList()); 51 | if (articles.length % 10 != 0) { 52 | _infiniteStop = true; 53 | } 54 | }); 55 | 56 | return articles; 57 | } 58 | setState(() { 59 | _infiniteStop = true; 60 | }); 61 | } 62 | } on SocketException { 63 | throw 'No Internet connection'; 64 | } 65 | 66 | return articles; 67 | } 68 | 69 | _scrollListener() { 70 | var isEnd = _controller!.offset >= _controller!.position.maxScrollExtent && 71 | !_controller!.position.outOfRange; 72 | if (isEnd) { 73 | setState(() { 74 | page += 1; 75 | _futureArticles = fetchLocalArticles(page); 76 | }); 77 | } 78 | } 79 | 80 | @override 81 | Widget build(BuildContext context) { 82 | return Scaffold( 83 | backgroundColor: Colors.white, 84 | appBar: AppBar( 85 | centerTitle: true, 86 | title: Text( 87 | PAGE2_CATEGORY_NAME, 88 | style: TextStyle( 89 | color: Colors.black, 90 | fontWeight: FontWeight.bold, 91 | fontSize: 20, 92 | fontFamily: 'Poppins'), 93 | ), 94 | elevation: 5, 95 | backgroundColor: Colors.white, 96 | ), 97 | body: Container( 98 | child: SingleChildScrollView( 99 | scrollDirection: Axis.vertical, 100 | controller: _controller, 101 | child: Column( 102 | children: [ 103 | categoryPosts(_futureArticles as Future>), 104 | ], 105 | )), 106 | ), 107 | ); 108 | } 109 | 110 | Widget categoryPosts(Future> futureArticles) { 111 | return FutureBuilder>( 112 | future: futureArticles, 113 | builder: (context, articleSnapshot) { 114 | if (articleSnapshot.hasData) { 115 | if (articleSnapshot.data!.length == 0) return Container(); 116 | return Column( 117 | children: [ 118 | Column( 119 | children: articleSnapshot.data!.map((item) { 120 | final heroId = item.id.toString() + "-latest"; 121 | return InkWell( 122 | onTap: () { 123 | Navigator.push( 124 | context, 125 | MaterialPageRoute( 126 | builder: (context) => SingleArticle(item, heroId), 127 | ), 128 | ); 129 | }, 130 | child: articleBox(context, item, heroId), 131 | ); 132 | }).toList()), 133 | !_infiniteStop 134 | ? Container( 135 | alignment: Alignment.center, 136 | height: 30, 137 | ) 138 | : Container() 139 | ], 140 | ); 141 | } else if (articleSnapshot.hasError) { 142 | return Container(); 143 | } 144 | return Container( 145 | alignment: Alignment.center, 146 | height: 400, 147 | width: MediaQuery.of(context).size.width - 30, 148 | ); 149 | }, 150 | ); 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /lib/pages/search.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:convert'; 3 | import 'dart:io'; 4 | 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_wordpress_app/common/constants.dart'; 7 | import 'package:flutter_wordpress_app/models/Article.dart'; 8 | import 'package:flutter_wordpress_app/pages/single_article.dart'; 9 | import 'package:flutter_wordpress_app/widgets/articleBox.dart'; 10 | import 'package:flutter_wordpress_app/widgets/searchBoxes.dart'; 11 | import 'package:http/http.dart' as http; 12 | 13 | class Search extends StatefulWidget { 14 | @override 15 | _SearchState createState() => _SearchState(); 16 | } 17 | 18 | class _SearchState extends State { 19 | String _searchText = ""; 20 | List searchedArticles = []; 21 | Future>? _futureSearchedArticles; 22 | ScrollController? _controller; 23 | final TextEditingController _textFieldController = 24 | new TextEditingController(); 25 | 26 | int page = 1; 27 | bool _infiniteStop = false; 28 | 29 | @override 30 | void initState() { 31 | super.initState(); 32 | _futureSearchedArticles = 33 | fetchSearchedArticles(_searchText, _searchText == "", page, false); 34 | _controller = 35 | ScrollController(initialScrollOffset: 0.0, keepScrollOffset: true); 36 | _controller!.addListener(_scrollListener); 37 | _infiniteStop = false; 38 | } 39 | 40 | Future> fetchSearchedArticles( 41 | String searchText, bool empty, int page, bool scrollUpdate) async { 42 | try { 43 | if (empty) { 44 | return searchedArticles; 45 | } 46 | 47 | var response = await http.get( 48 | Uri.parse("$WORDPRESS_URL/wp-json/wp/v2/posts?search=$searchText&page=$page&per_page=10&_fields=id,date,title,content,custom,link")); 49 | 50 | if (this.mounted) { 51 | if (response.statusCode == 200) { 52 | setState(() { 53 | if (scrollUpdate) { 54 | searchedArticles.addAll(json 55 | .decode(response.body) 56 | .map((m) => Article.fromJson(m)) 57 | .toList()); 58 | } else { 59 | searchedArticles = json 60 | .decode(response.body) 61 | .map((m) => Article.fromJson(m)) 62 | .toList(); 63 | } 64 | 65 | if (searchedArticles.length % 10 != 0) { 66 | _infiniteStop = true; 67 | } 68 | }); 69 | 70 | return searchedArticles; 71 | } 72 | setState(() { 73 | _infiniteStop = true; 74 | }); 75 | } 76 | } on SocketException { 77 | throw 'No Internet connection'; 78 | } 79 | return searchedArticles; 80 | } 81 | 82 | _scrollListener() { 83 | var isEnd = _controller!.offset >= _controller!.position.maxScrollExtent && 84 | !_controller!.position.outOfRange; 85 | if (isEnd) { 86 | setState(() { 87 | page += 1; 88 | _futureSearchedArticles = 89 | fetchSearchedArticles(_searchText, _searchText == "", page, true); 90 | }); 91 | } 92 | } 93 | 94 | @override 95 | void dispose() { 96 | super.dispose(); 97 | _textFieldController.dispose(); 98 | _controller!.dispose(); 99 | } 100 | 101 | @override 102 | Widget build(BuildContext context) { 103 | return Scaffold( 104 | appBar: AppBar( 105 | centerTitle: true, 106 | title: Text('Search', 107 | style: TextStyle( 108 | color: Colors.black, 109 | fontWeight: FontWeight.bold, 110 | fontSize: 20, 111 | fontFamily: 'Poppins')), 112 | elevation: 5, 113 | backgroundColor: Colors.white, 114 | ), 115 | body: Container( 116 | child: SingleChildScrollView( 117 | controller: _controller, 118 | scrollDirection: Axis.vertical, 119 | child: Column( 120 | children: [ 121 | Padding( 122 | padding: EdgeInsets.all(16.0), 123 | child: Card( 124 | elevation: 6, 125 | child: Padding( 126 | padding: EdgeInsets.fromLTRB(16, 4, 16, 4), 127 | child: TextField( 128 | controller: _textFieldController, 129 | decoration: InputDecoration( 130 | labelText: 'Search news', 131 | suffixIcon: _searchText == "" 132 | ? Icon(Icons.search) 133 | : IconButton( 134 | icon: Icon(Icons.close), 135 | onPressed: () { 136 | _textFieldController.clear(); 137 | setState(() { 138 | _searchText = ""; 139 | _futureSearchedArticles = 140 | fetchSearchedArticles(_searchText, 141 | _searchText == "", page, false); 142 | }); 143 | }, 144 | ), 145 | border: InputBorder.none, 146 | focusedBorder: InputBorder.none, 147 | ), 148 | onChanged: (text) { 149 | setState(() { 150 | _searchText = text; 151 | page = 1; 152 | _futureSearchedArticles = fetchSearchedArticles( 153 | _searchText, _searchText == "", page, false); 154 | }); 155 | }), 156 | ), 157 | ), 158 | ), 159 | searchPosts(_futureSearchedArticles as Future>) 160 | ], 161 | ), 162 | ), 163 | ), 164 | ); 165 | } 166 | 167 | Widget searchPosts(Future> articles) { 168 | return FutureBuilder>( 169 | future: articles, 170 | builder: (context, articleSnapshot) { 171 | if (articleSnapshot.hasData) { 172 | if (articleSnapshot.data!.length == 0) { 173 | return Column( 174 | children: [ 175 | searchBoxes(context), 176 | ], 177 | ); 178 | } 179 | return Column( 180 | children: [ 181 | Column( 182 | children: articleSnapshot.data!.map((item) { 183 | final heroId = item.id.toString() + "-searched"; 184 | return InkWell( 185 | onTap: () { 186 | Navigator.push( 187 | context, 188 | MaterialPageRoute( 189 | builder: (context) => SingleArticle(item, heroId), 190 | ), 191 | ); 192 | }, 193 | child: articleBox(context, item, heroId), 194 | ); 195 | }).toList()), 196 | !_infiniteStop 197 | ? Container( 198 | alignment: Alignment.center, 199 | height: 30, 200 | ) 201 | : Container() 202 | ], 203 | ); 204 | } else if (articleSnapshot.hasError) { 205 | return Container( 206 | alignment: Alignment.center, 207 | margin: EdgeInsets.fromLTRB(0, 60, 0, 0), 208 | width: MediaQuery.of(context).size.width, 209 | height: MediaQuery.of(context).size.height, 210 | child: Column( 211 | children: [ 212 | Image.asset( 213 | "assets/no-internet.png", 214 | width: 250, 215 | ), 216 | Text("No Internet Connection."), 217 | TextButton.icon( 218 | icon: Icon(Icons.refresh), 219 | label: Text("Reload"), 220 | onPressed: () { 221 | _futureSearchedArticles = fetchSearchedArticles( 222 | _searchText, _searchText == "", page, false); 223 | }, 224 | ) 225 | ], 226 | ), 227 | ); 228 | } 229 | return Container( 230 | alignment: Alignment.center, 231 | width: 300, 232 | height: 150 233 | ); 234 | }, 235 | ); 236 | } 237 | } 238 | -------------------------------------------------------------------------------- /lib/pages/settings.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:share/share.dart'; 3 | import 'package:url_launcher/url_launcher.dart'; 4 | 5 | class Settings extends StatefulWidget { 6 | @override 7 | _SettingsState createState() => _SettingsState(); 8 | } 9 | 10 | class _SettingsState extends State { 11 | 12 | @override 13 | void initState() { 14 | super.initState(); 15 | } 16 | 17 | 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Scaffold( 22 | backgroundColor: Colors.white, 23 | appBar: AppBar( 24 | centerTitle: true, 25 | title: Text( 26 | 'More', 27 | style: TextStyle( 28 | color: Colors.black, 29 | fontWeight: FontWeight.bold, 30 | fontSize: 20, 31 | fontFamily: 'Poppins'), 32 | ), 33 | elevation: 5, 34 | backgroundColor: Colors.white, 35 | ), 36 | body: Container( 37 | decoration: BoxDecoration(color: Colors.white), 38 | child: Column( 39 | children: [ 40 | Container( 41 | alignment: Alignment.center, 42 | padding: EdgeInsets.fromLTRB(0, 20, 0, 10), 43 | child: Image( 44 | image: AssetImage('assets/icon.png'), 45 | height: 50, 46 | ), 47 | ), 48 | Container( 49 | alignment: Alignment.center, 50 | padding: EdgeInsets.fromLTRB(0, 10, 0, 20), 51 | child: Text( 52 | "Version 2.0.0 \n flutterblog.crumet.com \n Demo flutter app for wordpress news website", 53 | textAlign: TextAlign.center, 54 | style: TextStyle(height: 1.6, color: Colors.black87), 55 | ), 56 | ), 57 | Divider( 58 | height: 10, 59 | thickness: 2, 60 | ), 61 | ListView( 62 | shrinkWrap: true, 63 | children: [ 64 | 65 | ListTile( 66 | leading: Image.asset( 67 | "assets/more/contact.png", 68 | width: 30, 69 | ), 70 | title: Text('Contact'), 71 | subtitle: Column( 72 | crossAxisAlignment: CrossAxisAlignment.start, 73 | children: [ 74 | TextButton( 75 | onPressed: () async { 76 | const url = 'https://flutterblog.crumet.com'; 77 | if (await canLaunch(url)) { 78 | await launch(url); 79 | } else { 80 | throw 'Could not launch $url'; 81 | } 82 | }, 83 | child: Text( 84 | "flutterblog.crumet.com", 85 | style: TextStyle(color: Colors.black54), 86 | )), 87 | TextButton( 88 | onPressed: () async { 89 | const url = 'mailto:info@crumet.com'; 90 | if (await canLaunch(url)) { 91 | await launch(url); 92 | } else { 93 | throw 'Could not launch $url'; 94 | } 95 | }, 96 | child: Text( 97 | "info@crumet.com", 98 | style: TextStyle(color: Colors.black54), 99 | )), 100 | ], 101 | ), 102 | ), 103 | InkWell( 104 | onTap: () { 105 | Share.share( 106 | 'Check out our blog: https://flutterblog.crumet.com'); 107 | }, 108 | child: ListTile( 109 | leading: Image.asset( 110 | "assets/more/share.png", 111 | width: 30, 112 | ), 113 | title: Text('Share'), 114 | subtitle: Text("Spread the words of flutter blog crumet"), 115 | ), 116 | ), 117 | ], 118 | ) 119 | ], 120 | ), 121 | ), 122 | ); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /lib/pages/single_article.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:convert'; 3 | import 'dart:io'; 4 | 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_html/flutter_html.dart'; 7 | import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; 8 | import 'package:flutter_wordpress_app/common/constants.dart'; 9 | import 'package:flutter_wordpress_app/models/Article.dart'; 10 | import 'package:flutter_wordpress_app/pages/comments.dart'; 11 | import 'package:flutter_wordpress_app/widgets/articleBox.dart'; 12 | import 'package:http/http.dart' as http; 13 | import 'package:share/share.dart'; 14 | 15 | class SingleArticle extends StatefulWidget { 16 | final dynamic article; 17 | final String heroId; 18 | 19 | SingleArticle(this.article, this.heroId, {Key? key}) : super(key: key); 20 | 21 | @override 22 | _SingleArticleState createState() => _SingleArticleState(); 23 | } 24 | 25 | class _SingleArticleState extends State { 26 | List relatedArticles = []; 27 | Future>? _futureRelatedArticles; 28 | 29 | @override 30 | void initState() { 31 | super.initState(); 32 | 33 | _futureRelatedArticles = fetchRelatedArticles(); 34 | } 35 | 36 | Future> fetchRelatedArticles() async { 37 | try { 38 | int postId = widget.article.id; 39 | int catId = widget.article.catId; 40 | var response = await http.get(Uri.parse( 41 | "$WORDPRESS_URL/wp-json/wp/v2/posts?exclude=$postId&categories[]=$catId&per_page=3")); 42 | 43 | if (this.mounted) { 44 | if (response.statusCode == 200) { 45 | setState(() { 46 | relatedArticles = json 47 | .decode(response.body) 48 | .map((m) => Article.fromJson(m)) 49 | .toList(); 50 | }); 51 | 52 | return relatedArticles; 53 | } 54 | } 55 | } on SocketException { 56 | throw 'No Internet connection'; 57 | } 58 | return relatedArticles; 59 | } 60 | 61 | @override 62 | void dispose() { 63 | super.dispose(); 64 | relatedArticles = []; 65 | } 66 | 67 | @override 68 | Widget build(BuildContext context) { 69 | final article = widget.article; 70 | final heroId = widget.heroId; 71 | final articleVideo = widget.article.video; 72 | String youtubeUrl = ""; 73 | String dailymotionUrl = ""; 74 | if (articleVideo.contains("youtube")) { 75 | youtubeUrl = articleVideo.split('?v=')[1]; 76 | } 77 | if (articleVideo.contains("dailymotion")) { 78 | dailymotionUrl = articleVideo.split("/video/")[1]; 79 | } 80 | 81 | return Scaffold( 82 | body: Container( 83 | decoration: BoxDecoration(color: Colors.white70), 84 | child: SingleChildScrollView( 85 | scrollDirection: Axis.vertical, 86 | child: Column( 87 | children: [ 88 | Stack( 89 | children: [ 90 | Container( 91 | child: Hero( 92 | tag: heroId, 93 | child: ClipRRect( 94 | borderRadius: BorderRadius.only( 95 | bottomLeft: Radius.circular(60.0)), 96 | child: ColorFiltered( 97 | colorFilter: ColorFilter.mode( 98 | Colors.black.withOpacity(0.3), 99 | BlendMode.overlay), 100 | child: articleVideo != "" 101 | ? articleVideo.contains("youtube") 102 | ? Container( 103 | padding: EdgeInsets.fromLTRB( 104 | 0, 105 | MediaQuery.of(context).padding.top, 106 | 0, 107 | 0), 108 | decoration: 109 | BoxDecoration(color: Colors.black), 110 | child: HtmlWidget( 111 | """ 112 | 113 | """, 114 | webView: true, 115 | ), 116 | ) 117 | : articleVideo.contains("dailymotion") 118 | ? Container( 119 | padding: EdgeInsets.fromLTRB( 120 | 0, 121 | MediaQuery.of(context) 122 | .padding 123 | .top, 124 | 0, 125 | 0), 126 | decoration: BoxDecoration( 127 | color: Colors.black), 128 | child: HtmlWidget( 129 | """ 130 | 134 | """, 135 | webView: true, 136 | ), 137 | ) 138 | : Container( 139 | padding: EdgeInsets.fromLTRB( 140 | 0, 141 | MediaQuery.of(context) 142 | .padding 143 | .top, 144 | 0, 145 | 0), 146 | decoration: BoxDecoration( 147 | color: Colors.black), 148 | child: HtmlWidget( 149 | """ 150 | 153 | """, 154 | webView: true, 155 | ), 156 | ) 157 | : Image.network( 158 | article.image, 159 | fit: BoxFit.cover, 160 | ), 161 | ), 162 | ), 163 | ), 164 | ), 165 | Positioned( 166 | top: MediaQuery.of(context).padding.top, 167 | child: IconButton( 168 | icon: Icon(Icons.arrow_back), 169 | color: Colors.white, 170 | onPressed: () { 171 | Navigator.of(context).pop(); 172 | }, 173 | ), 174 | ), 175 | ], 176 | ), 177 | Container( 178 | child: Column( 179 | crossAxisAlignment: CrossAxisAlignment.start, 180 | mainAxisAlignment: MainAxisAlignment.start, 181 | children: [ 182 | Html(data: "

" + article.title + "

", style: { 183 | "h2": Style( 184 | color: Theme.of(context).primaryColorDark, 185 | fontWeight: FontWeight.w500, 186 | fontSize: FontSize.em(1.6), 187 | padding: EdgeInsets.all(4)), 188 | }), 189 | Container( 190 | decoration: BoxDecoration( 191 | color: Color(0xFFE3E3E3), 192 | borderRadius: BorderRadius.circular(3)), 193 | padding: EdgeInsets.fromLTRB(8, 4, 8, 4), 194 | margin: EdgeInsets.all(16), 195 | child: Text( 196 | article.category, 197 | style: TextStyle(color: Colors.black, fontSize: 11), 198 | ), 199 | ), 200 | SizedBox( 201 | height: 45, 202 | child: ListTile( 203 | leading: CircleAvatar( 204 | backgroundImage: NetworkImage(article.avatar), 205 | ), 206 | title: Text( 207 | "By " + article.author, 208 | style: TextStyle(fontSize: 12), 209 | ), 210 | subtitle: Text( 211 | article.date, 212 | style: TextStyle(fontSize: 11), 213 | ), 214 | ), 215 | ), 216 | Container( 217 | padding: EdgeInsets.fromLTRB(16, 36, 16, 50), 218 | child: HtmlWidget( 219 | article.content, 220 | webView: true, 221 | textStyle: Theme.of(context).textTheme.bodyText1 ?? TextStyle(), 222 | ), 223 | ), 224 | ], 225 | ), 226 | ), 227 | relatedPosts(_futureRelatedArticles as Future>) 228 | ], 229 | ), 230 | )), 231 | bottomNavigationBar: BottomAppBar( 232 | child: Container( 233 | decoration: BoxDecoration(color: Colors.white10), 234 | height: 50, 235 | padding: EdgeInsets.all(16), 236 | child: Row( 237 | mainAxisAlignment: MainAxisAlignment.spaceAround, 238 | children: [ 239 | Container( 240 | child: IconButton( 241 | padding: EdgeInsets.all(0), 242 | icon: Icon( 243 | Icons.comment, 244 | color: Colors.blue, 245 | size: 24.0, 246 | ), 247 | onPressed: () { 248 | Navigator.push( 249 | context, 250 | MaterialPageRoute( 251 | builder: (context) => Comments(article.id), 252 | fullscreenDialog: true, 253 | )); 254 | }, 255 | ), 256 | ), 257 | Container( 258 | child: IconButton( 259 | padding: EdgeInsets.all(0), 260 | icon: Icon( 261 | Icons.share, 262 | color: Colors.green, 263 | size: 24.0, 264 | ), 265 | onPressed: () { 266 | Share.share('Share the news: ' + article.link); 267 | }, 268 | ), 269 | ), 270 | ], 271 | ), 272 | ), 273 | ), 274 | ); 275 | } 276 | 277 | Widget relatedPosts(Future> latestArticles) { 278 | return FutureBuilder>( 279 | future: latestArticles, 280 | builder: (context, articleSnapshot) { 281 | if (articleSnapshot.hasData) { 282 | if (articleSnapshot.data!.length == 0) return Container(); 283 | return Column( 284 | children: [ 285 | Container( 286 | alignment: Alignment.topLeft, 287 | padding: EdgeInsets.all(16), 288 | child: Text( 289 | "Related Posts", 290 | textAlign: TextAlign.left, 291 | style: TextStyle( 292 | fontSize: 18, 293 | fontWeight: FontWeight.w600, 294 | fontFamily: "Poppins"), 295 | ), 296 | ), 297 | Column( 298 | children: articleSnapshot.data!.map((item) { 299 | final heroId = item.id.toString() + "-related"; 300 | return InkWell( 301 | onTap: () { 302 | Navigator.pushReplacement( 303 | context, 304 | MaterialPageRoute( 305 | builder: (context) => SingleArticle(item, heroId), 306 | ), 307 | ); 308 | }, 309 | child: articleBox(context, item, heroId), 310 | ); 311 | }).toList(), 312 | ), 313 | SizedBox( 314 | height: 24, 315 | ) 316 | ], 317 | ); 318 | } else if (articleSnapshot.hasError) { 319 | return Container( 320 | height: 500, 321 | alignment: Alignment.center, 322 | child: Text("${articleSnapshot.error}")); 323 | } 324 | return Container( 325 | alignment: Alignment.center, 326 | width: MediaQuery.of(context).size.width, 327 | height: 150 328 | ); 329 | }, 330 | ); 331 | } 332 | } 333 | -------------------------------------------------------------------------------- /lib/widgets/articleBox.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_html/flutter_html.dart'; 3 | import 'package:flutter_wordpress_app/models/Article.dart'; 4 | 5 | Widget articleBox(BuildContext context, Article article, String heroId) { 6 | return ConstrainedBox( 7 | constraints: new BoxConstraints( 8 | minHeight: 160.0, 9 | maxHeight: 175.0, 10 | ), 11 | child: Stack( 12 | children: [ 13 | Container( 14 | alignment: Alignment.bottomRight, 15 | margin: EdgeInsets.fromLTRB(20, 16, 8, 0), 16 | child: Card( 17 | elevation: 6, 18 | child: Padding( 19 | padding: EdgeInsets.fromLTRB(110, 0, 0, 0), 20 | child: Column( 21 | children: [ 22 | Container( 23 | padding: EdgeInsets.fromLTRB(8, 0, 4, 0), 24 | child: Column( 25 | children: [ 26 | Container( 27 | child: Html( 28 | data: article.title!.length > 70 29 | ? "

" + 30 | article.title!.substring(0, 70) + 31 | "...

" 32 | : "

" + article.title.toString() + "

", 33 | style: { 34 | "h2": Style( 35 | color: Theme.of(context).primaryColorDark, 36 | fontWeight: FontWeight.w500, 37 | fontSize: FontSize.em(1.05), 38 | padding: EdgeInsets.all(2), 39 | )}, 40 | ), 41 | ), 42 | Container( 43 | alignment: Alignment.topLeft, 44 | child: Column( 45 | crossAxisAlignment: CrossAxisAlignment.start, 46 | mainAxisAlignment: MainAxisAlignment.center, 47 | children: [ 48 | Container( 49 | decoration: BoxDecoration( 50 | color: Color(0xFFE3E3E3), 51 | borderRadius: BorderRadius.circular(3)), 52 | padding: EdgeInsets.fromLTRB(8, 4, 8, 4), 53 | margin: EdgeInsets.fromLTRB(0, 0, 0, 8), 54 | child: Text( 55 | article.category.toString(), 56 | style: TextStyle( 57 | color: Colors.black, 58 | fontSize: 11, 59 | fontWeight: FontWeight.w400), 60 | ), 61 | ), 62 | Container( 63 | padding: EdgeInsets.fromLTRB(4, 8, 4, 8), 64 | child: Row( 65 | children: [ 66 | Icon( 67 | Icons.timer, 68 | color: Colors.black45, 69 | size: 12.0, 70 | ), 71 | SizedBox( 72 | width: 4, 73 | ), 74 | Text( 75 | article.date.toString(), 76 | style: 77 | Theme.of(context).textTheme.caption, 78 | ), 79 | ], 80 | ), 81 | ), 82 | ], 83 | ), 84 | ), 85 | ], 86 | ), 87 | ), 88 | ], 89 | ), 90 | ), 91 | ), 92 | ), 93 | SizedBox( 94 | height: 170, 95 | width: 145, 96 | child: Card( 97 | child: Hero( 98 | tag: heroId, 99 | child: ClipRRect( 100 | borderRadius: new BorderRadius.circular(8.0), 101 | child: Image.network( 102 | article.image.toString(), 103 | fit: BoxFit.cover, 104 | ), 105 | ), 106 | ), 107 | shape: RoundedRectangleBorder( 108 | borderRadius: BorderRadius.circular(10.0), 109 | ), 110 | elevation: 0, 111 | margin: EdgeInsets.all(10), 112 | ), 113 | ), 114 | article.video != "" 115 | ? Positioned( 116 | left: 12, 117 | top: 12, 118 | child: Card( 119 | child: CircleAvatar( 120 | radius: 14, 121 | backgroundColor: Colors.transparent, 122 | child: Image.asset("assets/play-button.png"), 123 | ), 124 | elevation: 8, 125 | shape: CircleBorder(), 126 | clipBehavior: Clip.antiAlias, 127 | ), 128 | ) 129 | : Container(), 130 | ], 131 | ), 132 | ); 133 | } 134 | -------------------------------------------------------------------------------- /lib/widgets/articleBoxFeatured.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_html/flutter_html.dart'; 3 | import 'package:flutter_wordpress_app/models/Article.dart'; 4 | 5 | Widget articleBoxFeatured( 6 | BuildContext context, Article article, String heroId) { 7 | return ConstrainedBox( 8 | constraints: new BoxConstraints( 9 | minHeight: 280.0, maxHeight: 290.0, minWidth: 360.0, maxWidth: 360.0), 10 | child: Stack( 11 | children: [ 12 | Padding( 13 | padding: EdgeInsets.all(8), 14 | child: Container( 15 | height: 200, 16 | width: 400, 17 | child: Card( 18 | child: Hero( 19 | tag: heroId, 20 | child: ClipRRect( 21 | borderRadius: new BorderRadius.circular(8.0), 22 | child: Image.network( 23 | article.image.toString(), 24 | fit: BoxFit.cover, 25 | ), 26 | ), 27 | ), 28 | shape: RoundedRectangleBorder( 29 | borderRadius: BorderRadius.circular(10.0), 30 | ), 31 | elevation: 1, 32 | margin: EdgeInsets.all(10), 33 | ), 34 | ), 35 | ), 36 | Positioned( 37 | left: 20, 38 | top: 80, 39 | right: 20, 40 | child: Container( 41 | alignment: Alignment.bottomRight, 42 | height: 200, 43 | child: Padding( 44 | padding: EdgeInsets.fromLTRB(8, 8, 8, 8), 45 | child: Card( 46 | child: Container( 47 | padding: EdgeInsets.fromLTRB(8, 16, 8, 16), 48 | child: Column( 49 | mainAxisSize: MainAxisSize.min, 50 | children: [ 51 | Container( 52 | child: Html( 53 | data: article.title!.length > 70 54 | ? "

" + 55 | article.title.toString().substring(0, 70) + 56 | "...

" 57 | : "

" + article.title.toString() + "

", 58 | style: { 59 | "h2": Style( 60 | color: Theme.of(context).primaryColorDark, 61 | fontWeight: FontWeight.w500, 62 | fontSize: FontSize.em(1.05), 63 | padding: EdgeInsets.all(2), 64 | ), 65 | }), 66 | ), 67 | Container( 68 | alignment: Alignment.topLeft, 69 | child: Column( 70 | crossAxisAlignment: CrossAxisAlignment.start, 71 | mainAxisAlignment: MainAxisAlignment.center, 72 | children: [ 73 | Container( 74 | decoration: BoxDecoration( 75 | color: Color(0xFFE3E3E3), 76 | borderRadius: BorderRadius.circular(3)), 77 | padding: EdgeInsets.fromLTRB(8, 4, 8, 4), 78 | margin: EdgeInsets.fromLTRB(0, 0, 0, 8), 79 | child: Text( 80 | article.category.toString(), 81 | style: TextStyle( 82 | color: Colors.black, 83 | fontSize: 11, 84 | fontWeight: FontWeight.w400), 85 | ), 86 | ), 87 | Container( 88 | padding: EdgeInsets.fromLTRB(4, 8, 4, 8), 89 | child: Row( 90 | children: [ 91 | Icon( 92 | Icons.timer, 93 | color: Colors.black45, 94 | size: 12.0, 95 | ), 96 | SizedBox( 97 | width: 4, 98 | ), 99 | Text( 100 | article.date.toString(), 101 | style: Theme.of(context).textTheme.caption, 102 | ), 103 | ], 104 | ), 105 | ), 106 | ], 107 | ), 108 | ), 109 | ], 110 | ), 111 | ), 112 | ), 113 | ), 114 | ), 115 | ), 116 | article.video != "" 117 | ? Positioned( 118 | left: 18, 119 | top: 18, 120 | child: Card( 121 | child: CircleAvatar( 122 | radius: 14, 123 | backgroundColor: Colors.transparent, 124 | child: Image.asset("assets/play-button.png"), 125 | ), 126 | elevation: 18.0, 127 | shape: CircleBorder(), 128 | clipBehavior: Clip.antiAlias, 129 | ), 130 | ) 131 | : Container() 132 | ], 133 | ), 134 | ); 135 | } 136 | -------------------------------------------------------------------------------- /lib/widgets/commentBox.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_html/flutter_html.dart'; 3 | 4 | Widget commentBox( 5 | BuildContext context, String author, String avatar, String content) { 6 | return Card( 7 | margin: EdgeInsets.fromLTRB(16, 8, 16, 8), 8 | child: ListTile( 9 | dense: true, 10 | leading: CircleAvatar( 11 | backgroundImage: NetworkImage(avatar), 12 | ), 13 | title: Html(data: content, style: { 14 | "p": Style( 15 | color: Theme.of(context).primaryColorDark, 16 | fontWeight: FontWeight.w400, 17 | fontSize: FontSize.em(1), 18 | padding: EdgeInsets.all(4)), 19 | }), 20 | subtitle: Container( 21 | margin: EdgeInsets.fromLTRB(0, 8, 0, 8), 22 | padding: EdgeInsets.fromLTRB(4, 8, 0, 8), 23 | decoration: BoxDecoration( 24 | border: Border( 25 | top: BorderSide(width: 1, color: Colors.black12), 26 | ), 27 | ), 28 | child: Text( 29 | author, 30 | style: TextStyle(fontSize: 12), 31 | ), 32 | ), 33 | ), 34 | ); 35 | } 36 | -------------------------------------------------------------------------------- /lib/widgets/searchBoxes.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_wordpress_app/common/constants.dart'; 3 | import 'package:flutter_wordpress_app/pages/category_articles.dart'; 4 | 5 | Widget searchBoxes(BuildContext context) { 6 | return GridView.count( 7 | padding: EdgeInsets.all(16), 8 | shrinkWrap: true, 9 | physics: ScrollPhysics(), 10 | crossAxisCount: 3, 11 | children: List.generate(CUSTOM_CATEGORIES.length, (index) { 12 | var cat = CUSTOM_CATEGORIES[index]; 13 | var name = cat[0]; 14 | var image = cat[1]; 15 | var catId = cat[2]; 16 | 17 | return Card( 18 | child: InkWell( 19 | onTap: () { 20 | Navigator.push( 21 | context, 22 | MaterialPageRoute( 23 | builder: (context) => CategoryArticles(catId, name), 24 | ), 25 | ); 26 | }, 27 | child: Container( 28 | padding: EdgeInsets.fromLTRB(8, 16, 8, 8), 29 | child: Column( 30 | children: [ 31 | SizedBox(width: 100, height: 45, child: Image.asset(image)), 32 | Spacer(), 33 | Text( 34 | name, 35 | textAlign: TextAlign.center, 36 | style: TextStyle( 37 | fontSize: 15, 38 | height: 1.2, 39 | fontWeight: FontWeight.w500, 40 | ), 41 | ) 42 | ], 43 | ), 44 | ), 45 | ), 46 | ); 47 | }), 48 | ); 49 | } 50 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "3.1.2" 11 | args: 12 | dependency: transitive 13 | description: 14 | name: args 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.3.0" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.8.1" 25 | audio_session: 26 | dependency: transitive 27 | description: 28 | name: audio_session 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "0.1.6+1" 32 | boolean_selector: 33 | dependency: transitive 34 | description: 35 | name: boolean_selector 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "2.1.0" 39 | cached_network_image: 40 | dependency: transitive 41 | description: 42 | name: cached_network_image 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "3.1.0" 46 | cached_network_image_platform_interface: 47 | dependency: transitive 48 | description: 49 | name: cached_network_image_platform_interface 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.0.0" 53 | cached_network_image_web: 54 | dependency: transitive 55 | description: 56 | name: cached_network_image_web 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.0.1" 60 | characters: 61 | dependency: transitive 62 | description: 63 | name: characters 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.1.0" 67 | charcode: 68 | dependency: transitive 69 | description: 70 | name: charcode 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "1.3.1" 74 | chewie: 75 | dependency: transitive 76 | description: 77 | name: chewie 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.1.0" 81 | chewie_audio: 82 | dependency: transitive 83 | description: 84 | name: chewie_audio 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "1.2.0" 88 | clock: 89 | dependency: transitive 90 | description: 91 | name: clock 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "1.1.0" 95 | collection: 96 | dependency: transitive 97 | description: 98 | name: collection 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "1.15.0" 102 | crypto: 103 | dependency: transitive 104 | description: 105 | name: crypto 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "3.0.1" 109 | csslib: 110 | dependency: transitive 111 | description: 112 | name: csslib 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "0.17.0" 116 | cupertino_icons: 117 | dependency: "direct main" 118 | description: 119 | name: cupertino_icons 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "1.0.3" 123 | dio: 124 | dependency: "direct main" 125 | description: 126 | name: dio 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "4.0.0" 130 | fake_async: 131 | dependency: transitive 132 | description: 133 | name: fake_async 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "1.2.0" 137 | ffi: 138 | dependency: transitive 139 | description: 140 | name: ffi 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "1.1.2" 144 | file: 145 | dependency: transitive 146 | description: 147 | name: file 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "6.1.2" 151 | flutter: 152 | dependency: "direct main" 153 | description: flutter 154 | source: sdk 155 | version: "0.0.0" 156 | flutter_blurhash: 157 | dependency: transitive 158 | description: 159 | name: flutter_blurhash 160 | url: "https://pub.dartlang.org" 161 | source: hosted 162 | version: "0.6.0" 163 | flutter_cache_manager: 164 | dependency: transitive 165 | description: 166 | name: flutter_cache_manager 167 | url: "https://pub.dartlang.org" 168 | source: hosted 169 | version: "3.1.2" 170 | flutter_html: 171 | dependency: "direct main" 172 | description: 173 | name: flutter_html 174 | url: "https://pub.dartlang.org" 175 | source: hosted 176 | version: "2.1.2" 177 | flutter_launcher_icons: 178 | dependency: "direct dev" 179 | description: 180 | name: flutter_launcher_icons 181 | url: "https://pub.dartlang.org" 182 | source: hosted 183 | version: "0.9.2" 184 | flutter_layout_grid: 185 | dependency: transitive 186 | description: 187 | name: flutter_layout_grid 188 | url: "https://pub.dartlang.org" 189 | source: hosted 190 | version: "1.0.3" 191 | flutter_math_fork: 192 | dependency: transitive 193 | description: 194 | name: flutter_math_fork 195 | url: "https://pub.dartlang.org" 196 | source: hosted 197 | version: "0.4.1" 198 | flutter_svg: 199 | dependency: transitive 200 | description: 201 | name: flutter_svg 202 | url: "https://pub.dartlang.org" 203 | source: hosted 204 | version: "0.22.0" 205 | flutter_test: 206 | dependency: "direct dev" 207 | description: flutter 208 | source: sdk 209 | version: "0.0.0" 210 | flutter_web_plugins: 211 | dependency: transitive 212 | description: flutter 213 | source: sdk 214 | version: "0.0.0" 215 | flutter_widget_from_html: 216 | dependency: "direct main" 217 | description: 218 | name: flutter_widget_from_html 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "0.7.0" 222 | flutter_widget_from_html_core: 223 | dependency: transitive 224 | description: 225 | name: flutter_widget_from_html_core 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "0.7.0" 229 | fwfh_cached_network_image: 230 | dependency: transitive 231 | description: 232 | name: fwfh_cached_network_image 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "0.7.0" 236 | fwfh_chewie: 237 | dependency: transitive 238 | description: 239 | name: fwfh_chewie 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "0.7.0" 243 | fwfh_just_audio: 244 | dependency: transitive 245 | description: 246 | name: fwfh_just_audio 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "0.6.2+1" 250 | fwfh_svg: 251 | dependency: transitive 252 | description: 253 | name: fwfh_svg 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "0.7.0" 257 | fwfh_url_launcher: 258 | dependency: transitive 259 | description: 260 | name: fwfh_url_launcher 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "0.6.1+2" 264 | fwfh_webview: 265 | dependency: transitive 266 | description: 267 | name: fwfh_webview 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "0.6.1+2" 271 | html: 272 | dependency: "direct main" 273 | description: 274 | name: html 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "0.15.0" 278 | http: 279 | dependency: "direct main" 280 | description: 281 | name: http 282 | url: "https://pub.dartlang.org" 283 | source: hosted 284 | version: "0.13.3" 285 | http_parser: 286 | dependency: transitive 287 | description: 288 | name: http_parser 289 | url: "https://pub.dartlang.org" 290 | source: hosted 291 | version: "4.0.0" 292 | image: 293 | dependency: transitive 294 | description: 295 | name: image 296 | url: "https://pub.dartlang.org" 297 | source: hosted 298 | version: "3.0.4" 299 | intl: 300 | dependency: "direct main" 301 | description: 302 | name: intl 303 | url: "https://pub.dartlang.org" 304 | source: hosted 305 | version: "0.17.0" 306 | js: 307 | dependency: transitive 308 | description: 309 | name: js 310 | url: "https://pub.dartlang.org" 311 | source: hosted 312 | version: "0.6.3" 313 | just_audio: 314 | dependency: transitive 315 | description: 316 | name: just_audio 317 | url: "https://pub.dartlang.org" 318 | source: hosted 319 | version: "0.9.11" 320 | just_audio_platform_interface: 321 | dependency: transitive 322 | description: 323 | name: just_audio_platform_interface 324 | url: "https://pub.dartlang.org" 325 | source: hosted 326 | version: "4.0.0" 327 | just_audio_web: 328 | dependency: transitive 329 | description: 330 | name: just_audio_web 331 | url: "https://pub.dartlang.org" 332 | source: hosted 333 | version: "0.4.2" 334 | loading: 335 | dependency: "direct main" 336 | description: 337 | name: loading 338 | url: "https://pub.dartlang.org" 339 | source: hosted 340 | version: "1.0.2" 341 | matcher: 342 | dependency: transitive 343 | description: 344 | name: matcher 345 | url: "https://pub.dartlang.org" 346 | source: hosted 347 | version: "0.12.10" 348 | meta: 349 | dependency: transitive 350 | description: 351 | name: meta 352 | url: "https://pub.dartlang.org" 353 | source: hosted 354 | version: "1.7.0" 355 | mime: 356 | dependency: transitive 357 | description: 358 | name: mime 359 | url: "https://pub.dartlang.org" 360 | source: hosted 361 | version: "1.0.0" 362 | nested: 363 | dependency: transitive 364 | description: 365 | name: nested 366 | url: "https://pub.dartlang.org" 367 | source: hosted 368 | version: "1.0.0" 369 | numerus: 370 | dependency: transitive 371 | description: 372 | name: numerus 373 | url: "https://pub.dartlang.org" 374 | source: hosted 375 | version: "1.1.1" 376 | octo_image: 377 | dependency: transitive 378 | description: 379 | name: octo_image 380 | url: "https://pub.dartlang.org" 381 | source: hosted 382 | version: "1.0.0+1" 383 | path: 384 | dependency: transitive 385 | description: 386 | name: path 387 | url: "https://pub.dartlang.org" 388 | source: hosted 389 | version: "1.8.0" 390 | path_drawing: 391 | dependency: transitive 392 | description: 393 | name: path_drawing 394 | url: "https://pub.dartlang.org" 395 | source: hosted 396 | version: "0.5.1" 397 | path_parsing: 398 | dependency: transitive 399 | description: 400 | name: path_parsing 401 | url: "https://pub.dartlang.org" 402 | source: hosted 403 | version: "0.2.1" 404 | path_provider: 405 | dependency: "direct main" 406 | description: 407 | name: path_provider 408 | url: "https://pub.dartlang.org" 409 | source: hosted 410 | version: "2.0.5" 411 | path_provider_linux: 412 | dependency: transitive 413 | description: 414 | name: path_provider_linux 415 | url: "https://pub.dartlang.org" 416 | source: hosted 417 | version: "2.1.0" 418 | path_provider_macos: 419 | dependency: transitive 420 | description: 421 | name: path_provider_macos 422 | url: "https://pub.dartlang.org" 423 | source: hosted 424 | version: "2.0.2" 425 | path_provider_platform_interface: 426 | dependency: transitive 427 | description: 428 | name: path_provider_platform_interface 429 | url: "https://pub.dartlang.org" 430 | source: hosted 431 | version: "2.0.1" 432 | path_provider_windows: 433 | dependency: transitive 434 | description: 435 | name: path_provider_windows 436 | url: "https://pub.dartlang.org" 437 | source: hosted 438 | version: "2.0.3" 439 | pedantic: 440 | dependency: transitive 441 | description: 442 | name: pedantic 443 | url: "https://pub.dartlang.org" 444 | source: hosted 445 | version: "1.11.1" 446 | petitparser: 447 | dependency: transitive 448 | description: 449 | name: petitparser 450 | url: "https://pub.dartlang.org" 451 | source: hosted 452 | version: "4.3.0" 453 | platform: 454 | dependency: transitive 455 | description: 456 | name: platform 457 | url: "https://pub.dartlang.org" 458 | source: hosted 459 | version: "3.0.2" 460 | plugin_platform_interface: 461 | dependency: transitive 462 | description: 463 | name: plugin_platform_interface 464 | url: "https://pub.dartlang.org" 465 | source: hosted 466 | version: "2.0.1" 467 | process: 468 | dependency: transitive 469 | description: 470 | name: process 471 | url: "https://pub.dartlang.org" 472 | source: hosted 473 | version: "4.2.3" 474 | provider: 475 | dependency: transitive 476 | description: 477 | name: provider 478 | url: "https://pub.dartlang.org" 479 | source: hosted 480 | version: "6.0.0" 481 | quiver: 482 | dependency: transitive 483 | description: 484 | name: quiver 485 | url: "https://pub.dartlang.org" 486 | source: hosted 487 | version: "3.0.1" 488 | rxdart: 489 | dependency: transitive 490 | description: 491 | name: rxdart 492 | url: "https://pub.dartlang.org" 493 | source: hosted 494 | version: "0.27.2" 495 | share: 496 | dependency: "direct main" 497 | description: 498 | name: share 499 | url: "https://pub.dartlang.org" 500 | source: hosted 501 | version: "2.0.4" 502 | shared_preferences: 503 | dependency: "direct main" 504 | description: 505 | name: shared_preferences 506 | url: "https://pub.dartlang.org" 507 | source: hosted 508 | version: "2.0.8" 509 | shared_preferences_linux: 510 | dependency: transitive 511 | description: 512 | name: shared_preferences_linux 513 | url: "https://pub.dartlang.org" 514 | source: hosted 515 | version: "2.0.2" 516 | shared_preferences_macos: 517 | dependency: transitive 518 | description: 519 | name: shared_preferences_macos 520 | url: "https://pub.dartlang.org" 521 | source: hosted 522 | version: "2.0.2" 523 | shared_preferences_platform_interface: 524 | dependency: transitive 525 | description: 526 | name: shared_preferences_platform_interface 527 | url: "https://pub.dartlang.org" 528 | source: hosted 529 | version: "2.0.0" 530 | shared_preferences_web: 531 | dependency: transitive 532 | description: 533 | name: shared_preferences_web 534 | url: "https://pub.dartlang.org" 535 | source: hosted 536 | version: "2.0.2" 537 | shared_preferences_windows: 538 | dependency: transitive 539 | description: 540 | name: shared_preferences_windows 541 | url: "https://pub.dartlang.org" 542 | source: hosted 543 | version: "2.0.2" 544 | sky_engine: 545 | dependency: transitive 546 | description: flutter 547 | source: sdk 548 | version: "0.0.99" 549 | source_span: 550 | dependency: transitive 551 | description: 552 | name: source_span 553 | url: "https://pub.dartlang.org" 554 | source: hosted 555 | version: "1.8.1" 556 | sqflite: 557 | dependency: "direct main" 558 | description: 559 | name: sqflite 560 | url: "https://pub.dartlang.org" 561 | source: hosted 562 | version: "2.0.0+4" 563 | sqflite_common: 564 | dependency: transitive 565 | description: 566 | name: sqflite_common 567 | url: "https://pub.dartlang.org" 568 | source: hosted 569 | version: "2.0.1+1" 570 | stack_trace: 571 | dependency: transitive 572 | description: 573 | name: stack_trace 574 | url: "https://pub.dartlang.org" 575 | source: hosted 576 | version: "1.10.0" 577 | stream_channel: 578 | dependency: transitive 579 | description: 580 | name: stream_channel 581 | url: "https://pub.dartlang.org" 582 | source: hosted 583 | version: "2.1.0" 584 | string_scanner: 585 | dependency: transitive 586 | description: 587 | name: string_scanner 588 | url: "https://pub.dartlang.org" 589 | source: hosted 590 | version: "1.1.0" 591 | synchronized: 592 | dependency: transitive 593 | description: 594 | name: synchronized 595 | url: "https://pub.dartlang.org" 596 | source: hosted 597 | version: "3.0.0" 598 | term_glyph: 599 | dependency: transitive 600 | description: 601 | name: term_glyph 602 | url: "https://pub.dartlang.org" 603 | source: hosted 604 | version: "1.2.0" 605 | test_api: 606 | dependency: transitive 607 | description: 608 | name: test_api 609 | url: "https://pub.dartlang.org" 610 | source: hosted 611 | version: "0.4.2" 612 | tuple: 613 | dependency: transitive 614 | description: 615 | name: tuple 616 | url: "https://pub.dartlang.org" 617 | source: hosted 618 | version: "2.0.0" 619 | typed_data: 620 | dependency: transitive 621 | description: 622 | name: typed_data 623 | url: "https://pub.dartlang.org" 624 | source: hosted 625 | version: "1.3.0" 626 | url_launcher: 627 | dependency: "direct main" 628 | description: 629 | name: url_launcher 630 | url: "https://pub.dartlang.org" 631 | source: hosted 632 | version: "6.0.11" 633 | url_launcher_linux: 634 | dependency: transitive 635 | description: 636 | name: url_launcher_linux 637 | url: "https://pub.dartlang.org" 638 | source: hosted 639 | version: "2.0.2" 640 | url_launcher_macos: 641 | dependency: transitive 642 | description: 643 | name: url_launcher_macos 644 | url: "https://pub.dartlang.org" 645 | source: hosted 646 | version: "2.0.2" 647 | url_launcher_platform_interface: 648 | dependency: transitive 649 | description: 650 | name: url_launcher_platform_interface 651 | url: "https://pub.dartlang.org" 652 | source: hosted 653 | version: "2.0.4" 654 | url_launcher_web: 655 | dependency: transitive 656 | description: 657 | name: url_launcher_web 658 | url: "https://pub.dartlang.org" 659 | source: hosted 660 | version: "2.0.4" 661 | url_launcher_windows: 662 | dependency: transitive 663 | description: 664 | name: url_launcher_windows 665 | url: "https://pub.dartlang.org" 666 | source: hosted 667 | version: "2.0.2" 668 | uuid: 669 | dependency: transitive 670 | description: 671 | name: uuid 672 | url: "https://pub.dartlang.org" 673 | source: hosted 674 | version: "3.0.4" 675 | vector_math: 676 | dependency: transitive 677 | description: 678 | name: vector_math 679 | url: "https://pub.dartlang.org" 680 | source: hosted 681 | version: "2.1.0" 682 | video_player: 683 | dependency: transitive 684 | description: 685 | name: video_player 686 | url: "https://pub.dartlang.org" 687 | source: hosted 688 | version: "2.2.4" 689 | video_player_platform_interface: 690 | dependency: transitive 691 | description: 692 | name: video_player_platform_interface 693 | url: "https://pub.dartlang.org" 694 | source: hosted 695 | version: "4.2.0" 696 | video_player_web: 697 | dependency: transitive 698 | description: 699 | name: video_player_web 700 | url: "https://pub.dartlang.org" 701 | source: hosted 702 | version: "2.0.4" 703 | wakelock: 704 | dependency: transitive 705 | description: 706 | name: wakelock 707 | url: "https://pub.dartlang.org" 708 | source: hosted 709 | version: "0.5.6" 710 | wakelock_macos: 711 | dependency: transitive 712 | description: 713 | name: wakelock_macos 714 | url: "https://pub.dartlang.org" 715 | source: hosted 716 | version: "0.4.0" 717 | wakelock_platform_interface: 718 | dependency: transitive 719 | description: 720 | name: wakelock_platform_interface 721 | url: "https://pub.dartlang.org" 722 | source: hosted 723 | version: "0.3.0" 724 | wakelock_web: 725 | dependency: transitive 726 | description: 727 | name: wakelock_web 728 | url: "https://pub.dartlang.org" 729 | source: hosted 730 | version: "0.4.0" 731 | wakelock_windows: 732 | dependency: transitive 733 | description: 734 | name: wakelock_windows 735 | url: "https://pub.dartlang.org" 736 | source: hosted 737 | version: "0.2.0" 738 | webview_flutter: 739 | dependency: transitive 740 | description: 741 | name: webview_flutter 742 | url: "https://pub.dartlang.org" 743 | source: hosted 744 | version: "2.0.14" 745 | win32: 746 | dependency: transitive 747 | description: 748 | name: win32 749 | url: "https://pub.dartlang.org" 750 | source: hosted 751 | version: "2.2.9" 752 | xdg_directories: 753 | dependency: transitive 754 | description: 755 | name: xdg_directories 756 | url: "https://pub.dartlang.org" 757 | source: hosted 758 | version: "0.2.0" 759 | xml: 760 | dependency: transitive 761 | description: 762 | name: xml 763 | url: "https://pub.dartlang.org" 764 | source: hosted 765 | version: "5.3.0" 766 | yaml: 767 | dependency: transitive 768 | description: 769 | name: yaml 770 | url: "https://pub.dartlang.org" 771 | source: hosted 772 | version: "3.1.0" 773 | sdks: 774 | dart: ">=2.14.0 <3.0.0" 775 | flutter: ">=2.5.0" 776 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_wordpress_app 2 | description: Flutter news app for wordpress platform 3 | 4 | version: 2.0.0+5 5 | 6 | environment: 7 | sdk: ">=2.12.0 <3.0.0" 8 | 9 | dependencies: 10 | flutter: 11 | sdk: flutter 12 | 13 | cupertino_icons: ^1.0.0 14 | url_launcher: ^6.0.11 15 | http: ^0.13.3 16 | html: ^0.15.0 17 | flutter_html: ^2.1.2 18 | dio: ^4.0.0 19 | loading: ^1.0.2 20 | intl: ^0.17.0 21 | share: ^2.0.4 22 | path_provider: ^2.0.5 23 | sqflite: ^2.0.0+4 24 | shared_preferences: ^2.0.8 25 | flutter_widget_from_html: ^0.7.0 26 | 27 | dev_dependencies: 28 | flutter_test: 29 | sdk: flutter 30 | 31 | flutter_launcher_icons: ^0.9.2 32 | 33 | flutter_icons: 34 | android: "launcher_icon" 35 | ios: true 36 | image_path: assets/launcher_icon.png 37 | 38 | flutter: 39 | # The following line ensures that the Material Icons font is 40 | # included with your application, so that you can use the icons in 41 | # the material Icons class. 42 | 43 | uses-material-design: true 44 | 45 | assets: 46 | - assets/icon.png 47 | - assets/no-internet.png 48 | - assets/play-button.png 49 | - assets/boxed/fashion.png 50 | - assets/boxed/health.png 51 | - assets/boxed/lifestyle.png 52 | - assets/boxed/music.png 53 | - assets/boxed/photography.png 54 | - assets/boxed/recipies.png 55 | - assets/boxed/sport.png 56 | - assets/boxed/travel.png 57 | - assets/boxed/world.png 58 | - assets/more/favourite.png 59 | - assets/more/contact.png 60 | - assets/more/share.png 61 | - assets/more/notification.png 62 | 63 | fonts: 64 | - family: Poppins 65 | fonts: 66 | - asset: fonts/Poppins/Poppins-Bold.ttf 67 | 68 | - family: Soleil 69 | fonts: 70 | - asset: fonts/Soleil/Soleil-Bold.otf 71 | - asset: fonts/Soleil/Soleil-Regular.otf 72 | -------------------------------------------------------------------------------- /resources/Screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_1.png -------------------------------------------------------------------------------- /resources/Screenshot_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_10.png -------------------------------------------------------------------------------- /resources/Screenshot_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_11.png -------------------------------------------------------------------------------- /resources/Screenshot_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_12.png -------------------------------------------------------------------------------- /resources/Screenshot_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_2.png -------------------------------------------------------------------------------- /resources/Screenshot_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_3.png -------------------------------------------------------------------------------- /resources/Screenshot_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_4.png -------------------------------------------------------------------------------- /resources/Screenshot_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_5.png -------------------------------------------------------------------------------- /resources/Screenshot_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_6.png -------------------------------------------------------------------------------- /resources/Screenshot_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_7.png -------------------------------------------------------------------------------- /resources/Screenshot_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_8.png -------------------------------------------------------------------------------- /resources/Screenshot_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/Screenshot_9.png -------------------------------------------------------------------------------- /resources/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/banner.png -------------------------------------------------------------------------------- /resources/button_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/button_download.png -------------------------------------------------------------------------------- /resources/button_purchase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/button_purchase.png -------------------------------------------------------------------------------- /resources/fwp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/fwp.png -------------------------------------------------------------------------------- /resources/google-play-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/google-play-badge.png -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/icon.png -------------------------------------------------------------------------------- /resources/wp_pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/resources/wp_pro.png -------------------------------------------------------------------------------- /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:flutter_wordpress_app/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 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kurmogs/wordPress-flutter/86350e91c677ca8991e9c35f587d7a06e521d06b/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | flutter_wordpress_app 30 | 31 | 32 | 33 | 36 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flutter_wordpress_app", 3 | "short_name": "flutter_wordpress_app", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | --------------------------------------------------------------------------------