Browse Source

copy examen lime-frontend flutter

master
Filipp Grigoruk 2 years ago
parent
commit
c9e866f282
89 changed files with 3030 additions and 0 deletions
  1. 10
    0
      front-end_flutter_blog/.metadata
  2. 1
    0
      front-end_flutter_blog/README.md
  3. 29
    0
      front-end_flutter_blog/analysis_options.yaml
  4. 68
    0
      front-end_flutter_blog/android/app/build.gradle
  5. 7
    0
      front-end_flutter_blog/android/app/src/debug/AndroidManifest.xml
  6. 47
    0
      front-end_flutter_blog/android/app/src/main/AndroidManifest.xml
  7. 6
    0
      front-end_flutter_blog/android/app/src/main/kotlin/com/example/flutter_forum/MainActivity.kt
  8. 12
    0
      front-end_flutter_blog/android/app/src/main/res/drawable-v21/launch_background.xml
  9. 12
    0
      front-end_flutter_blog/android/app/src/main/res/drawable/launch_background.xml
  10. BIN
      front-end_flutter_blog/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  11. BIN
      front-end_flutter_blog/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  12. BIN
      front-end_flutter_blog/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  13. BIN
      front-end_flutter_blog/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  14. BIN
      front-end_flutter_blog/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  15. 18
    0
      front-end_flutter_blog/android/app/src/main/res/values-night/styles.xml
  16. 18
    0
      front-end_flutter_blog/android/app/src/main/res/values/styles.xml
  17. 7
    0
      front-end_flutter_blog/android/app/src/profile/AndroidManifest.xml
  18. 29
    0
      front-end_flutter_blog/android/build.gradle
  19. 3
    0
      front-end_flutter_blog/android/gradle.properties
  20. 6
    0
      front-end_flutter_blog/android/gradle/wrapper/gradle-wrapper.properties
  21. 11
    0
      front-end_flutter_blog/android/settings.gradle
  22. BIN
      front-end_flutter_blog/assets/fonts/IndieFlower-Regular.ttf
  23. BIN
      front-end_flutter_blog/assets/fonts/Roboto-Regular.ttf
  24. 26
    0
      front-end_flutter_blog/ios/Flutter/AppFrameworkInfo.plist
  25. 2
    0
      front-end_flutter_blog/ios/Flutter/Debug.xcconfig
  26. 2
    0
      front-end_flutter_blog/ios/Flutter/Release.xcconfig
  27. 41
    0
      front-end_flutter_blog/ios/Podfile
  28. 45
    0
      front-end_flutter_blog/ios/Podfile.lock
  29. 566
    0
      front-end_flutter_blog/ios/Runner.xcodeproj/project.pbxproj
  30. 7
    0
      front-end_flutter_blog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  31. 8
    0
      front-end_flutter_blog/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  32. 8
    0
      front-end_flutter_blog/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  33. 91
    0
      front-end_flutter_blog/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  34. 10
    0
      front-end_flutter_blog/ios/Runner.xcworkspace/contents.xcworkspacedata
  35. 8
    0
      front-end_flutter_blog/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  36. 8
    0
      front-end_flutter_blog/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  37. 13
    0
      front-end_flutter_blog/ios/Runner/AppDelegate.swift
  38. 122
    0
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  39. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
  40. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
  41. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
  42. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
  43. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
  44. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
  45. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
  46. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
  47. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
  48. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
  49. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
  50. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
  51. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
  52. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
  53. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
  54. 23
    0
      front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  55. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
  56. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
  57. BIN
      front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
  58. 5
    0
      front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  59. 37
    0
      front-end_flutter_blog/ios/Runner/Base.lproj/LaunchScreen.storyboard
  60. 26
    0
      front-end_flutter_blog/ios/Runner/Base.lproj/Main.storyboard
  61. 45
    0
      front-end_flutter_blog/ios/Runner/Info.plist
  62. 1
    0
      front-end_flutter_blog/ios/Runner/Runner-Bridging-Header.h
  63. 57
    0
      front-end_flutter_blog/lib/Components/AddNewPlaceComponents/credentials_input_component.dart
  64. 62
    0
      front-end_flutter_blog/lib/Components/AddNewPlaceComponents/image_input_component.dart
  65. 62
    0
      front-end_flutter_blog/lib/Components/AddNewPlaceComponents/location_input_component.dart
  66. 48
    0
      front-end_flutter_blog/lib/Components/comments_component.dart
  67. 120
    0
      front-end_flutter_blog/lib/Components/place_component.dart
  68. 69
    0
      front-end_flutter_blog/lib/DataBase/dummy_data.dart
  69. 15
    0
      front-end_flutter_blog/lib/Models/add_place_to_db_model.dart
  70. 13
    0
      front-end_flutter_blog/lib/Models/comment_model.dart
  71. 9
    0
      front-end_flutter_blog/lib/Models/location_model.dart
  72. 18
    0
      front-end_flutter_blog/lib/Models/place_model.dart
  73. 15
    0
      front-end_flutter_blog/lib/Models/user_model.dart
  74. 27
    0
      front-end_flutter_blog/lib/Providers/auth_provider.dart
  75. 28
    0
      front-end_flutter_blog/lib/Providers/comments_provider.dart
  76. 18
    0
      front-end_flutter_blog/lib/Providers/google_maps_provider.dart
  77. 37
    0
      front-end_flutter_blog/lib/Providers/places_provider.dart
  78. 102
    0
      front-end_flutter_blog/lib/Services/data_base_service.dart
  79. 53
    0
      front-end_flutter_blog/lib/Views/auth/landing_page.dart
  80. 87
    0
      front-end_flutter_blog/lib/Views/auth/login_component.dart
  81. 131
    0
      front-end_flutter_blog/lib/Views/auth/registration_component.dart
  82. 10
    0
      front-end_flutter_blog/lib/Views/forum/add_comment_view.dart
  83. 88
    0
      front-end_flutter_blog/lib/Views/forum/add_new_place_view.dart
  84. 23
    0
      front-end_flutter_blog/lib/Views/forum/home_view.dart
  85. 95
    0
      front-end_flutter_blog/lib/Views/forum/place_details_view.dart
  86. 41
    0
      front-end_flutter_blog/lib/Views/forum/show_all_places_view.dart
  87. 38
    0
      front-end_flutter_blog/lib/main.dart
  88. 292
    0
      front-end_flutter_blog/pubspec.lock
  89. 94
    0
      front-end_flutter_blog/pubspec.yaml

