From e546dddce52d869253e48c5cbb8e625d0cfe84e4 Mon Sep 17 00:00:00 2001 From: Grant Skinner Date: Tue, 23 Jul 2019 14:42:26 -0600 Subject: [PATCH] Initial commit. --- .gitignore | 70 +++ .metadata | 10 + CHANGELOG.md | 12 + LICENSE | 9 + README.md | 19 + example/.gitignore | 70 +++ example/.metadata | 10 + example/README.md | 7 + example/android/app/build.gradle | 61 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 33 ++ .../image_fade_example/MainActivity.java | 13 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + example/android/build.gradle | 29 + example/android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 6 + example/android/settings.gradle | 15 + example/assets/images/placeholder.png | Bin 0 -> 52964 bytes example/ios/Flutter/AppFrameworkInfo.plist | 26 + example/ios/Flutter/Debug.xcconfig | 1 + example/ios/Flutter/Release.xcconfig | 1 + example/ios/Runner.xcodeproj/project.pbxproj | 506 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + example/ios/Runner/AppDelegate.h | 6 + example/ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ example/ios/Runner/Base.lproj/Main.storyboard | 26 + example/ios/Runner/Info.plist | 45 ++ example/ios/Runner/main.m | 9 + example/lib/main.dart | 96 ++++ example/pubspec.lock | 146 +++++ example/pubspec.yaml | 27 + lib/image_fade.dart | 254 +++++++++ pubspec.lock | 139 +++++ pubspec.yaml | 23 + test/image_fade_test.dart | 6 + 67 files changed, 2025 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 example/.gitignore create mode 100644 example/.metadata create mode 100644 example/README.md create mode 100644 example/android/app/build.gradle create mode 100644 example/android/app/src/debug/AndroidManifest.xml create mode 100644 example/android/app/src/main/AndroidManifest.xml create mode 100644 example/android/app/src/main/java/com/example/image_fade_example/MainActivity.java create mode 100644 example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/values/styles.xml create mode 100644 example/android/app/src/profile/AndroidManifest.xml create mode 100644 example/android/build.gradle create mode 100644 example/android/gradle.properties create mode 100644 example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 example/android/settings.gradle create mode 100644 example/assets/images/placeholder.png create mode 100644 example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 example/ios/Flutter/Debug.xcconfig create mode 100644 example/ios/Flutter/Release.xcconfig create mode 100644 example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 example/ios/Runner/AppDelegate.h create mode 100644 example/ios/Runner/AppDelegate.m create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 example/ios/Runner/Info.plist create mode 100644 example/ios/Runner/main.m create mode 100644 example/lib/main.dart create mode 100644 example/pubspec.lock create mode 100644 example/pubspec.yaml create mode 100644 lib/image_fade.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/image_fade_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9d7edcf --- /dev/null +++ b/.gitignore @@ -0,0 +1,70 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# Visual Studio Code related +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..5ab1e9a --- /dev/null +++ b/.metadata @@ -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: 7a4c33425ddd78c54aba07d86f3f9a4a0051769b + channel: stable + +project_type: package diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..045a772 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] +- none. + +## [0.1.0] - 2019-07-01 +### Added +- First release. \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e78b3e9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,9 @@ +Copyright 2019 Grant Skinner + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6076e3 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# ImageFade + +**Requires Flutter 1.6.7 or higher.** + +A widget for Flutter that displays a `placeholder` image while a specified `image` loads, then cross-fades to the loaded image. + +If `image` is changed, it will cross-fade to the new image once it is finished loading. Setting `image` to `null` will cross-fade back to the placeholder. + +![example image](https://gskinner.github.io/image_fade/example.gif) + +You can set `color` (background color), `fadeDuration` and `fadeCurve`, as well as most `Image` properties: +`width`, `height`, `fit`, `alignment`, `repeat`, `matchTextDirection`, `excludeFromSemantics` +and `semanticLabel`. + +You can also specify a `loadingBuilder` that will display load progress any time a new image is loaded. + +## Example + +See the example directory for a simple example. diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..07488ba --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,70 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# Visual Studio Code related +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/example/.metadata b/example/.metadata new file mode 100644 index 0000000..033ad2a --- /dev/null +++ b/example/.metadata @@ -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: 7a4c33425ddd78c54aba07d86f3f9a4a0051769b + channel: stable + +project_type: app diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..2022c67 --- /dev/null +++ b/example/README.md @@ -0,0 +1,7 @@ +# image_fade_example + +Demonstrates the core features of the `ImageFade` widget. + +Pressing the `(>)` button sets the `image` property to a new `NetworkImage` (loading from WikiMedia Commons). + +Pressing the `(x)` button sets `image` to `null`. diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle new file mode 100644 index 0000000..ad7f644 --- /dev/null +++ b/example/android/app/build.gradle @@ -0,0 +1,61 @@ +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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.image_fade_example" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + 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 { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..50f0683 --- /dev/null +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..aa393cd --- /dev/null +++ b/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/example/android/app/src/main/java/com/example/image_fade_example/MainActivity.java b/example/android/app/src/main/java/com/example/image_fade_example/MainActivity.java new file mode 100644 index 0000000..dfbe0c1 --- /dev/null +++ b/example/android/app/src/main/java/com/example/image_fade_example/MainActivity.java @@ -0,0 +1,13 @@ +package com.example.image_fade_example; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..50f0683 --- /dev/null +++ b/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/build.gradle b/example/android/build.gradle new file mode 100644 index 0000000..bb8a303 --- /dev/null +++ b/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/example/android/gradle.properties b/example/android/gradle.properties new file mode 100644 index 0000000..8bd86f6 --- /dev/null +++ b/example/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..2819f02 --- /dev/null +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -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-4.10.2-all.zip diff --git a/example/android/settings.gradle b/example/android/settings.gradle new file mode 100644 index 0000000..5a2f14f --- /dev/null +++ b/example/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/example/assets/images/placeholder.png b/example/assets/images/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..7a05bd9dc6dd4d0a48cdf7058d37236ef1c8a403 GIT binary patch literal 52964 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