+ 10
- 0
front-end_flutter_blog/.metadata View File

@@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
revision: 18116933e77adc82f80866c928266a5b4f1ed645
channel: stable

project_type: app

+ 1
- 0
front-end_flutter_blog/README.md View File

@@ -0,0 +1 @@
# Lime_Blog

+ 29
- 0
front-end_flutter_blog/analysis_options.yaml View File

@@ -0,0 +1,29 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.

# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml

linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

+ 68
- 0
front-end_flutter_blog/android/app/build.gradle View File

@@ -0,0 +1,68 @@
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
compileSdkVersion 30

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = '1.8'
}

sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.flutter_forum"
minSdkVersion 20
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}

buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}

flutter {
source '../..'
}

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

+ 7
- 0
front-end_flutter_blog/android/app/src/debug/AndroidManifest.xml View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutter_forum">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

+ 47
- 0
front-end_flutter_blog/android/app/src/main/AndroidManifest.xml View File

@@ -0,0 +1,47 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutter_forum">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:label="flutter_forum"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="YOUR KEY HERE"/>
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<!-- Displays an Android View that continues showing the launch screen
Drawable until Flutter paints its first frame, then this splash
screen fades out. A splash screen is useful to avoid any visual
gap between the end of Android's launch screen and the painting of
Flutter's first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>

+ 6
- 0
front-end_flutter_blog/android/app/src/main/kotlin/com/example/flutter_forum/MainActivity.kt View File

@@ -0,0 +1,6 @@
package com.example.flutter_forum

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
}

+ 12
- 0
front-end_flutter_blog/android/app/src/main/res/drawable-v21/launch_background.xml View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />

<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

+ 12
- 0
front-end_flutter_blog/android/app/src/main/res/drawable/launch_background.xml View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />

<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

BIN
front-end_flutter_blog/android/app/src/main/res/mipmap-hdpi/ic_launcher.png View File


BIN
front-end_flutter_blog/android/app/src/main/res/mipmap-mdpi/ic_launcher.png View File


BIN
front-end_flutter_blog/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png View File


BIN
front-end_flutter_blog/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png View File


BIN
front-end_flutter_blog/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png View File


+ 18
- 0
front-end_flutter_blog/android/app/src/main/res/values-night/styles.xml View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

+ 18
- 0
front-end_flutter_blog/android/app/src/main/res/values/styles.xml View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

+ 7
- 0
front-end_flutter_blog/android/app/src/profile/AndroidManifest.xml View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutter_forum">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

+ 29
- 0
front-end_flutter_blog/android/build.gradle View File

@@ -0,0 +1,29 @@
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
mavenCentral()
}

dependencies {
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

allprojects {
repositories {
google()
mavenCentral()
}
}

rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
delete rootProject.buildDir
}

+ 3
- 0
front-end_flutter_blog/android/gradle.properties View File

@@ -0,0 +1,3 @@
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true

+ 6
- 0
front-end_flutter_blog/android/gradle/wrapper/gradle-wrapper.properties View File

@@ -0,0 +1,6 @@
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip

+ 11
- 0
front-end_flutter_blog/android/settings.gradle View File

@@ -0,0 +1,11 @@
include ':app'

def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()

assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }

def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"

BIN
front-end_flutter_blog/assets/fonts/IndieFlower-Regular.ttf View File


BIN
front-end_flutter_blog/assets/fonts/Roboto-Regular.ttf View File


+ 26
- 0
front-end_flutter_blog/ios/Flutter/AppFrameworkInfo.plist View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>9.0</string>
</dict>
</plist>

+ 2
- 0
front-end_flutter_blog/ios/Flutter/Debug.xcconfig View File

@@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"

+ 2
- 0
front-end_flutter_blog/ios/Flutter/Release.xcconfig View File

@@ -0,0 +1,2 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

+ 41
- 0
front-end_flutter_blog/ios/Podfile View File

@@ -0,0 +1,41 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}

def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end

File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

target 'Runner' do
use_frameworks!
use_modular_headers!

flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end

+ 45
- 0
front-end_flutter_blog/ios/Podfile.lock View File

@@ -0,0 +1,45 @@
PODS:
- Flutter (1.0.0)
- google_maps_flutter (0.0.1):
- Flutter
- GoogleMaps
- GoogleMaps (4.1.0):
- GoogleMaps/Maps (= 4.1.0)
- GoogleMaps/Base (4.1.0)
- GoogleMaps/Maps (4.1.0):
- GoogleMaps/Base
- image_picker (0.0.1):
- Flutter
- location (0.0.1):
- Flutter

DEPENDENCIES:
- Flutter (from `Flutter`)
- google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`)
- image_picker (from `.symlinks/plugins/image_picker/ios`)
- location (from `.symlinks/plugins/location/ios`)

SPEC REPOS:
trunk:
- GoogleMaps

EXTERNAL SOURCES:
Flutter:
:path: Flutter
google_maps_flutter:
:path: ".symlinks/plugins/google_maps_flutter/ios"
image_picker:
:path: ".symlinks/plugins/image_picker/ios"
location:
:path: ".symlinks/plugins/location/ios"

SPEC CHECKSUMS:
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
google_maps_flutter: abdb8dee6c52d4be36ad131ee6ebfacd14417c5a
GoogleMaps: 008e2c80e38605b56b560e8deb73d4194ff30bef
image_picker: 9aa50e1d8cdacdbed739e925b7eea16d014367e6
location: 3a2eed4dd2fab25e7b7baf2a9efefe82b512d740

PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c

COCOAPODS: 1.11.2

+ 566
- 0
front-end_flutter_blog/ios/Runner.xcodeproj/project.pbxproj View File

@@ -0,0 +1,566 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {

/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
78E4996D2C2EDFFDB6DF30B3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9BD5B154E19D98199C86EDA /* Pods_Runner.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
64042EF45477877B14A3ADB9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A9BD5B154E19D98199C86EDA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
CBCB339C8A41E489A845C214 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
E1CA2AA5BD93CB5F5F1B4E03 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
78E4996D2C2EDFFDB6DF30B3 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
27F29740676129E851E438E7 /* Pods */ = {
isa = PBXGroup;
children = (
CBCB339C8A41E489A845C214 /* Pods-Runner.debug.xcconfig */,
64042EF45477877B14A3ADB9 /* Pods-Runner.release.xcconfig */,
E1CA2AA5BD93CB5F5F1B4E03 /* Pods-Runner.profile.xcconfig */,
);
name = Pods;
path = Pods;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
27F29740676129E851E438E7 /* Pods */,
C556EF3BCE45B6A496114AD9 /* Frameworks */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
C556EF3BCE45B6A496114AD9 /* Frameworks */ = {
isa = PBXGroup;
children = (
A9BD5B154E19D98199C86EDA /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
D3176083E4B112FF3B6675D6 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
E4AB048CE8097D5025809FF6 /* [CP] Embed Pods Frameworks */,
E37094BC7DB68F5C994CB92C /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1300;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
);
};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
D3176083E4B112FF3B6675D6 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
E37094BC7DB68F5C994CB92C /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
E4AB048CE8097D5025809FF6 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */

/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterForum;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterForum;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterForum;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}

+ 7
- 0
front-end_flutter_blog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

+ 8
- 0
front-end_flutter_blog/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

+ 8
- 0
front-end_flutter_blog/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

+ 91
- 0
front-end_flutter_blog/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme View File

@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

+ 10
- 0
front-end_flutter_blog/ios/Runner.xcworkspace/contents.xcworkspacedata View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

+ 8
- 0
front-end_flutter_blog/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

+ 8
- 0
front-end_flutter_blog/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

+ 13
- 0
front-end_flutter_blog/ios/Runner/AppDelegate.swift View File

@@ -0,0 +1,13 @@
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}

+ 122
- 0
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json View File

@@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png View File


+ 23
- 0
front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png View File


BIN
front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png View File


+ 5
- 0
front-end_flutter_blog/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md View File

@@ -0,0 +1,5 @@
# Launch Screen Assets

You can customize the launch screen with your own desired assets by replacing the image files in this directory.

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.

+ 37
- 0
front-end_flutter_blog/ios/Runner/Base.lproj/LaunchScreen.storyboard View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>

+ 26
- 0
front-end_flutter_blog/ios/Runner/Base.lproj/Main.storyboard View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

+ 45
- 0
front-end_flutter_blog/ios/Runner/Info.plist View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>flutter_forum</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>

+ 1
- 0
front-end_flutter_blog/ios/Runner/Runner-Bridging-Header.h View File

@@ -0,0 +1 @@
#import "GeneratedPluginRegistrant.h"

+ 57
- 0
front-end_flutter_blog/lib/Components/AddNewPlaceComponents/credentials_input_component.dart View File

@@ -0,0 +1,57 @@
import 'package:flutter/material.dart';

class CredentialsInputComponent extends StatelessWidget {
final Function setTitleCallBack;
final Function setDescriptionCallBack;
CredentialsInputComponent({Key? key,
required this.setTitleCallBack,
required this.setDescriptionCallBack
}) : super(key: key);

@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
decoration: const InputDecoration(
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.deepOrange, width: 1)),
border: OutlineInputBorder(
borderSide: BorderSide(color: Colors.deepOrange, width: 1)),
hintText: 'Title',
hintStyle: TextStyle(
color: Colors.deepOrange,
fontSize: 17,
),
isDense: true,
),
onChanged: (String value) {
setTitleCallBack(value);
},
),
const SizedBox(
height: 10,
),
TextField(
minLines: 5,
maxLines: 5,
decoration: const InputDecoration(
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.deepOrange, width: 1)),
border: OutlineInputBorder(
borderSide: BorderSide(color: Colors.deepOrange, width: 1)),
hintText: 'Description',
hintStyle: TextStyle(
color: Colors.deepOrange,
fontSize: 17,
),
isDense: true,
),
onChanged: (String value) {
setDescriptionCallBack(value);
},
),
],
);
}
}

+ 62
- 0
front-end_flutter_blog/lib/Components/AddNewPlaceComponents/image_input_component.dart View File

@@ -0,0 +1,62 @@
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:async';
import 'dart:io';

class ImageInputComponent extends StatefulWidget {
const ImageInputComponent({Key? key}) : super(key: key);

@override
_ImageInputComponentState createState() => _ImageInputComponentState();
}

class _ImageInputComponentState extends State<ImageInputComponent> {
File? _storedImage;

Future<void> _takePicture() async {
final ImagePicker _picker = ImagePicker();
final XFile? imageFile = await _picker.pickImage(source: ImageSource.camera, maxWidth: 600);

if (imageFile == null) {
return;
}

setState(() {
_storedImage = File(imageFile.path);
});

// final appDir = await syspaths.getApplicationDocumentsDirectory(); // get the directory from devise where we can store the picture.
// final fileName = path.basename(imageFile.path); // get the name of the picture that was automatically created.
// final savedImage = await File(imageFile.path).copy('${appDir.path}/$fileName'); // copy saved file to appDir location with the file name: fileName.
// widget.onSelectImage(savedImage);
}

@override
Widget build(BuildContext context) {
return Column(
children: [
Container(
height: 170,
decoration: BoxDecoration(
border: Border.all(width: 1,color: Colors.deepOrange),
),
child: _storedImage != null ? Image.file(_storedImage!, fit: BoxFit.cover, width: double.infinity,) : const Text('No Image taken.', textAlign: TextAlign.center,),
alignment: Alignment.center,
),
const SizedBox(width: 10,),

ElevatedButton.icon(
onPressed: (){
_takePicture();
},
icon: const Icon(Icons.camera),
label: const Text('Take Picture'),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.deepOrange),
),
),

],
);
}
}

+ 62
- 0
front-end_flutter_blog/lib/Components/AddNewPlaceComponents/location_input_component.dart View File

@@ -0,0 +1,62 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_forum/Providers/google_maps_provider.dart';
import 'package:location/location.dart';
import 'package:flutter_forum/Models/location_model.dart';

class LocationInputComponent extends StatefulWidget {
late Function locationDataCallBack;
LocationInputComponent({Key? key,required this.locationDataCallBack}) : super(key: key);

@override
_LocationInputComponentState createState() => _LocationInputComponentState();
}

class _LocationInputComponentState extends State<LocationInputComponent> {

String? _previewImageUrl;
LocationModel? _locationData;

Future<void> _getCurrentUserLocation() async {
final locData = await Location().getLocation();
final staticMapImageUrl = GoogleMapsProvider.generateLocationPreviewImage(
latitude: locData.latitude!, longitude: locData.longitude!);
setState(() {
_previewImageUrl = staticMapImageUrl;
_locationData = LocationModel(latitude: locData.latitude!.toDouble(), longitude: locData.longitude!.toDouble());
});
}

@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Container(
height: 170,
width: double.infinity,
alignment: Alignment.center,
decoration:
BoxDecoration(border: Border.all(width: 1, color: Colors.deepOrange)),
child: _previewImageUrl == null
? const Text(
'No Location Chosen.',
textAlign: TextAlign.center,
)
: Image.network(
_previewImageUrl!,
fit: BoxFit.cover,
width: double.infinity,
),
),
ElevatedButton.icon(
onPressed: () async {
await _getCurrentUserLocation();
widget.locationDataCallBack(_locationData);
},
icon: const Icon(Icons.location_on),
label: const Text('Current Location'),
),
],
);
}
}

+ 48
- 0
front-end_flutter_blog/lib/Components/comments_component.dart View File

@@ -0,0 +1,48 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Providers/comments_provider.dart';
import 'package:provider/provider.dart';

class CommentsComponent extends StatelessWidget {

final String id;
CommentsComponent({required this.id});

@override
Widget build(BuildContext context) {


return FutureBuilder(
future: Provider.of<CommentsProvider>(context, listen: false).getComments(id),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child:Text(snapshot.error.toString()));
} else {
return Consumer<CommentsProvider>(
child: const Center(child: Text('Got no comments yet, adding some comment !')),
builder: (ctx, CommentsProvider, child) => CommentsProvider.comments.isEmpty ? child! :
ListView.builder(
padding: EdgeInsets.only(top: 15,bottom: 15),
itemCount: CommentsProvider.comments.length,
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemBuilder: (context, index){
return Card(
child: ListTile(
leading: const Icon(Icons.account_circle),
title: Text('user id:'+CommentsProvider.comments[index].id.toString()),
subtitle: Text(CommentsProvider.comments[index].comment.toString()),
dense: true,
),
);
},
),
);
}
},

);
}
}


+ 120
- 0
front-end_flutter_blog/lib/Components/place_component.dart View File

@@ -0,0 +1,120 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Models/place_model.dart';
import 'package:flutter_forum/Views/forum/place_details_view.dart';

class PlaceComponent extends StatefulWidget {
late final String id;
late final String title;
late final String imageUrl;
late final String location;
late final String authorName;
late final String description;

PlaceComponent({
required this.id,
required this.title,
required this.imageUrl,
required this.location,
required this.authorName,
required this.description
});
@override
State<PlaceComponent> createState() => _PlaceComponentState();
}

class _PlaceComponentState extends State<PlaceComponent> {
late bool isFavorite = false;


@override
Widget build(BuildContext context) {
return Card(
clipBehavior: Clip.antiAliasWithSaveLayer,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)
),
elevation: 10,
margin: const EdgeInsets.all(10),
child: Stack(
children: [
Ink.image(
image: NetworkImage(widget.imageUrl),
fit: BoxFit.cover,
height: 300,
child: InkWell(
onTap: (){
Navigator.pushNamed(
context,
PlaceDetailsView.routeName,
arguments: PlaceModel(
id: widget.id,
userName: widget.authorName,
title: widget.title,
description: widget.description,
imageUrl: widget.imageUrl,
locationName: widget.location
));
},
),
),
Positioned(
bottom: 0,
right: 0,
left: 0,
child: Container(
height: 70,
decoration: const BoxDecoration(
color: Colors.black54
),
child: Padding(
padding: const EdgeInsets.all(7),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget> [
Row(
children: [
Expanded(
child: Text('Location : '+widget.location,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold,
fontFamily: 'Roboto'
),
),
),
],
),
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Author : '+widget.authorName,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
color: Colors.white,
),
),
IconButton(
icon: Icon(isFavorite ? Icons.favorite : Icons.favorite_border),
color: Colors.deepOrange,
onPressed: () {
setState(() {
isFavorite = !isFavorite;
});
},
),
],
),
),
],
),
),
),
)
],
),
);
}
}

+ 69
- 0
front-end_flutter_blog/lib/DataBase/dummy_data.dart View File

@@ -0,0 +1,69 @@
//
// import 'package:flutter_forum/Models/place_model.dart';
//
// final List<PlaceModel> PLACES = [
// PlaceModel(
// id: 1,
// userName: 'Filipp Grigoruk',
// title: 'Loret De Mar',
// description: 'TUI.beVakantie Lloret de Mar - Boek je hotel Lloret de mar | TUI',
// imageUrl: 'https://cdn.tui.be/img/destinations/Header/nlvakantie-spanje-lloret-de-mar.jpg',
// locationName: 'Loret De Mar'
// ),
// PlaceModel(
// id: 2,
// userName: 'Filipp Grigoruk',
// title: 'Moscow',
// description: 'TUI.beVakantie Lloret de Mar - Boek je hotel Lloret de mar | TUI',
// imageUrl: 'https://upload.wikimedia.org/wikipedia/commons/a/a2/Moscow-City2015.jpg',
// locationName: 'Loret De Mar'
// ),
// PlaceModel(
// id: 3,
// userName: 'Somme Name',
// title: 'Somme Place',
// description: 'TUI.beVakantie Lloret de Mar - Boek je hotel Lloret de mar | TUI',
// imageUrl: 'https://placeimg.com/640/480/any',
// locationName: 'Loret De Mar'
// ),
// PlaceModel(
// id: 4,
// userName: 'Stanislav Farschtey',
// title: 'Kiev',
// description: 'TUI.beVakantie Lloret de Mar - Boek je hotel Lloret de mar | TUI',
// imageUrl: 'https://media.tacdn.com/media/attractions-splice-spp-674x446/06/71/0d/ac.jpg',
// locationName: 'Loret De Mar'
// ),
// PlaceModel(
// id: 5,
// userName: 'Somme Name',
// title: 'Somme Place',
// description: 'TUI.beVakantie Lloret de Mar - Boek je hotel Lloret de mar | TUI',
// imageUrl: 'https://placeimg.com/640/480/any',
// locationName: 'Loret De Mar'
// ),
// PlaceModel(
// id: 6,
// userName: 'Filipp Grigoruk',
// title: 'New Yourk',
// description: 'TUI.beVakantie Lloret de Mar - Boek je hotel Lloret de mar | TUI',
// imageUrl: 'https://static.rondreis.nl/rondreis-storage-production/media-3418-new-york-jpg/w670xh449/eyJidWNrZXQiOiJyb25kcmVpcy1zdG9yYWdlLXByb2R1Y3Rpb24iLCJrZXkiOiJtZWRpYVwvMzQxOFwvbmV3LXlvcmsuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo2NzAsImhlaWdodCI6NDQ5fX19',
// locationName: 'Loret De Mar'
// ),
// PlaceModel(
// id: 7,
// userName: 'Filipp Grigoruk',
// title: 'Kazan',
// description: 'TUI.beVakantie Lloret de Mar - Boek je hotel Lloret de mar | TUI',
// imageUrl: 'https://media.tacdn.com/media/attractions-splice-spp-674x446/09/af/f4/6a.jpg',
// locationName: 'Loret De Mar'
// ),
// PlaceModel(
// id: 8,
// userName: 'Somme Name',
// title: 'Somme Place',
// description: 'TUI.beVakantie Lloret de Mar - Boek je hotel Lloret de mar | TUI',
// imageUrl: 'https://placeimg.com/640/480/any',
// locationName: 'Loret De Mar'
// ),
// ];

+ 15
- 0
front-end_flutter_blog/lib/Models/add_place_to_db_model.dart View File

@@ -0,0 +1,15 @@

class AddPlaceToDbModel{

final String userName = 'Lime Test User';
final String title;
final String description;
final String imageUrl = 'https://placeimg.com/640/480/any';
final String locationName;

const AddPlaceToDbModel({
required this.title,
required this.description,
required this.locationName,
});
}

+ 13
- 0
front-end_flutter_blog/lib/Models/comment_model.dart View File

@@ -0,0 +1,13 @@

class CommentModel{

final String ?id;
final String comment;
final String ?userId;

const CommentModel({
this.id,
required this.comment,
this.userId,
});
}

+ 9
- 0
front-end_flutter_blog/lib/Models/location_model.dart View File

@@ -0,0 +1,9 @@
class LocationModel{
final double latitude;
final double longitude;

const LocationModel({
required this.latitude,
required this.longitude,
});
}

+ 18
- 0
front-end_flutter_blog/lib/Models/place_model.dart View File

@@ -0,0 +1,18 @@

class PlaceModel {
final String id;
final String userName;
final String title;
final String description;
final String imageUrl;
final String locationName;

const PlaceModel({
required this.id,
required this.userName,
required this.title,
required this.description,
required this.imageUrl,
required this.locationName
});
}

+ 15
- 0
front-end_flutter_blog/lib/Models/user_model.dart View File

@@ -0,0 +1,15 @@


class UserModel{
final int? id;
final String? userName;
final String email;
final String password;

const UserModel({
this.id,
this.userName,
required this.email,
required this.password,
});
}

+ 27
- 0
front-end_flutter_blog/lib/Providers/auth_provider.dart View File

@@ -0,0 +1,27 @@


import 'package:flutter_forum/Models/user_model.dart';
import 'package:flutter_forum/Services/data_base_service.dart';

abstract class AuthBase {
Future<int> createNewUser(UserModel userModel);
Future<int> login(UserModel userModel);
}




class AuthProvider implements AuthBase{

@override
Future<int> createNewUser(UserModel userModel) async {
int response = await DataBaseService.createNewUser(userModel);
return response;
}

@override
Future<int> login(UserModel userModel) async {
int response = await DataBaseService.loginWitchCredentials(userModel);
return response;
}
}

+ 28
- 0
front-end_flutter_blog/lib/Providers/comments_provider.dart View File

@@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Models/comment_model.dart';
import 'package:flutter_forum/Services/data_base_service.dart';

class CommentsProvider with ChangeNotifier {

List<CommentModel> _comments = [];

List<CommentModel> get comments {
return [..._comments];
}

Future<void> getComments(String id) async {
final commentsList = await DataBaseService.getCommentsById(id);
_comments = commentsList.map((item) => CommentModel(
comment: item['comment'],
userId: item['user_id']
)).toList();
notifyListeners();
}

Future<void> addComment(CommentModel commentModel, String blogPostId) async {
await DataBaseService.addComment(commentModel, blogPostId);
_comments.add(commentModel);
notifyListeners();
}

}

+ 18
- 0
front-end_flutter_blog/lib/Providers/google_maps_provider.dart View File

@@ -0,0 +1,18 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
const GOOGLE_API_KEY = 'AIzaSyAMlXpWhxBTTYiGw0hepv7kYvUzb0YnKXQ';

class GoogleMapsProvider{

static String generateLocationPreviewImage({required double latitude, required double longitude}){
return 'https://maps.googleapis.com/maps/api/staticmap?center=&$latitude,$longitude&zoom=16&size=600x300&maptype=roadmap&markers=color:red%7Clabel:A%7C$latitude,$longitude&key=$GOOGLE_API_KEY';
}

static Future<String> getPlaceAddress(double lat, double lng) async {
final url = Uri.parse("https://maps.googleapis.com/maps/api/geocode/json?latlng=$lat,$lng&key=$GOOGLE_API_KEY");
final response = await http.get(url);
final String country = json.decode(response.body)['results'][0]['address_components'][5]['long_name'].toString();
final String state = json.decode(response.body)['results'][0]['address_components'][4]['long_name'].toString();
return country+' '+state;
}
}

+ 37
- 0
front-end_flutter_blog/lib/Providers/places_provider.dart View File

@@ -0,0 +1,37 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Models/location_model.dart';
import 'package:flutter_forum/Models/place_model.dart';
import 'package:flutter_forum/Services/data_base_service.dart';

class PlacesProvider with ChangeNotifier {

List<PlaceModel> _placesList = [];

List<PlaceModel> get placesList {
return [..._placesList];
}

Future<void> getAllPlaces() async {
final dataList = await DataBaseService.getPlaces();

_placesList = dataList.map((item) => PlaceModel(
id: item['id'],
userName: item['user_name'],
title: item['title'],
description: item['description'],
imageUrl: item['image_url'],
locationName: item['location_name']
)).toList();
notifyListeners();
}

Future<bool> addBlogPlace(String title, String description, LocationModel locationData) async {
var response = await DataBaseService.addPlace(title, description, locationData);
if (response == 200) {
getAllPlaces();
return true;
}else{
return false;
}
}
}

+ 102
- 0
front-end_flutter_blog/lib/Services/data_base_service.dart View File

@@ -0,0 +1,102 @@

import 'dart:async';
import 'dart:convert';
import 'package:flutter_forum/Models/add_place_to_db_model.dart';
import 'package:flutter_forum/Models/comment_model.dart';
import 'package:flutter_forum/Models/location_model.dart';
import 'package:flutter_forum/Models/user_model.dart';
import 'package:flutter_forum/Providers/google_maps_provider.dart';
import 'package:http/http.dart' as http;

class DataBaseService{

static const _publicBackEndApi = "https://18f1-81-11-211-133.ngrok.io";

static Future<List<dynamic>> getPlaces() async{
var url = Uri.parse(_publicBackEndApi+'/api/all-blog-posts');
var client = http.Client();
try {
var response = await client.get(url);
return json.decode(response.body);
} finally {
client.close();
}
}

static Future<int> addPlace(String title,String description,LocationModel location) async{
final locationName = await GoogleMapsProvider.getPlaceAddress(location.latitude, location.longitude);
final dbModel = AddPlaceToDbModel(title: title, description: description, locationName: locationName);
var url = Uri.parse(_publicBackEndApi+'/api/create/new/blog');

var client = http.Client();
try {
var response = await client.post(url,body: {
'user_name' : dbModel.userName,
'title' : dbModel.title,
'description' : dbModel.description,
'image_url' : dbModel.imageUrl,
'location_name' : dbModel.locationName
});
return response.statusCode;
}finally{
client.close();
}
}
static Future<List<dynamic>> getCommentsById(String id) async {
var url = Uri.parse(_publicBackEndApi+'/api/comments/'+id.toString());
var client = http.Client();
try {
var response = await client.get(url);
return json.decode(response.body);
} finally {
client.close();
}
}

static Future<int>addComment(CommentModel commentModel, String id) async {
var url = Uri.parse(_publicBackEndApi+'/api/add/comment');
var client = http.Client();
try{
var response = await client.post(url,body: {
'user_id' : '1',
'blog_post_id' : id,
'comment' : commentModel.comment
});
return response.statusCode;
} finally {
client.close();
}
}
static Future<int> createNewUser(UserModel userModel) async {
final url = Uri.parse(_publicBackEndApi+'/api/registration');
final client = http.Client();
try {
var response = await client.post(url,body: {
'user_name' : userModel.userName,
'email' : userModel.email,
'password' : userModel.password
});
return response.statusCode;
} finally {
client.close();
}
}

static Future<int> loginWitchCredentials(UserModel userModel) async {
final url = Uri.parse(_publicBackEndApi+'/api/login');
final client = http.Client();
try {
var response = await client.post(url,body: {
'email' : userModel.email,
'password' : userModel.password
});
print(json.decode(response.body));
return response.statusCode;
} finally {
client.close();
}
}

}

+ 53
- 0
front-end_flutter_blog/lib/Views/auth/landing_page.dart View File

@@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Views/auth/registration_component.dart';

import 'login_component.dart';

class LandingPage extends StatefulWidget {
@override
State<LandingPage> createState() => _LandingPageState();
}

class _LandingPageState extends State<LandingPage> {
bool _loginPageEnabled = false;

void _switchToLoginPage(){
setState(() { _loginPageEnabled = true; });
}

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.grey[400],
appBar: AppBar(
title: const Text("Auth-Page"),
centerTitle: true,
elevation: 4,
actions: <Widget>[_authIconButton()],
),
body: _authPage()
);
}

Widget _authIconButton(){
if (_loginPageEnabled) {
return IconButton(
onPressed: (){setState(() { _loginPageEnabled = false; });},
icon: Icon(Icons.app_registration),
tooltip: 'Registration',
);
}
return IconButton(
onPressed: (){setState(() { _loginPageEnabled = true; });},
icon: Icon(Icons.login),
tooltip: 'Login',
);
}

Widget _authPage(){
if (_loginPageEnabled) {
return LoginComponent();
}
return RegistrationComponent(registrationCompletedCallBack: _switchToLoginPage);
}
}

+ 87
- 0
front-end_flutter_blog/lib/Views/auth/login_component.dart View File

@@ -0,0 +1,87 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Models/user_model.dart';
import 'package:flutter_forum/Providers/auth_provider.dart';
import 'package:flutter_forum/Views/forum/home_view.dart';
import 'package:provider/provider.dart';
class LoginComponent extends StatelessWidget {
static const routeName = 'login-component';
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(16),
child: Card(
child: Login()
),
) ,
);
}
}

class Login extends StatelessWidget {
bool _isLoading = false;
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
void _submitLogin(context) async{
final authProvider = Provider.of<AuthBase>(context, listen: false);
final user = UserModel(email: _emailController.text, password: _passwordController.text);
var response = authProvider.login(user);
print('login component response : ${response.toString()}');
Navigator.of(context).pushNamed(Home.routeName);
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Text('Login', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
const SizedBox(height: 8),
_buildEmailTextField(),
const SizedBox(height: 8),
_buildPasswordTextField(context),
const SizedBox(height: 8),
ElevatedButton(
child: const Text('Login'),
onPressed: ()=> _submitLogin(context),
)
],
),
);
}

TextField _buildEmailTextField() {
bool showErrorText = false;
return TextField(
controller: _emailController,
decoration: InputDecoration(
labelText: 'Email',
hintText: '.......@......com',
errorText: showErrorText ? 'Email is required' : null,
enabled: _isLoading == false,
),
autocorrect: false,
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
);
}

TextField _buildPasswordTextField(BuildContext context) {
bool showErrorText = false;
return TextField(
controller: _passwordController,
decoration: InputDecoration(
labelText: 'Password',
errorText: showErrorText ? 'Password is required' : null,
enabled: _isLoading == false,
),
autocorrect: false,
obscureText: true,
textInputAction: TextInputAction.done,
onEditingComplete: ()=> _submitLogin(context),
);
}
}

+ 131
- 0
front-end_flutter_blog/lib/Views/auth/registration_component.dart View File

@@ -0,0 +1,131 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Models/user_model.dart';
import 'package:flutter_forum/Providers/auth_provider.dart';
import 'package:provider/provider.dart';

class RegistrationComponent extends StatelessWidget {

final Function registrationCompletedCallBack;

const RegistrationComponent({required this.registrationCompletedCallBack});

@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16),
child: Card(
child: Registration(callBack: registrationCompletedCallBack)
),
) ,
);
}
}

class Registration extends StatefulWidget {
final Function callBack;
const Registration({required this.callBack});
@override
State<Registration> createState() => _RegistrationState();
}

class _RegistrationState extends State<Registration> {
bool _isLoading = false;
final TextEditingController _userNameController = TextEditingController();
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();

void _submitRegistration() async {
setState(() { _isLoading = true; });
final authProvider = Provider.of<AuthBase>(context, listen: false);
try {
final UserModel user = UserModel(userName: _userNameController.text, email: _emailController.text, password: _passwordController.text);
final int response = await authProvider.createNewUser(user);
if (response == 200) {
widget.callBack();
} else {
print('Response code : ${response.toString()}');
}
} catch (e) {
print(e.toString());
} finally {
setState(() { _isLoading = false; });
_userNameController.clear();
_emailController.clear();
_passwordController.clear();
}
}

@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Text('Registration', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
const SizedBox(height: 8),
_buildUserNameTextField(),
const SizedBox(height: 8),
_buildEmailTextField(),
const SizedBox(height: 8),
_buildPasswordTextField(),
const SizedBox(height: 8),
ElevatedButton(
child: const Text('Submit Registration'),
onPressed: _submitRegistration,
)
],
),
);
}

TextField _buildUserNameTextField() {
bool showErrorText = false;
return TextField(
controller: _userNameController,
decoration: InputDecoration(
labelText: 'User name',
errorText: showErrorText ? 'Username is required' : null,
enabled: _isLoading == false,
),
autocorrect: false,
textInputAction: TextInputAction.next,
);
}

TextField _buildEmailTextField() {
bool showErrorText = false;
return TextField(
controller: _emailController,
decoration: InputDecoration(
labelText: 'Email',
hintText: '.......@......com',
errorText: showErrorText ? 'Email is required' : null,
enabled: _isLoading == false,
),
autocorrect: false,
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
);
}

TextField _buildPasswordTextField() {
bool showErrorText = false;
return TextField(
controller: _passwordController,
decoration: InputDecoration(
labelText: 'Password',
errorText: showErrorText ? 'Password is required' : null,
enabled: _isLoading == false,
),
autocorrect: false,
obscureText: true,
textInputAction: TextInputAction.done,
onEditingComplete: _submitRegistration,
);
}
}



+ 10
- 0
front-end_flutter_blog/lib/Views/forum/add_comment_view.dart View File

@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';

class AddCommentView extends StatelessWidget {
static const routeName = '/add-comment';

@override
Widget build(BuildContext context) {
return Text('add comment ');
}
}

+ 88
- 0
front-end_flutter_blog/lib/Views/forum/add_new_place_view.dart View File

@@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Components/AddNewPlaceComponents/credentials_input_component.dart';
import 'package:flutter_forum/Components/AddNewPlaceComponents/image_input_component.dart';
import 'package:flutter_forum/Components/AddNewPlaceComponents/location_input_component.dart';
import 'dart:io';
import 'package:flutter_forum/Models/location_model.dart';
import 'package:flutter_forum/Providers/places_provider.dart';
import 'package:flutter_forum/Views/forum/show_all_places_view.dart';
import 'package:provider/provider.dart';

class AddNewPlaceView extends StatefulWidget {
static const routeName = 'add-new-place';
@override
State<AddNewPlaceView> createState() => _AddNewPlaceViewState();
}

class _AddNewPlaceViewState extends State<AddNewPlaceView> {
late String _title;
late String _description;
late LocationModel _locationData;
late File _storedImage;

void setTitle(String value){_title = value;}
void setDescription(String value){_description = value;}
void setLocationData(LocationModel value){_locationData = value;}
void setStoredImage(File value){_storedImage = value;}

bool _showCircularProgressIndicator = false;

Future<void> _savePlace() async {
if (_title.isEmpty || _description.isEmpty) {
return;
}
setState(() { _showCircularProgressIndicator = true; });
var result = await Provider.of<PlacesProvider>(context, listen: false).addBlogPlace(_title,_description,_locationData);
if (result == true) {
Navigator.of(context).pop(ShowAllPlacesView.routeName);
} else {
setState(() { _showCircularProgressIndicator = false; });
print('Error in add_new_place_view');
}
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Publishing New Place'),
centerTitle: true,
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: _showCircularProgressIndicator ? const Center(child: CircularProgressIndicator()) :
SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
ImageInputComponent(),
LocationInputComponent(locationDataCallBack: setLocationData,),
SizedBox(height: 20,),
CredentialsInputComponent(setTitleCallBack: setTitle, setDescriptionCallBack: setDescription),
],
),
),
),
),
ElevatedButton.icon(
icon: const Icon(Icons.add),
label: const Text('Add Place'),
style: ButtonStyle(
elevation: MaterialStateProperty.all(0),
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
backgroundColor: MaterialStateProperty.all(Colors.deepOrange),
),
onPressed: () async {
_savePlace();
},
),
]
),
);
}
}

+ 23
- 0
front-end_flutter_blog/lib/Views/forum/home_view.dart View File

@@ -0,0 +1,23 @@
import 'package:flutter/material.dart';

import 'package:flutter_forum/Views/forum/add_new_place_view.dart';
import 'package:flutter_forum/Views/forum/show_all_places_view.dart';

class Home extends StatelessWidget {
static const routeName = 'home-page';
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.grey[400],
appBar: AppBar(
title: const Text('Lime Blog', style: TextStyle(fontFamily: 'Roboto', fontWeight: FontWeight.bold),),
centerTitle: true,
),
body: ShowAllPlacesView(),
floatingActionButton: FloatingActionButton(
onPressed: () { Navigator.of(context).pushNamed(AddNewPlaceView.routeName); },
child: const Icon(Icons.add),
),
);
}
}

+ 95
- 0
front-end_flutter_blog/lib/Views/forum/place_details_view.dart View File

@@ -0,0 +1,95 @@

import 'package:flutter/material.dart';
import 'package:flutter_forum/Components/comments_component.dart';
import 'package:flutter_forum/Models/comment_model.dart';
import 'package:flutter_forum/Models/place_model.dart';
import 'package:flutter_forum/Providers/comments_provider.dart';
import 'package:provider/provider.dart';

class PlaceDetailsView extends StatefulWidget {
static const routeName = '/place-details' ;
@override
State<PlaceDetailsView> createState() => _PlaceDetailsViewState();
}

class _PlaceDetailsViewState extends State<PlaceDetailsView> {

@override
Widget build(BuildContext context) {
final data = ModalRoute.of(context)!.settings.arguments as PlaceModel;
late String newComment;

return Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(
title: Text(data.title.toString()),
centerTitle: true,
),
body: Column(
children: [
Card(
clipBehavior: Clip.antiAliasWithSaveLayer,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)
),
elevation: 10,
child: Column(
children: [
Image(
image: NetworkImage(data.imageUrl),
fit: BoxFit.cover,
height: 300,
),
const Divider(height: 10),
ListTile(
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Title : '+data.title.toString()),
const SizedBox(height: 10),
Text('Location : '+data.locationName.toString()),
const Divider(height: 10, color: Colors.deepOrange,),
],
),
subtitle: Text(data.description.toString()),
)
],
),
),
const SizedBox(height: 10),
Expanded(
child: CommentsComponent(id: data.id.toString(),)
)
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
showDialog<void>(
context: context,
builder: (BuildContext dialogContext) {
return AlertDialog(
title: const Text('Add comment !'),
content: TextField(
onChanged: (String value){
newComment = value;
},
),
actions: <Widget>[
TextButton(
child: const Text('Add'),
onPressed: () {
Provider.of<CommentsProvider>(context, listen: false)
.addComment(CommentModel(comment: newComment),data.id.toString());
Navigator.of(dialogContext).pop(); // Dismiss alert dialog
},
),
],
);
},
);
},
child: const Icon(Icons.add),
),
);
}
}

+ 41
- 0
front-end_flutter_blog/lib/Views/forum/show_all_places_view.dart View File

@@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Components/place_component.dart';
import 'package:flutter_forum/Providers/places_provider.dart';
import 'package:provider/provider.dart';

class ShowAllPlacesView extends StatelessWidget {
static const routeName = '/all-published-places';

@override
Widget build(BuildContext context) {
return FutureBuilder(
future: Provider.of<PlacesProvider>(context, listen: false).getAllPlaces(),
builder: (context, snapshot){
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child:Text(snapshot.error.toString()));
} else {
return Consumer<PlacesProvider>(
child: const Center(child: Text('Got no places yet, start adding some!')),
builder: (ctx, PlacesProvider, child) => PlacesProvider.placesList.isEmpty ? child!:
ListView.builder(
itemCount:PlacesProvider.placesList.length,
itemBuilder: (context, index){
return PlaceComponent(
id: PlacesProvider.placesList[index].id,
imageUrl: PlacesProvider.placesList[index].imageUrl,
location: PlacesProvider.placesList[index].locationName,
authorName: PlacesProvider.placesList[index].userName,
description: PlacesProvider.placesList[index].description,
title: PlacesProvider.placesList[index].title
);
},
),
);
}
}
);
}
}


+ 38
- 0
front-end_flutter_blog/lib/main.dart View File

@@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
import 'package:flutter_forum/Providers/places_provider.dart';
import 'package:flutter_forum/Views/auth/login_component.dart';
import 'package:flutter_forum/Views/forum/add_comment_view.dart';
import 'package:flutter_forum/Views/auth/landing_page.dart';
import 'package:flutter_forum/Views/forum/home_view.dart';
import 'package:flutter_forum/Views/forum/place_details_view.dart';
import 'package:flutter_forum/Providers/comments_provider.dart';
import 'package:provider/provider.dart';
import 'Providers/auth_provider.dart';
import 'Views/forum/add_new_place_view.dart';
import 'Views/forum/show_all_places_view.dart';

void main() {
runApp(MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => PlacesProvider()),
ChangeNotifierProvider(create: (_) => CommentsProvider()),
Provider<AuthBase>(create: (_)=> AuthProvider()),
],
child: MaterialApp(
title: 'Lime Blog',
theme: ThemeData(
primarySwatch: Colors.deepOrange,
),
home: LandingPage(),
// initialRoute: AddNewPlaceView.routeName,
routes: {
ShowAllPlacesView.routeName: (context) => ShowAllPlacesView(),
PlaceDetailsView.routeName: (context) => PlaceDetailsView(),
AddCommentView.routeName: (context) => AddCommentView(),
AddNewPlaceView.routeName: (context) => AddNewPlaceView(),
LoginComponent.routeName: (context) => LoginComponent(),
Home.routeName: (context)=> Home()
},
),
));
}

+ 292
- 0
front-end_flutter_blog/pubspec.lock View File

@@ -0,0 +1,292 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.8.2"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.15.0"
cross_file:
dependency: transitive
description:
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.2"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.4"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
google_maps_flutter:
dependency: "direct dev"
description:
name: google_maps_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
google_maps_flutter_platform_interface:
dependency: transitive
description:
name: google_maps_flutter_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
http:
dependency: "direct dev"
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.4"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
image_picker:
dependency: "direct dev"
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.4+4"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.1"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.3"
lints:
dependency: transitive
description:
name: lints
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
location:
dependency: "direct dev"
description:
name: location
url: "https://pub.dartlang.org"
source: hosted
version: "4.3.0"
location_platform_interface:
dependency: transitive
description:
name: location_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.0"
location_web:
dependency: transitive
description:
name: location_web
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.1"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.11"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.0"
nested:
dependency: transitive
description:
name: nested
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
provider:
dependency: "direct dev"
description:
name: provider
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.1"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
stream_transform:
dependency: transitive
description:
name: stream_transform
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.3"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
sdks:
dart: ">=2.14.0 <3.0.0"
flutter: ">=2.5.0"

+ 94
- 0
front-end_flutter_blog/pubspec.yaml View File

@@ -0,0 +1,94 @@
name: flutter_forum
description: A new Flutter project.

# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
sdk: ">=2.12.0 <3.0.0"

# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
flutter:
sdk: flutter


# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2

dev_dependencies:
flutter_test:
sdk: flutter
provider: ^6.0.1
image_picker: ^0.8.4+4
location: ^4.3.0
google_maps_flutter: ^2.1.1
http: ^0.13.4

# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^1.0.0

# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true

# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg

# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.

# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages

# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
fonts:
- family: Roboto
fonts:
- asset: assets/fonts/Roboto-Regular.ttf
- family: IndieFlower
fonts:
- asset: assets/fonts/IndieFlower-Regular.ttf
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages

Loading…
Cancel
Save