#k)2C*bt=WNco0-CJNT!9m8E1Imb3?T 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 + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/example/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1b1b35b --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,506 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + 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 */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 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 = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + 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 = 0910; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + 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 */, + 9740EEB41CF90195004384FC /* Debug.xcconfig 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\" 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"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m 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 = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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_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_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 = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = 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; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = S8QB4VV633; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.imageFadeExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + 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_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_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 = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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_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_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 = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.imageFadeExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.imageFadeExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + 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 */; +} diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..786d6aa --- /dev/null +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..949b678 --- /dev/null +++ b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + BuildSystemType + Original + + diff --git a/example/ios/Runner/AppDelegate.h b/example/ios/Runner/AppDelegate.h new file mode 100644 index 0000000..36e21bb --- /dev/null +++ b/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/example/ios/Runner/AppDelegate.m b/example/ios/Runner/AppDelegate.m new file mode 100644 index 0000000..59a72e9 --- /dev/null +++ b/example/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -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" + } +} diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -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. \ No newline at end of file diff --git a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist new file mode 100644 index 0000000..ba695ac --- /dev/null +++ b/example/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + image_fade_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/example/ios/Runner/main.m b/example/ios/Runner/main.m new file mode 100644 index 0000000..dff6597 --- /dev/null +++ b/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/example/lib/main.dart b/example/lib/main.dart new file mode 100644 index 0000000..4e29897 --- /dev/null +++ b/example/lib/main.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:image_fade/image_fade.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: Colors.yellow, + ), + home: MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + // Sample images from Wikimedia Commons: + static const List _imgs = [ + 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Almeida_Júnior_-_Saudade_%28Longing%29_-_Google_Art_Project.jpg/513px-Almeida_Júnior_-_Saudade_%28Longing%29_-_Google_Art_Project.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Rafael_-_Retrato_de_um_Cardeal.jpg/786px-Rafael_-_Retrato_de_um_Cardeal.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/James_McNeill_Whistler_-_La_Princesse_du_pays_de_la_porcelaine_-_brighter.jpg/580px-James_McNeill_Whistler_-_La_Princesse_du_pays_de_la_porcelaine_-_brighter.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Hans_Holbein_der_Jüngere_-_Der_Kaufmann_Georg_Gisze_-_Google_Art_Project.jpg/897px-Hans_Holbein_der_Jüngere_-_Der_Kaufmann_Georg_Gisze_-_Google_Art_Project.jpg', + 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Pieter_Bruegel_the_Elder_-_The_Tower_of_Babel_%28Vienna%29_-_Google_Art_Project_-_edited.jpg/1280px-Pieter_Bruegel_the_Elder_-_The_Tower_of_Babel_%28Vienna%29_-_Google_Art_Project_-_edited.jpg', + ]; + + int _counter = 0; + bool _clear = true; + + void _incrementCounter() { + setState(() { + if (_clear) { _clear = false; } + else { _counter = (_counter+1)%_imgs.length; } + }); + } + + void _clearImage() { + setState(() { + _clear = true; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Showing ' + (_clear ? 'placeholder image' : "image #$_counter from Wikimedia")), + ), + + body: Stack(children: [ + Positioned.fill(child: + ImageFade( + image: _clear ? null : NetworkImage(_imgs[_counter]), + placeholder: AssetImage('assets/images/placeholder.png'), + backgroundColor: Colors.black, + alignment: Alignment.center, + fit: BoxFit.cover, + loadingBuilder: (BuildContext context, Widget child, ImageChunkEvent event) { + if (event == null) { return child; } + return Center( + child: CircularProgressIndicator( + value: event.expectedTotalBytes == null ? 0.0 : event.cumulativeBytesLoaded / event.expectedTotalBytes + ), + ); + }, + ) + ) + ]), + + floatingActionButton: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ + FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Next', + child: Icon(Icons.navigate_next), + ), + SizedBox(width:10.0), + FloatingActionButton( + onPressed: _clearImage, + tooltip: 'Clear', + child: Icon(Icons.clear), + ), + ]), + ); + } +} diff --git a/example/pubspec.lock b/example/pubspec.lock new file mode 100644 index 0000000..f7a58b1 --- /dev/null +++ b/example/pubspec.lock @@ -0,0 +1,146 @@ +# 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.2.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.11" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + image_fade: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "0.1.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.5" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.2" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + 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.5.5" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + 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.0.4" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.5" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" +sdks: + dart: ">=2.2.2 <3.0.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml new file mode 100644 index 0000000..3efe314 --- /dev/null +++ b/example/pubspec.yaml @@ -0,0 +1,27 @@ +name: image_fade_example +description: Load and cross fade images +author: Grant Skinner +repository: TODO! + +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + image_fade: + path: ../ + +dev_dependencies: + flutter_test: + sdk: flutter + + +# The following section is specific to Flutter. +flutter: + uses-material-design: true + + assets: + - ./assets/images/ diff --git a/lib/image_fade.dart b/lib/image_fade.dart new file mode 100644 index 0000000..6be5dff --- /dev/null +++ b/lib/image_fade.dart @@ -0,0 +1,254 @@ +library image_fade; + +import 'package:flutter/material.dart'; + +/// A widget that displays a [placeholder] image while a specified [image] loads, +/// then cross-fades to the loaded image. +/// +/// If [image] is changed, it will cross-fade to the new image once it finishes +/// loading. +/// +/// Setting [image] to null will cross-fade back to the [placeholder]. +/// +/// ```dart +/// ImageFade( +/// placeholder: AssetImage('assets/myPlaceholder.png'), +/// image: NetworkImage('https://backend.example.com/image.png'), +/// ) +/// ``` + +class ImageFade extends StatefulWidget { + /// Creates a widget that displays a [placeholder] image while a specified [image] loads, + /// then cross-fades to the loaded image. + /// + /// The [placeholder] argument must not be null. + const ImageFade({ + Key key, + @required this.placeholder, + this.image, + this.backgroundColor = Colors.transparent, + this.fadeCurve = Curves.linear, + this.fadeDuration = const Duration(milliseconds: 500), + + this.width, + this.height, + this.fit = BoxFit.scaleDown, + this.alignment = Alignment.center, + this.repeat = ImageRepeat.noRepeat, + + this.matchTextDirection = false, + this.excludeFromSemantics = false, + this.semanticLabel, + + this.loadingBuilder, + }) : + assert(placeholder != null), + super(key: key); + + /// Image displayed when [image] is null or is loading initially. + final ImageProvider placeholder; + + /// The image to display displayed. + final ImageProvider image; + + /// The color that will display behind / around images. + final Color backgroundColor; + + /// The curve of the fade-in animation. + final Curve fadeCurve; + + /// The duration of the fade-in animation. + final Duration fadeDuration; + + /// The width to display at. See [Image.width] for more information. + final double width; + + /// The height to display at. See [Image.height] for more information. + final double height; + + /// How to draw the image within its bounds. Defaults to [BoxFit.scaleDown]. See [Image.fit] for more information. + final BoxFit fit; + + /// How to align the image within its bounds. See [Image.alignment] for more information. + final Alignment alignment; + + /// How to paint any portions of the layout bounds not covered by the image. See [Image.repeat] for more information. + final ImageRepeat repeat; + + /// Whether to paint the image in the direction of the [TextDirection]. See [Image.matchTextDirection] for more information. + final bool matchTextDirection; + + /// Whether to exclude this image from semantics. See [Image.excludeFromSemantics] for more information. + final bool excludeFromSemantics; + + /// A Semantic description of the image. See [Image.semanticLabel] for more information. + final String semanticLabel; + + /// A builder that specifies the widget to display while an image is loading. See [Image.loadingBuilder] for more information. + final ImageLoadingBuilder loadingBuilder; + + @override + State createState() => _ImageFadeState(); +} + +class _ImageResolver { + ImageStream _stream; + Function(ImageInfo) callback; + Function(ImageChunkEvent) progressCallback; + ImageStreamListener _listener; + + ImageChunkEvent chunkEvent; + + _ImageResolver(ImageProvider provider, _ImageFadeState state, this.callback, [this.progressCallback]) { + double w = state.widget.width, h = state.widget.height; + ImageConfiguration config = createLocalImageConfiguration( + state.context, + size: w != null && h != null ? Size(w, h) : null, + ); + _listener = ImageStreamListener(_complete, onChunk: _progress); + _stream = provider.resolve(config, ); + _stream.addListener(_listener); // Called sync if already completed. + } + + void _complete(ImageInfo imageInfo, bool) { + callback(imageInfo); + } + + void _progress(ImageChunkEvent event) { + if (progressCallback != null) { progressCallback(event); } + } + + void dispose() { + _stream.removeListener(_listener); + } +} + +class _ImageFadeState extends State with TickerProviderStateMixin { + ImageInfo _backImageInfo; + ImageInfo _frontImageInfo; + _ImageResolver _backResolver; + _ImageResolver _frontResolver; + AnimationController _controller; + Animation _animation; + ImageChunkEvent _chunkEvent; + + @override + void initState() { + _controller = AnimationController(vsync: this, value: 1.0); + _controller.addListener((){ setState(() {}); }); + super.initState(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _update(context); // Can't call this in initState because createLocalImageConfiguration throws errors. + } + + @override + void didUpdateWidget(ImageFade old) { + // not called on init + super.didUpdateWidget(old); + _update(context, old); + } + + void _update(BuildContext context, [ImageFade old]) { + final ImageProvider placeholder = widget.placeholder; + final ImageProvider image = widget.image ?? placeholder; + final ImageProvider oldPlaceholder = old?.placeholder; + final ImageProvider oldImage = old?.image ?? oldPlaceholder; + + if (_frontResolver == null && image != null && placeholder != null) { + // Initing, need to start with the placeholder in the back: + _backResolver = _ImageResolver(placeholder, this, (o) => _onImageComplete(o, true)); + } + + if (image != oldImage) { + if (_frontResolver != null) { + _backResolver?.dispose(); + _backResolver = _frontResolver; + _backImageInfo = _frontImageInfo; + _frontImageInfo = null; + } + + _frontResolver = _ImageResolver(image, this, _onImageComplete, _onImageProgress); + } + } + + RawImage _getImage(ImageInfo imageInfo, {opacity:1.0}) { + return RawImage( + image: imageInfo?.image, + color: Color.fromRGBO(255, 255, 255, opacity), + colorBlendMode: BlendMode.modulate, + + width: widget.width, + height: widget.height, + fit: widget.fit, + alignment: widget.alignment, + repeat: widget.repeat, + matchTextDirection: widget.matchTextDirection, + ); + } + + void _onImageComplete(ImageInfo imageInfo, [back=false]) { + setState((){ + if (back) { + _backImageInfo = imageInfo; + } else { + _frontImageInfo = imageInfo; + _controller.duration = widget.fadeDuration; + _animation = CurvedAnimation( + parent: _controller, + curve: widget.fadeCurve + ); + _controller.forward(from: 0.0); + _chunkEvent = null; + } + }); + } + + void _onImageProgress(ImageChunkEvent event) { + setState(() { + _chunkEvent = event; + }); + } + + @override + Widget build(BuildContext context) { + List kids = []; + bool frontIsOpaque = _frontImageInfo != null && _animation.value == 1.0; + if (_backImageInfo != null && !frontIsOpaque) { kids.add(_getImage(_backImageInfo)); } + + Widget front = _getImage(_frontImageInfo, opacity: _animation?.value ?? 1.0); + if (widget.loadingBuilder != null) { + front = widget.loadingBuilder(context, front, _chunkEvent); + } + + kids.add(front); + Widget content = Container( + color: widget.backgroundColor, + width: widget.width, + height: widget.height, + child: Stack(children: kids, fit: StackFit.passthrough,) + ); + + if (widget.excludeFromSemantics) { + return content; + } + + String label = widget.semanticLabel; + return Semantics( + container: label != null, + image: true, + label: label ?? "", + child: content, + ); + } + + @override + void dispose() { + _backResolver?.dispose(); + _frontResolver?.dispose(); + super.dispose(); + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..7642229 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,139 @@ +# 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.2.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.11" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.5" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.2" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + 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.5.5" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + 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.0.4" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.5" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" +sdks: + dart: ">=2.2.2 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..dee7556 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,23 @@ +name: image_fade +description: A widget that displays a placeholder and optional progress indicator while an image loads, then cross-fades to the loaded image. Improves on FadeInImage. +author: Grant Skinner +repository: https://github.com/gskinner/image_fade +homepage: https://github.com/gskinner/image_fade + +version: 0.1.0 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + + +# The following section is specific to Flutter. +flutter: + uses-material-design: true diff --git a/test/image_fade_test.dart b/test/image_fade_test.dart new file mode 100644 index 0000000..5130502 --- /dev/null +++ b/test/image_fade_test.dart @@ -0,0 +1,6 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('test name', () { + }); +}