├── .gitignore ├── .metadata ├── CHANGELOG.md ├── LICENSE ├── README.md ├── example ├── .gitignore ├── .metadata ├── README.md ├── android │ ├── .gitignore │ ├── app │ │ ├── build.gradle │ │ └── src │ │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── example │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ └── ic_launcher.png │ │ │ │ └── values │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle ├── assets │ └── images │ │ ├── shirt1.jpeg │ │ ├── shirt2.jpeg │ │ ├── shirt3.jpeg │ │ ├── shirt4.jpeg │ │ ├── shirt5.jpeg │ │ └── shirt6.jpeg ├── ios │ ├── .gitignore │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace │ │ └── contents.xcworkspacedata │ └── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── Runner-Bridging-Header.h ├── lib │ └── main.dart ├── pubspec.lock ├── pubspec.yaml └── test │ └── widget_test.dart ├── lib └── smooth_sort.dart ├── pubspec.lock ├── pubspec.yaml ├── smoothSortGifs ├── fade.gif ├── flipHorizontally.gif ├── flipVertically.gif ├── reverseFlipHorizontally.gif ├── reverseFlipVertically.gif ├── scale.gif ├── slideLeft.gif ├── slideRight.gif └── smooth_sort_cover.png └── test └── smooth_sort_test.dart /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .packages 28 | .pub-cache/ 29 | .pub/ 30 | build/ 31 | 32 | # Android related 33 | **/android/**/gradle-wrapper.jar 34 | **/android/.gradle 35 | **/android/captures/ 36 | **/android/gradlew 37 | **/android/gradlew.bat 38 | **/android/local.properties 39 | **/android/**/GeneratedPluginRegistrant.java 40 | 41 | # iOS/XCode related 42 | **/ios/**/*.mode1v3 43 | **/ios/**/*.mode2v3 44 | **/ios/**/*.moved-aside 45 | **/ios/**/*.pbxuser 46 | **/ios/**/*.perspectivev3 47 | **/ios/**/*sync/ 48 | **/ios/**/.sconsign.dblite 49 | **/ios/**/.tags* 50 | **/ios/**/.vagrant/ 51 | **/ios/**/DerivedData/ 52 | **/ios/**/Icon? 53 | **/ios/**/Pods/ 54 | **/ios/**/.symlinks/ 55 | **/ios/**/profile 56 | **/ios/**/xcuserdata 57 | **/ios/.generated/ 58 | **/ios/Flutter/App.framework 59 | **/ios/Flutter/Flutter.framework 60 | **/ios/Flutter/Generated.xcconfig 61 | **/ios/Flutter/app.flx 62 | **/ios/Flutter/app.zip 63 | **/ios/Flutter/flutter_assets/ 64 | **/ios/Flutter/flutter_export_environment.sh 65 | **/ios/ServiceDefinitions.json 66 | **/ios/Runner/GeneratedPluginRegistrant.* 67 | 68 | # Exceptions to above rules. 69 | !**/ios/**/default.mode1v3 70 | !**/ios/**/default.mode2v3 71 | !**/ios/**/default.pbxuser 72 | !**/ios/**/default.perspectivev3 73 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 74 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: e70236e36ce1d32067dc68eb55519ec3e14b6b01 8 | channel: beta 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [2.0.1] 2 | * Updated the README and solved Dart file conventions issue 3 | 4 | ## [2.0.0] 5 | * Added null safety support and descendant sorting for all the supported animations. 6 | 7 | ## [1.0.1] 8 | * Updated the example with solving maintenance issues 9 | 10 | ## [1.0.0] 11 | * Initial release of the custom wonderful SmoothSort animation 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2019] [Hemil Panchiwala] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | Platform 7 | 8 | 9 | License: MIT 11 | 12 | 13 | Pub Package 15 | 16 |
17 | 18 |
19 | 20 | In today's world, developer's use now and then sorting in their mobile applications. For such developer's, Smooth Sort can become a useful package which provides wonderful and custom animation while sorting a list instead of reloading the app. 21 | 22 | Explore how to use SmoothSort in your Flutter app through this [medium blog](https://medium.com/mobile-development-group/smooth-sort-a-flutter-package-for-wonderful-sorting-animation-b3d3b56a4d7b). 23 | 24 | # Table of Contents 25 | * [Installing](#installing) 26 | * [Demo](#demo) 27 | * [Usage](#usage) 28 | * [Documentation](#documentation) 29 | * [Algorithm](#algorithm) 30 | * [Bugs or Requests](#bugs-or-requests) 31 | * [Contributors](#contributors) 32 | * [License](#license) 33 | 34 | # Installing 35 | ### 1. Depend on it 36 | 37 | Add this to your package's pubspec.yaml file: 38 | 39 | ```yaml 40 | dependencies: 41 | smooth_sort: ^2.0.1 42 | ``` 43 | 44 | ### 2. Install it 45 | You can install packages from the command line: 46 | 47 | with Flutter: 48 | 49 | ```shell 50 | $ flutter pub get 51 | ``` 52 | Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more. 53 | 54 | ### 3. Import it 55 | Now in your Dart code, you can use: 56 | 57 | ```dart 58 | import 'package:smooth_sort/smooth_sort.dart'; 59 | ``` 60 | 61 | 62 | # Demo 63 |
64 | 65 | 66 | 72 | 78 | 84 | 85 | 86 | 92 | 98 | 104 | 105 | 106 | 112 | 118 | 119 |
67 |
Flip Vertically
68 |
animationType: flipVertically
69 |
70 | 71 |
73 |
Fade
74 |
animationType: fade
75 |
76 | 77 |
79 |
Slide Right
80 |
animationType: slideRight
81 |
82 | 83 |
87 |
Flip Horizontally
88 |
animationType: flipHorizontally
89 |
90 | 91 |
93 |
Scale
94 |
animationType: scale
95 |
96 | 97 |
99 |
Slide Left
100 |
animationType: slideLeft
101 |
102 | 103 |
107 |
Reverse Flip Vertically
108 |
animationType: reverseFlipVertically
109 |
110 | 111 |
113 |
Reverse Flip Horizontally
114 |
animationType: reverseFlipHorizontally
115 |
116 | 117 |
120 |
121 | 122 | ## Example in Medium blog 123 | In the medium blog as well as the example app, I have implemented this animation for the shopping app for sorting the products through price using the Smooth Sort package. 124 | 125 | 126 |
Scale Animation
127 |
128 |
129 | 130 |
131 | 132 | 133 | 134 | # Usage 135 | For adding the SmoothSort in your Flutter app, you have to simply provide the options for ListView or GridView with the list of the widgets to be displayed in the list/grid with the another list of their corresponding itemIds. 136 | 137 | For example: 138 | First create the object for SmoothSort 139 | ```dart 140 | SmoothSort smoothSort = SmoothSort( 141 | listType: 'list', // specify the listType i.e. list or grid 142 | ascendant: true, // sort ascending or descending 143 | itemList: [ 144 | Container( 145 | color: Colors.red, 146 | alignment: Alignment.center, 147 | child: Text( 148 | "A", 149 | style: TextStyle(fontSize: 150.0), 150 | ), 151 | ), 152 | Container( 153 | color: Colors.blueAccent, 154 | alignment: Alignment.center, 155 | child: Text( 156 | "B", 157 | style: TextStyle(fontSize: 150.0), 158 | ), 159 | ), 160 | Container( 161 | color: Colors.yellowAccent, 162 | alignment: Alignment.center, 163 | child: Text( 164 | "C", 165 | style: TextStyle(fontSize: 150.0), 166 | ), 167 | ), 168 | ], // specify the list of widgets for the ListView/GridView 169 | itemIdList: [1, 2, 0], // specify the corresponding ids for widgets 170 | animationType: 'cardScale' // specify the type of animation you want 171 | ); 172 | ``` 173 | 174 | Whenever you want to add the list or grid, just add the above widget as follows: 175 | ```dart 176 | Column( 177 | children: [ 178 | smoothSort // just add the SmoothSort object 179 | ], 180 | ), 181 | ``` 182 | 183 | After this, just call the `smoothSort.onPress()` method to start the animation for sorting the list/grid just like this: 184 | ```dart 185 | RaisedButton( 186 | child: Text("Sort"), 187 | onPressed: () { 188 | smoothSort.onPress(); // just call the onPress method 189 | }, 190 | ) 191 | ``` 192 | For more info, please refer to the `main.dart` in example. 193 | 194 | # Documentation 195 | 196 | ### SmoothSort Class 197 | 198 | | Dart attribute | Datatype | Description | Default Value | 199 | | :------------------------------------ | :-------------------------- | :----------------------------------------------------------- | :-------------------: | 200 | | listType | String | Specifies the type of list i.e. list/grid. | list | 201 | | animationType | String | Specifies the type of animation required to sort the list/grid. | flipVertically | 202 | | itemList | List<Widget> | The list of widgets which is to be sorted. | @required | 203 | | itemIdList | List<int> | This list contains the ids for the corresponding widgets needed for the sorting of widgets. | @required | 204 | | gridCrossAxisCount | int | The number of grids in a single row in GridView. | 2 | 205 | | ascendant | bool | Sort ascending or descending | true | 206 | 207 | For help on editing package code, view the [flutter documentation](https://flutter.io/developing-packages/). 208 | 209 | # Algorithm 210 | The algorithm used to build this project is as follows: 211 | 212 | I have sorted the ListView or GridView with single TextView by using the default sort function by Dart language. On clicking of the sort button, I have provided different animations to the ListView or GridView according to the animation described by the user. 213 | 214 | For more info, please refer to the `smooth_sort.dart`. 215 | 216 | # Bugs or Requests 217 | 218 | If you encounter any problems feel free to open an issue. If you feel the library is 219 | missing a feature, please raise a ticket on Github and I'll look into it. 220 | Pull request are also welcome. 221 | 222 | # Contributors 223 | 224 | Thanks goes to these awesome people! :blush: 225 | 226 | 227 | 228 | 229 | 230 | 231 |

Giulliano Albrecht

Michael Dudek
232 | 233 | # License 234 | 235 | SmoothSort is licensed under `MIT license`. View [license](https://github.com/mdg-soc-19/smooth-sort/blob/master/LICENSE). 236 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .packages 28 | .pub-cache/ 29 | .pub/ 30 | /build/ 31 | 32 | # Web related 33 | lib/generated_plugin_registrant.dart 34 | 35 | # Exceptions to above rules. 36 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 37 | -------------------------------------------------------------------------------- /example/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: e70236e36ce1d32067dc68eb55519ec3e14b6b01 8 | channel: beta 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # example 2 | 3 | A new Flutter application. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /example/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /example/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 28 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | lintOptions { 36 | disable 'InvalidPackage' 37 | } 38 | 39 | defaultConfig { 40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 41 | applicationId "com.example.example" 42 | minSdkVersion 16 43 | targetSdkVersion 28 44 | versionCode flutterVersionCode.toInteger() 45 | versionName flutterVersionName 46 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 47 | } 48 | 49 | buildTypes { 50 | release { 51 | // TODO: Add your own signing config for the release build. 52 | // Signing with the debug keys for now, so `flutter run --release` works. 53 | signingConfig signingConfigs.debug 54 | } 55 | } 56 | } 57 | 58 | flutter { 59 | source '../..' 60 | } 61 | 62 | dependencies { 63 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 64 | testImplementation 'junit:junit:4.12' 65 | androidTestImplementation 'androidx.test:runner:1.1.1' 66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' 67 | } 68 | -------------------------------------------------------------------------------- /example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 12 | 19 | 23 | 24 | 25 | 28 | 29 | 30 | 34 | 35 | 36 | 37 | 38 | 39 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /example/android/app/src/main/kotlin/com/example/example/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.example 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /example/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableR8=true 3 | android.useAndroidX=true 4 | android.enableJetifier=true 5 | -------------------------------------------------------------------------------- /example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /example/android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /example/assets/images/shirt1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/assets/images/shirt1.jpeg -------------------------------------------------------------------------------- /example/assets/images/shirt2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/assets/images/shirt2.jpeg -------------------------------------------------------------------------------- /example/assets/images/shirt3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/assets/images/shirt3.jpeg -------------------------------------------------------------------------------- /example/assets/images/shirt4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/assets/images/shirt4.jpeg -------------------------------------------------------------------------------- /example/assets/images/shirt5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/assets/images/shirt5.jpeg -------------------------------------------------------------------------------- /example/assets/images/shirt6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/assets/images/shirt6.jpeg -------------------------------------------------------------------------------- /example/ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Generated.xcconfig 20 | Flutter/app.flx 21 | Flutter/app.zip 22 | Flutter/flutter_assets/ 23 | Flutter/flutter_export_environment.sh 24 | ServiceDefinitions.json 25 | Runner/GeneratedPluginRegistrant.* 26 | 27 | # Exceptions to above rules. 28 | !default.mode1v3 29 | !default.mode2v3 30 | !default.pbxuser 31 | !default.perspectivev3 32 | -------------------------------------------------------------------------------- /example/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /example/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /example/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 13 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 15 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 16 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 18 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 19 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXCopyFilesBuildPhase section */ 23 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 24 | isa = PBXCopyFilesBuildPhase; 25 | buildActionMask = 2147483647; 26 | dstPath = ""; 27 | dstSubfolderSpec = 10; 28 | files = ( 29 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 30 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 31 | ); 32 | name = "Embed Frameworks"; 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXCopyFilesBuildPhase section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 39 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 40 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 41 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 42 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 43 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 44 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 45 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 46 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 47 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 48 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 50 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 51 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 52 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 61 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | /* End PBXFrameworksBuildPhase section */ 66 | 67 | /* Begin PBXGroup section */ 68 | 9740EEB11CF90186004384FC /* Flutter */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 3B80C3931E831B6300D905FE /* App.framework */, 72 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 73 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 74 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 75 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 76 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 77 | ); 78 | name = Flutter; 79 | sourceTree = ""; 80 | }; 81 | 97C146E51CF9000F007C117D = { 82 | isa = PBXGroup; 83 | children = ( 84 | 9740EEB11CF90186004384FC /* Flutter */, 85 | 97C146F01CF9000F007C117D /* Runner */, 86 | 97C146EF1CF9000F007C117D /* Products */, 87 | ); 88 | sourceTree = ""; 89 | }; 90 | 97C146EF1CF9000F007C117D /* Products */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 97C146EE1CF9000F007C117D /* Runner.app */, 94 | ); 95 | name = Products; 96 | sourceTree = ""; 97 | }; 98 | 97C146F01CF9000F007C117D /* Runner */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 102 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 103 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 104 | 97C147021CF9000F007C117D /* Info.plist */, 105 | 97C146F11CF9000F007C117D /* Supporting Files */, 106 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 107 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 108 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 109 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 110 | ); 111 | path = Runner; 112 | sourceTree = ""; 113 | }; 114 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | ); 118 | name = "Supporting Files"; 119 | sourceTree = ""; 120 | }; 121 | /* End PBXGroup section */ 122 | 123 | /* Begin PBXNativeTarget section */ 124 | 97C146ED1CF9000F007C117D /* Runner */ = { 125 | isa = PBXNativeTarget; 126 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 127 | buildPhases = ( 128 | 9740EEB61CF901F6004384FC /* Run Script */, 129 | 97C146EA1CF9000F007C117D /* Sources */, 130 | 97C146EB1CF9000F007C117D /* Frameworks */, 131 | 97C146EC1CF9000F007C117D /* Resources */, 132 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 133 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 134 | ); 135 | buildRules = ( 136 | ); 137 | dependencies = ( 138 | ); 139 | name = Runner; 140 | productName = Runner; 141 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 142 | productType = "com.apple.product-type.application"; 143 | }; 144 | /* End PBXNativeTarget section */ 145 | 146 | /* Begin PBXProject section */ 147 | 97C146E61CF9000F007C117D /* Project object */ = { 148 | isa = PBXProject; 149 | attributes = { 150 | LastUpgradeCheck = 1020; 151 | ORGANIZATIONNAME = "The Chromium Authors"; 152 | TargetAttributes = { 153 | 97C146ED1CF9000F007C117D = { 154 | CreatedOnToolsVersion = 7.3.1; 155 | LastSwiftMigration = 0910; 156 | }; 157 | }; 158 | }; 159 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 160 | compatibilityVersion = "Xcode 3.2"; 161 | developmentRegion = en; 162 | hasScannedForEncodings = 0; 163 | knownRegions = ( 164 | en, 165 | Base, 166 | ); 167 | mainGroup = 97C146E51CF9000F007C117D; 168 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 169 | projectDirPath = ""; 170 | projectRoot = ""; 171 | targets = ( 172 | 97C146ED1CF9000F007C117D /* Runner */, 173 | ); 174 | }; 175 | /* End PBXProject section */ 176 | 177 | /* Begin PBXResourcesBuildPhase section */ 178 | 97C146EC1CF9000F007C117D /* Resources */ = { 179 | isa = PBXResourcesBuildPhase; 180 | buildActionMask = 2147483647; 181 | files = ( 182 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 183 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 184 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 185 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | /* End PBXResourcesBuildPhase section */ 190 | 191 | /* Begin PBXShellScriptBuildPhase section */ 192 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 193 | isa = PBXShellScriptBuildPhase; 194 | buildActionMask = 2147483647; 195 | files = ( 196 | ); 197 | inputPaths = ( 198 | ); 199 | name = "Thin Binary"; 200 | outputPaths = ( 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | shellPath = /bin/sh; 204 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; 205 | }; 206 | 9740EEB61CF901F6004384FC /* Run Script */ = { 207 | isa = PBXShellScriptBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | ); 211 | inputPaths = ( 212 | ); 213 | name = "Run Script"; 214 | outputPaths = ( 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | shellPath = /bin/sh; 218 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 219 | }; 220 | /* End PBXShellScriptBuildPhase section */ 221 | 222 | /* Begin PBXSourcesBuildPhase section */ 223 | 97C146EA1CF9000F007C117D /* Sources */ = { 224 | isa = PBXSourcesBuildPhase; 225 | buildActionMask = 2147483647; 226 | files = ( 227 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 228 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | /* End PBXSourcesBuildPhase section */ 233 | 234 | /* Begin PBXVariantGroup section */ 235 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 236 | isa = PBXVariantGroup; 237 | children = ( 238 | 97C146FB1CF9000F007C117D /* Base */, 239 | ); 240 | name = Main.storyboard; 241 | sourceTree = ""; 242 | }; 243 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 244 | isa = PBXVariantGroup; 245 | children = ( 246 | 97C147001CF9000F007C117D /* Base */, 247 | ); 248 | name = LaunchScreen.storyboard; 249 | sourceTree = ""; 250 | }; 251 | /* End PBXVariantGroup section */ 252 | 253 | /* Begin XCBuildConfiguration section */ 254 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 255 | isa = XCBuildConfiguration; 256 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 257 | buildSettings = { 258 | ALWAYS_SEARCH_USER_PATHS = NO; 259 | CLANG_ANALYZER_NONNULL = YES; 260 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 261 | CLANG_CXX_LIBRARY = "libc++"; 262 | CLANG_ENABLE_MODULES = YES; 263 | CLANG_ENABLE_OBJC_ARC = YES; 264 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 265 | CLANG_WARN_BOOL_CONVERSION = YES; 266 | CLANG_WARN_COMMA = YES; 267 | CLANG_WARN_CONSTANT_CONVERSION = YES; 268 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 269 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 270 | CLANG_WARN_EMPTY_BODY = YES; 271 | CLANG_WARN_ENUM_CONVERSION = YES; 272 | CLANG_WARN_INFINITE_RECURSION = YES; 273 | CLANG_WARN_INT_CONVERSION = YES; 274 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 275 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 276 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 277 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 278 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 279 | CLANG_WARN_STRICT_PROTOTYPES = YES; 280 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 281 | CLANG_WARN_UNREACHABLE_CODE = YES; 282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 283 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 284 | COPY_PHASE_STRIP = NO; 285 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 286 | ENABLE_NS_ASSERTIONS = NO; 287 | ENABLE_STRICT_OBJC_MSGSEND = YES; 288 | GCC_C_LANGUAGE_STANDARD = gnu99; 289 | GCC_NO_COMMON_BLOCKS = YES; 290 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 291 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 292 | GCC_WARN_UNDECLARED_SELECTOR = YES; 293 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 294 | GCC_WARN_UNUSED_FUNCTION = YES; 295 | GCC_WARN_UNUSED_VARIABLE = YES; 296 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 297 | MTL_ENABLE_DEBUG_INFO = NO; 298 | SDKROOT = iphoneos; 299 | SUPPORTED_PLATFORMS = iphoneos; 300 | TARGETED_DEVICE_FAMILY = "1,2"; 301 | VALIDATE_PRODUCT = YES; 302 | }; 303 | name = Profile; 304 | }; 305 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 306 | isa = XCBuildConfiguration; 307 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 308 | buildSettings = { 309 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 310 | CLANG_ENABLE_MODULES = YES; 311 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 312 | ENABLE_BITCODE = NO; 313 | FRAMEWORK_SEARCH_PATHS = ( 314 | "$(inherited)", 315 | "$(PROJECT_DIR)/Flutter", 316 | ); 317 | INFOPLIST_FILE = Runner/Info.plist; 318 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 319 | LIBRARY_SEARCH_PATHS = ( 320 | "$(inherited)", 321 | "$(PROJECT_DIR)/Flutter", 322 | ); 323 | PRODUCT_BUNDLE_IDENTIFIER = com.example.example; 324 | PRODUCT_NAME = "$(TARGET_NAME)"; 325 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 326 | SWIFT_VERSION = 4.0; 327 | VERSIONING_SYSTEM = "apple-generic"; 328 | }; 329 | name = Profile; 330 | }; 331 | 97C147031CF9000F007C117D /* Debug */ = { 332 | isa = XCBuildConfiguration; 333 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 334 | buildSettings = { 335 | ALWAYS_SEARCH_USER_PATHS = NO; 336 | CLANG_ANALYZER_NONNULL = YES; 337 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 338 | CLANG_CXX_LIBRARY = "libc++"; 339 | CLANG_ENABLE_MODULES = YES; 340 | CLANG_ENABLE_OBJC_ARC = YES; 341 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 342 | CLANG_WARN_BOOL_CONVERSION = YES; 343 | CLANG_WARN_COMMA = YES; 344 | CLANG_WARN_CONSTANT_CONVERSION = YES; 345 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 347 | CLANG_WARN_EMPTY_BODY = YES; 348 | CLANG_WARN_ENUM_CONVERSION = YES; 349 | CLANG_WARN_INFINITE_RECURSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 352 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 353 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 354 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 355 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 356 | CLANG_WARN_STRICT_PROTOTYPES = YES; 357 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 358 | CLANG_WARN_UNREACHABLE_CODE = YES; 359 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 360 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 361 | COPY_PHASE_STRIP = NO; 362 | DEBUG_INFORMATION_FORMAT = dwarf; 363 | ENABLE_STRICT_OBJC_MSGSEND = YES; 364 | ENABLE_TESTABILITY = YES; 365 | GCC_C_LANGUAGE_STANDARD = gnu99; 366 | GCC_DYNAMIC_NO_PIC = NO; 367 | GCC_NO_COMMON_BLOCKS = YES; 368 | GCC_OPTIMIZATION_LEVEL = 0; 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 374 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 375 | GCC_WARN_UNDECLARED_SELECTOR = YES; 376 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 377 | GCC_WARN_UNUSED_FUNCTION = YES; 378 | GCC_WARN_UNUSED_VARIABLE = YES; 379 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 380 | MTL_ENABLE_DEBUG_INFO = YES; 381 | ONLY_ACTIVE_ARCH = YES; 382 | SDKROOT = iphoneos; 383 | TARGETED_DEVICE_FAMILY = "1,2"; 384 | }; 385 | name = Debug; 386 | }; 387 | 97C147041CF9000F007C117D /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 390 | buildSettings = { 391 | ALWAYS_SEARCH_USER_PATHS = NO; 392 | CLANG_ANALYZER_NONNULL = YES; 393 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 394 | CLANG_CXX_LIBRARY = "libc++"; 395 | CLANG_ENABLE_MODULES = YES; 396 | CLANG_ENABLE_OBJC_ARC = YES; 397 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 398 | CLANG_WARN_BOOL_CONVERSION = YES; 399 | CLANG_WARN_COMMA = YES; 400 | CLANG_WARN_CONSTANT_CONVERSION = YES; 401 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 402 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 403 | CLANG_WARN_EMPTY_BODY = YES; 404 | CLANG_WARN_ENUM_CONVERSION = YES; 405 | CLANG_WARN_INFINITE_RECURSION = YES; 406 | CLANG_WARN_INT_CONVERSION = YES; 407 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 408 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 409 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 410 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 411 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 412 | CLANG_WARN_STRICT_PROTOTYPES = YES; 413 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 414 | CLANG_WARN_UNREACHABLE_CODE = YES; 415 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 416 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 417 | COPY_PHASE_STRIP = NO; 418 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 419 | ENABLE_NS_ASSERTIONS = NO; 420 | ENABLE_STRICT_OBJC_MSGSEND = YES; 421 | GCC_C_LANGUAGE_STANDARD = gnu99; 422 | GCC_NO_COMMON_BLOCKS = YES; 423 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 424 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 425 | GCC_WARN_UNDECLARED_SELECTOR = YES; 426 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 427 | GCC_WARN_UNUSED_FUNCTION = YES; 428 | GCC_WARN_UNUSED_VARIABLE = YES; 429 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 430 | MTL_ENABLE_DEBUG_INFO = NO; 431 | SDKROOT = iphoneos; 432 | SUPPORTED_PLATFORMS = iphoneos; 433 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 434 | TARGETED_DEVICE_FAMILY = "1,2"; 435 | VALIDATE_PRODUCT = YES; 436 | }; 437 | name = Release; 438 | }; 439 | 97C147061CF9000F007C117D /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 442 | buildSettings = { 443 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 444 | CLANG_ENABLE_MODULES = YES; 445 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 446 | ENABLE_BITCODE = NO; 447 | FRAMEWORK_SEARCH_PATHS = ( 448 | "$(inherited)", 449 | "$(PROJECT_DIR)/Flutter", 450 | ); 451 | INFOPLIST_FILE = Runner/Info.plist; 452 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 453 | LIBRARY_SEARCH_PATHS = ( 454 | "$(inherited)", 455 | "$(PROJECT_DIR)/Flutter", 456 | ); 457 | PRODUCT_BUNDLE_IDENTIFIER = com.example.example; 458 | PRODUCT_NAME = "$(TARGET_NAME)"; 459 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 460 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 461 | SWIFT_VERSION = 4.0; 462 | VERSIONING_SYSTEM = "apple-generic"; 463 | }; 464 | name = Debug; 465 | }; 466 | 97C147071CF9000F007C117D /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 469 | buildSettings = { 470 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 471 | CLANG_ENABLE_MODULES = YES; 472 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 473 | ENABLE_BITCODE = NO; 474 | FRAMEWORK_SEARCH_PATHS = ( 475 | "$(inherited)", 476 | "$(PROJECT_DIR)/Flutter", 477 | ); 478 | INFOPLIST_FILE = Runner/Info.plist; 479 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 480 | LIBRARY_SEARCH_PATHS = ( 481 | "$(inherited)", 482 | "$(PROJECT_DIR)/Flutter", 483 | ); 484 | PRODUCT_BUNDLE_IDENTIFIER = com.example.example; 485 | PRODUCT_NAME = "$(TARGET_NAME)"; 486 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 487 | SWIFT_VERSION = 4.0; 488 | VERSIONING_SYSTEM = "apple-generic"; 489 | }; 490 | name = Release; 491 | }; 492 | /* End XCBuildConfiguration section */ 493 | 494 | /* Begin XCConfigurationList section */ 495 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 496 | isa = XCConfigurationList; 497 | buildConfigurations = ( 498 | 97C147031CF9000F007C117D /* Debug */, 499 | 97C147041CF9000F007C117D /* Release */, 500 | 249021D3217E4FDB00AE95B9 /* Profile */, 501 | ); 502 | defaultConfigurationIsVisible = 0; 503 | defaultConfigurationName = Release; 504 | }; 505 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 506 | isa = XCConfigurationList; 507 | buildConfigurations = ( 508 | 97C147061CF9000F007C117D /* Debug */, 509 | 97C147071CF9000F007C117D /* Release */, 510 | 249021D4217E4FDB00AE95B9 /* Profile */, 511 | ); 512 | defaultConfigurationIsVisible = 0; 513 | defaultConfigurationName = Release; 514 | }; 515 | /* End XCConfigurationList section */ 516 | 517 | }; 518 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 519 | } 520 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /example/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /example/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /example/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /example/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | example 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /example/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /example/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:smooth_sort/smooth_sort.dart'; 3 | 4 | void main() => runApp(MyApp()); 5 | 6 | class MyApp extends StatelessWidget { 7 | @override 8 | Widget build(BuildContext context) { 9 | return MaterialApp( 10 | debugShowCheckedModeBanner: false, 11 | home: Scaffold( 12 | appBar: AppBar(title: Text('Update AnimatedList data')), 13 | body: BodyWidget(), 14 | ), 15 | ); 16 | } 17 | } 18 | 19 | class BodyWidget extends StatefulWidget { 20 | @override 21 | BodyWidgetState createState() { 22 | return new BodyWidgetState(); 23 | } 24 | } 25 | 26 | class BodyWidgetState extends State with TickerProviderStateMixin { 27 | late SmoothSort smoothSort; 28 | 29 | @override 30 | void initState() { 31 | super.initState(); 32 | 33 | smoothSort = SmoothSort( 34 | listType: 'grid', 35 | itemList: [ 36 | Container( 37 | color: Colors.white, 38 | margin: EdgeInsets.fromLTRB(1.0, 1.0, 1.0, 1.0), 39 | child: Column( 40 | children: [ 41 | Image.asset( 42 | 'assets/images/shirt1.jpeg', 43 | height: 140, 44 | ), 45 | Text("Peter England"), 46 | Text( 47 | "Men Solid Formal Shirt", 48 | style: TextStyle( 49 | color: Colors.grey 50 | ), 51 | ), 52 | Row( 53 | children: [ 54 | Text( 55 | " ₹499 ", 56 | style: TextStyle( 57 | fontWeight: FontWeight.bold, 58 | fontSize: 20.0 59 | ), 60 | ), 61 | Text( 62 | "999 ", 63 | style: TextStyle( 64 | color: Colors.grey, 65 | decoration: TextDecoration.lineThrough, 66 | fontWeight: FontWeight.bold 67 | ), 68 | ), 69 | Text( 70 | "50% off", 71 | style: TextStyle( 72 | color: Colors.lightGreen, 73 | fontWeight: FontWeight.bold 74 | ), 75 | ) 76 | ], 77 | ) 78 | ], 79 | ), 80 | ), 81 | Container( 82 | color: Colors.white, 83 | margin: EdgeInsets.fromLTRB(1.0, 1.0, 1.0, 1.0), 84 | child: Column( 85 | children: [ 86 | Image.asset( 87 | 'assets/images/shirt3.jpeg', 88 | height: 140, 89 | ), 90 | Text("Flying Machine"), 91 | Text( 92 | "Men Solid Casual Spread Shirt", 93 | style: TextStyle( 94 | color: Colors.grey 95 | ), 96 | ), 97 | Row( 98 | children: [ 99 | Text( 100 | " ₹694 ", 101 | style: TextStyle( 102 | fontWeight: FontWeight.bold, 103 | fontSize: 20.0 104 | ), 105 | ), 106 | Text( 107 | "900 ", 108 | style: TextStyle( 109 | color: Colors.grey, 110 | decoration: TextDecoration.lineThrough, 111 | fontWeight: FontWeight.bold 112 | ), 113 | ), 114 | Text( 115 | "40% off", 116 | style: TextStyle( 117 | color: Colors.lightGreen, 118 | fontWeight: FontWeight.bold 119 | ), 120 | ) 121 | ], 122 | ) 123 | ], 124 | ), 125 | ), 126 | Container( 127 | color: Colors.white, 128 | margin: EdgeInsets.fromLTRB(1.0, 1.0, 1.0, 1.0), 129 | child: Column( 130 | children: [ 131 | Image.asset( 132 | 'assets/images/shirt4.jpeg', 133 | height: 140, 134 | ), 135 | Text("Raymond"), 136 | Text( 137 | "Men Self Design Formal Shirt", 138 | style: TextStyle( 139 | color: Colors.grey 140 | ), 141 | ), 142 | Row( 143 | children: [ 144 | Text( 145 | " ₹749 ", 146 | style: TextStyle( 147 | fontWeight: FontWeight.bold, 148 | fontSize: 20.0 149 | ), 150 | ), 151 | Text( 152 | "2499 ", 153 | style: TextStyle( 154 | color: Colors.grey, 155 | decoration: TextDecoration.lineThrough, 156 | fontWeight: FontWeight.bold 157 | ), 158 | ), 159 | Text( 160 | "70% off", 161 | style: TextStyle( 162 | color: Colors.lightGreen, 163 | fontWeight: FontWeight.bold 164 | ), 165 | ) 166 | ], 167 | ) 168 | ], 169 | ), 170 | ), 171 | Container( 172 | color: Colors.white, 173 | margin: EdgeInsets.fromLTRB(1.0, 1.0, 1.0, 1.0), 174 | child: Column( 175 | children: [ 176 | Image.asset( 177 | 'assets/images/shirt2.jpeg', 178 | height: 140, 179 | ), 180 | Text("Highlander"), 181 | Text( 182 | "Men Casual Regular Shirt", 183 | style: TextStyle( 184 | color: Colors.grey 185 | ), 186 | ), 187 | Row( 188 | children: [ 189 | Text( 190 | " ₹1019 ", 191 | style: TextStyle( 192 | fontWeight: FontWeight.bold, 193 | fontSize: 20.0 194 | ), 195 | ), 196 | Text( 197 | "1699 ", 198 | style: TextStyle( 199 | color: Colors.grey, 200 | decoration: TextDecoration.lineThrough, 201 | fontWeight: FontWeight.bold 202 | ), 203 | ), 204 | Text( 205 | "40% off", 206 | style: TextStyle( 207 | color: Colors.lightGreen, 208 | fontWeight: FontWeight.bold 209 | ), 210 | ) 211 | ], 212 | ) 213 | ], 214 | ), 215 | ), 216 | Container( 217 | color: Colors.white, 218 | margin: EdgeInsets.fromLTRB(1.0, 1.0, 1.0, 1.0), 219 | child: Column( 220 | children: [ 221 | Image.asset( 222 | 'assets/images/shirt6.jpeg', 223 | height: 140, 224 | ), 225 | Text("Van Heusen"), 226 | Text( 227 | "Men Casual Shirt", 228 | style: TextStyle( 229 | color: Colors.grey 230 | ), 231 | ), 232 | Row( 233 | children: [ 234 | Text( 235 | " ₹1429 ", 236 | style: TextStyle( 237 | fontWeight: FontWeight.bold, 238 | fontSize: 20.0 239 | ), 240 | ), 241 | Text( 242 | "2599 ", 243 | style: TextStyle( 244 | color: Colors.grey, 245 | decoration: TextDecoration.lineThrough, 246 | fontWeight: FontWeight.bold 247 | ), 248 | ), 249 | Text( 250 | "45% off", 251 | style: TextStyle( 252 | color: Colors.lightGreen, 253 | fontWeight: FontWeight.bold 254 | ), 255 | ) 256 | ], 257 | ) 258 | ], 259 | ), 260 | ), 261 | Container( 262 | color: Colors.white, 263 | margin: EdgeInsets.fromLTRB(1.0, 1.0, 1.0, 1.0), 264 | child: Column( 265 | children: [ 266 | Image.asset( 267 | 'assets/images/shirt5.jpeg', 268 | height: 140, 269 | ), 270 | Text("Levis"), 271 | Text( 272 | "Men Casual Cut Away Shirt", 273 | style: TextStyle( 274 | color: Colors.grey 275 | ), 276 | ), 277 | Row( 278 | children: [ 279 | Text( 280 | " ₹1499 ", 281 | style: TextStyle( 282 | fontWeight: FontWeight.bold, 283 | fontSize: 20.0 284 | ), 285 | ), 286 | Text( 287 | "2999 ", 288 | style: TextStyle( 289 | color: Colors.grey, 290 | decoration: TextDecoration.lineThrough, 291 | fontWeight: FontWeight.bold 292 | ), 293 | ), 294 | Text( 295 | "50% off", 296 | style: TextStyle( 297 | color: Colors.lightGreen, 298 | fontWeight: FontWeight.bold 299 | ), 300 | ) 301 | ], 302 | ) 303 | ], 304 | ), 305 | ), 306 | ], 307 | itemIdList: [4, 5, 3, 2, 0, 1], 308 | animationType: 'scale'); 309 | } 310 | 311 | @override 312 | Widget build(BuildContext context) { 313 | return Container( 314 | color: Colors.black54, 315 | child: Column( 316 | children: [ 317 | smoothSort, 318 | ElevatedButton( 319 | child: Text("Sort By Price"), 320 | onPressed: () { 321 | smoothSort.onPress(); 322 | }, 323 | ) 324 | ], 325 | ), 326 | ); 327 | } 328 | } 329 | -------------------------------------------------------------------------------- /example/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.5.0" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.1.0" 18 | characters: 19 | dependency: transitive 20 | description: 21 | name: characters 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.1.0" 25 | charcode: 26 | dependency: transitive 27 | description: 28 | name: charcode 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.2.0" 32 | clock: 33 | dependency: transitive 34 | description: 35 | name: clock 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.0" 39 | collection: 40 | dependency: transitive 41 | description: 42 | name: collection 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.15.0" 46 | cupertino_icons: 47 | dependency: "direct main" 48 | description: 49 | name: cupertino_icons 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.0.2" 53 | fake_async: 54 | dependency: transitive 55 | description: 56 | name: fake_async 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "1.2.0" 60 | flutter: 61 | dependency: "direct main" 62 | description: flutter 63 | source: sdk 64 | version: "0.0.0" 65 | flutter_test: 66 | dependency: "direct dev" 67 | description: flutter 68 | source: sdk 69 | version: "0.0.0" 70 | matcher: 71 | dependency: transitive 72 | description: 73 | name: matcher 74 | url: "https://pub.dartlang.org" 75 | source: hosted 76 | version: "0.12.10" 77 | meta: 78 | dependency: transitive 79 | description: 80 | name: meta 81 | url: "https://pub.dartlang.org" 82 | source: hosted 83 | version: "1.3.0" 84 | path: 85 | dependency: transitive 86 | description: 87 | name: path 88 | url: "https://pub.dartlang.org" 89 | source: hosted 90 | version: "1.8.0" 91 | sky_engine: 92 | dependency: transitive 93 | description: flutter 94 | source: sdk 95 | version: "0.0.99" 96 | smooth_sort: 97 | dependency: "direct main" 98 | description: 99 | path: ".." 100 | relative: true 101 | source: path 102 | version: "1.0.0" 103 | source_span: 104 | dependency: transitive 105 | description: 106 | name: source_span 107 | url: "https://pub.dartlang.org" 108 | source: hosted 109 | version: "1.8.0" 110 | stack_trace: 111 | dependency: transitive 112 | description: 113 | name: stack_trace 114 | url: "https://pub.dartlang.org" 115 | source: hosted 116 | version: "1.10.0" 117 | stream_channel: 118 | dependency: transitive 119 | description: 120 | name: stream_channel 121 | url: "https://pub.dartlang.org" 122 | source: hosted 123 | version: "2.1.0" 124 | string_scanner: 125 | dependency: transitive 126 | description: 127 | name: string_scanner 128 | url: "https://pub.dartlang.org" 129 | source: hosted 130 | version: "1.1.0" 131 | term_glyph: 132 | dependency: transitive 133 | description: 134 | name: term_glyph 135 | url: "https://pub.dartlang.org" 136 | source: hosted 137 | version: "1.2.0" 138 | test_api: 139 | dependency: transitive 140 | description: 141 | name: test_api 142 | url: "https://pub.dartlang.org" 143 | source: hosted 144 | version: "0.2.19" 145 | typed_data: 146 | dependency: transitive 147 | description: 148 | name: typed_data 149 | url: "https://pub.dartlang.org" 150 | source: hosted 151 | version: "1.3.0" 152 | vector_math: 153 | dependency: transitive 154 | description: 155 | name: vector_math 156 | url: "https://pub.dartlang.org" 157 | source: hosted 158 | version: "2.1.0" 159 | sdks: 160 | dart: ">=2.12.0 <3.0.0" 161 | -------------------------------------------------------------------------------- /example/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: example 2 | description: A new Flutter application. 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # In Android, build-name is used as versionName while build-number used as versionCode. 10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 12 | # Read more about iOS versioning at 13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 14 | version: 1.0.0+1 15 | 16 | environment: 17 | sdk: '>=2.12.0 <3.0.0' 18 | 19 | dependencies: 20 | flutter: 21 | sdk: flutter 22 | 23 | smooth_sort: 24 | path: ../ 25 | 26 | # The following adds the Cupertino Icons font to your application. 27 | # Use with the CupertinoIcons class for iOS style icons. 28 | cupertino_icons: ^1.0.2 29 | 30 | dev_dependencies: 31 | flutter_test: 32 | sdk: flutter 33 | 34 | 35 | # For information on the generic Dart part of this file, see the 36 | # following page: https://dart.dev/tools/pub/pubspec 37 | 38 | # The following section is specific to Flutter. 39 | flutter: 40 | 41 | # The following line ensures that the Material Icons font is 42 | # included with your application, so that you can use the icons in 43 | # the material Icons class. 44 | uses-material-design: true 45 | 46 | # To add assets to your application, add an assets section, like this: 47 | # assets: 48 | # - images/a_dot_burr.jpeg 49 | # - images/a_dot_ham.jpeg 50 | assets: 51 | - assets/images/shirt1.jpeg 52 | - assets/images/shirt2.jpeg 53 | - assets/images/shirt3.jpeg 54 | - assets/images/shirt4.jpeg 55 | - assets/images/shirt5.jpeg 56 | - assets/images/shirt6.jpeg 57 | 58 | # An image asset can refer to one or more resolution-specific "variants", see 59 | # https://flutter.dev/assets-and-images/#resolution-aware. 60 | 61 | # For details regarding adding assets from package dependencies, see 62 | # https://flutter.dev/assets-and-images/#from-packages 63 | 64 | # To add custom fonts to your application, add a fonts section here, 65 | # in this "flutter" section. Each entry in this list should have a 66 | # "family" key with the font family name, and a "fonts" key with a 67 | # list giving the asset and other descriptors for the font. For 68 | # example: 69 | # fonts: 70 | # - family: Schyler 71 | # fonts: 72 | # - asset: fonts/Schyler-Regular.ttf 73 | # - asset: fonts/Schyler-Italic.ttf 74 | # style: italic 75 | # - family: Trajan Pro 76 | # fonts: 77 | # - asset: fonts/TrajanPro.ttf 78 | # - asset: fonts/TrajanPro_Bold.ttf 79 | # weight: 700 80 | # 81 | # For details regarding fonts from package dependencies, 82 | # see https://flutter.dev/custom-fonts/#from-packages 83 | -------------------------------------------------------------------------------- /example/test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:example/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /lib/smooth_sort.dart: -------------------------------------------------------------------------------- 1 | library smooth_sort; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | import 'dart:math'; 6 | 7 | /// The duration for the vertically flip animation 8 | const _flipVerticallyDuration = Duration(milliseconds: 1000); 9 | 10 | /// The duration for the horizontally flip animation 11 | const _flipHorizontallyDuration = Duration(milliseconds: 1000); 12 | 13 | /// The duration for the slide animation 14 | const _slideDuration = Duration(milliseconds: 1000); 15 | 16 | /// The duration for the fade animation 17 | const _fadeDuration = Duration(milliseconds: 1000); 18 | 19 | /// The duration for the scale animation 20 | const _scaleDuration = Duration(milliseconds: 1000); 21 | 22 | class SmoothSort extends StatefulWidget { 23 | /// The string for selecting the type of the list i.e. list or grid 24 | /// 25 | /// default to list 26 | final String listType; 27 | 28 | /// The string for selecting the type of the animation 29 | /// 30 | /// default to flipVertically 31 | final String animationType; 32 | 33 | /// Keeps count for the number of grids in a single row 34 | /// 35 | /// default to 2 36 | final int gridCrossAxisCount; 37 | 38 | /// The list of widgets available for sorting 39 | final List itemList; 40 | 41 | /// The boolean variable for the sorting ascendant or descendant 42 | /// 43 | /// default true 44 | final bool ascendant; 45 | 46 | /// The list of ids corresponding to the particular item which is useful for sorting the items 47 | final List itemIdList; 48 | 49 | SmoothSort( 50 | {Key? key, 51 | this.listType = 'list', 52 | required this.itemList, 53 | required this.itemIdList, 54 | this.ascendant = true, 55 | this.animationType = 'flipVertically', 56 | this.gridCrossAxisCount = 2}); 57 | 58 | final _SmoothSortState __smoothSortState = _SmoothSortState(); 59 | 60 | @override 61 | _SmoothSortState createState() => __smoothSortState; 62 | 63 | void onPress() { 64 | __smoothSortState.sortList(ascendant); 65 | } 66 | } 67 | 68 | class _SmoothSortState extends State 69 | with TickerProviderStateMixin { 70 | /// GlobalKey for the list 71 | GlobalKey? _listkey; 72 | 73 | /// AnimationController for the flipVertically animation 74 | late AnimationController _flipVerticallyAnimationController; 75 | 76 | /// AnimationController for the flipHorizontally animation 77 | late AnimationController _flipHorizontallyAnimationController; 78 | 79 | /// AnimationController for the slide animation 80 | late AnimationController _slideAnimationController; 81 | 82 | /// AnimationController for the fade animation 83 | late AnimationController _listFadeAnimationController, 84 | _newListFadeAnimationController; 85 | 86 | /// AnimationController for the scale animation 87 | late AnimationController _listScaleAnimationController, 88 | _newListScaleAnimationController; 89 | 90 | /// Tween object for vertical flip animation 91 | late Animation _flipX; 92 | 93 | /// Tween object for horizontal flip animation 94 | late Animation _flipY; 95 | 96 | /// Tween object for slideRight animation 97 | Animation? _listSlideRight, _newListSlideRight, _listPositionRight; 98 | 99 | /// Tween object for slideLeft animation 100 | Animation? _listSlideLeft, _newListSlideLeft, _listPositionLeft; 101 | 102 | /// Tween object for fade animation 103 | Animation? _fadeIn, _fadeOut, _listFadeValue; 104 | 105 | /// Tween object for scale animation 106 | Animation? _positiveScale, __negativeScale, _listScaleValue; 107 | 108 | @override 109 | void initState() { 110 | super.initState(); 111 | 112 | _listkey = GlobalKey(); 113 | 114 | _flipVerticallyAnimationController = AnimationController( 115 | vsync: this, duration: _flipVerticallyDuration, value: 1); 116 | 117 | _flipHorizontallyAnimationController = AnimationController( 118 | vsync: this, duration: _flipHorizontallyDuration, value: 1); 119 | 120 | _slideAnimationController = 121 | AnimationController(vsync: this, duration: _slideDuration, value: 1); 122 | 123 | _listFadeAnimationController = 124 | AnimationController(vsync: this, duration: _fadeDuration, value: 1); 125 | 126 | _newListFadeAnimationController = 127 | AnimationController(vsync: this, duration: _fadeDuration, value: 1); 128 | 129 | _listScaleAnimationController = 130 | AnimationController(vsync: this, duration: _scaleDuration, value: 1); 131 | 132 | _newListScaleAnimationController = 133 | AnimationController(vsync: this, duration: _scaleDuration, value: 1); 134 | 135 | _flipX = Tween(begin: -0.5, end: 0) 136 | .animate(_flipVerticallyAnimationController); 137 | 138 | _flipY = Tween(begin: -0.5, end: 0) 139 | .animate(_flipHorizontallyAnimationController); 140 | 141 | _listSlideRight = Tween(begin: Offset(1, 0), end: Offset.zero) 142 | .animate(_slideAnimationController); 143 | 144 | _newListSlideRight = Tween(begin: Offset(-1, 0), end: Offset.zero) 145 | .animate(_slideAnimationController); 146 | 147 | _listSlideLeft = Tween(begin: Offset(-1, 0), end: Offset(0, 0)) 148 | .animate(_slideAnimationController); 149 | 150 | _newListSlideLeft = Tween(begin: Offset(1, 0), end: Offset.zero) 151 | .animate(_slideAnimationController); 152 | 153 | _fadeOut = Tween(begin: 0.0, end: 1.0) 154 | .animate(_listFadeAnimationController); 155 | 156 | _fadeIn = Tween(begin: 1.0, end: 0.0) 157 | .animate(_newListFadeAnimationController); 158 | 159 | _positiveScale = Tween(begin: 0.0, end: 1.0) 160 | .animate(_listScaleAnimationController); 161 | 162 | __negativeScale = Tween(begin: 1.0, end: 0.0) 163 | .animate(_newListScaleAnimationController); 164 | 165 | _listPositionRight = _listSlideRight; 166 | _listPositionLeft = _listSlideLeft; 167 | _listFadeValue = _fadeOut; 168 | _listScaleValue = _positiveScale; 169 | } 170 | 171 | @override 172 | Widget build(BuildContext context) { 173 | return SizedBox( 174 | height: 520, 175 | width: MediaQuery.of(context).size.width, 176 | child: (widget.listType == 'list') 177 | ? AnimatedList( 178 | key: _listkey, 179 | initialItemCount: widget.itemList.length, 180 | itemBuilder: (context, index, animation) { 181 | return buildListItem( 182 | widget.itemList[widget.itemIdList[index]], index); 183 | }, 184 | ) 185 | : GridView.builder( 186 | key: _listkey, 187 | itemCount: widget.itemList.length, 188 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( 189 | crossAxisCount: widget.gridCrossAxisCount), 190 | itemBuilder: (BuildContext context, int index) { 191 | return buildListItem( 192 | widget.itemList[widget.itemIdList[index]], index); 193 | }, 194 | ), 195 | ); 196 | } 197 | 198 | Widget buildListItem(Widget item, int index) { 199 | switch (widget.animationType) { 200 | // Widget for the vertically flipping animation 201 | case 'flipVertically': 202 | { 203 | return AnimatedBuilder( 204 | animation: _flipX, 205 | builder: (BuildContext context, Widget? child) { 206 | return Transform( 207 | transform: Matrix4.identity() 208 | ..setEntry(3, 2, 0.0002) 209 | ..rotateX(pi * _flipX.value), 210 | alignment: Alignment.center, 211 | child: Container( 212 | child: item, 213 | ), 214 | ); 215 | }, 216 | ); 217 | } 218 | 219 | // Widget for the horizontally flipping animation 220 | case 'flipHorizontally': 221 | { 222 | return AnimatedBuilder( 223 | animation: _flipY, 224 | builder: (BuildContext context, Widget? child) { 225 | return Transform( 226 | transform: Matrix4.identity() 227 | ..setEntry(3, 2, 0.00015) 228 | ..rotateY(pi * _flipY.value), 229 | alignment: Alignment.center, 230 | child: Container( 231 | child: item, 232 | ), 233 | ); 234 | }, 235 | ); 236 | } 237 | 238 | // Widget for the reverse vertically flipping animation 239 | case 'reverseFlipVertically': 240 | { 241 | return AnimatedBuilder( 242 | animation: _flipX, 243 | builder: (BuildContext context, Widget? child) { 244 | return Transform( 245 | transform: Matrix4.identity() 246 | ..setEntry(3, 2, 0.0002) 247 | ..rotateX(-1 * pi * _flipX.value), 248 | alignment: Alignment.center, 249 | child: Container( 250 | child: item, 251 | ), 252 | ); 253 | }, 254 | ); 255 | } 256 | 257 | // Widget for the reverse horizontally flipping animation 258 | case 'reverseFlipHorizontally': 259 | { 260 | return AnimatedBuilder( 261 | animation: _flipY, 262 | builder: (BuildContext context, Widget? child) { 263 | return Transform( 264 | transform: Matrix4.identity() 265 | ..setEntry(3, 2, 0.0002) 266 | ..rotateY(-1 * pi * _flipY.value), 267 | alignment: Alignment.center, 268 | child: Container( 269 | child: item, 270 | ), 271 | ); 272 | }, 273 | ); 274 | } 275 | 276 | // Widget for the card right slide animation 277 | case 'slideRight': 278 | { 279 | return SlideTransition( 280 | position: _listPositionRight!, 281 | child: Container( 282 | child: item, 283 | ), 284 | ); 285 | } 286 | 287 | // Widget for the card left slide animation 288 | case 'slideLeft': 289 | { 290 | return SlideTransition( 291 | position: _listPositionLeft!, 292 | child: Container( 293 | child: item, 294 | ), 295 | ); 296 | } 297 | 298 | // Widget for the fading card animation 299 | case 'fade': 300 | { 301 | return FadeTransition( 302 | opacity: _listFadeValue!, 303 | child: Container( 304 | child: item, 305 | ), 306 | ); 307 | } 308 | 309 | // Widget for the card scaling animation 310 | case 'scale': 311 | { 312 | return ScaleTransition( 313 | scale: _listScaleValue!, 314 | alignment: Alignment.center, 315 | child: Container( 316 | child: item, 317 | ), 318 | ); 319 | } 320 | 321 | default: 322 | { 323 | return Container( 324 | child: ListTile( 325 | title: Text("Hello"), 326 | ), 327 | ); 328 | } 329 | } 330 | } 331 | 332 | void sortList(bool ascendant) async { 333 | switch (widget.animationType) { 334 | // Implementation of sorting animation for vertically flipping animation 335 | case 'flipVertically': 336 | { 337 | await _flipVerticallyAnimationController.reverse(); 338 | 339 | if (ascendant) { 340 | setState(() { 341 | widget.itemIdList.sort(); 342 | }); 343 | } else { 344 | setState(() { 345 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 346 | }); 347 | } 348 | 349 | await _flipVerticallyAnimationController.forward(); 350 | } 351 | break; 352 | 353 | // Implementation of sorting animation for horizontally flipping animation 354 | case 'flipHorizontally': 355 | { 356 | await _flipHorizontallyAnimationController.reverse(); 357 | 358 | if (ascendant) { 359 | setState(() { 360 | widget.itemIdList.sort(); 361 | }); 362 | } else { 363 | setState(() { 364 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 365 | }); 366 | } 367 | 368 | await _flipHorizontallyAnimationController.forward(); 369 | } 370 | break; 371 | 372 | // Implementation of sorting animation for reverse vertically flipping animation 373 | case 'reverseFlipVertically': 374 | { 375 | await _flipVerticallyAnimationController.reverse(); 376 | 377 | if (ascendant) { 378 | setState(() { 379 | widget.itemIdList.sort(); 380 | }); 381 | } else { 382 | setState(() { 383 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 384 | }); 385 | } 386 | 387 | await _flipVerticallyAnimationController.forward(); 388 | } 389 | break; 390 | 391 | // Implementation of sorting animation for reverse horizontally flipping animation 392 | case 'reverseFlipHorizontally': 393 | { 394 | await _flipHorizontallyAnimationController.reverse(); 395 | 396 | if (ascendant) { 397 | setState(() { 398 | widget.itemIdList.sort(); 399 | }); 400 | } else { 401 | setState(() { 402 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 403 | }); 404 | } 405 | 406 | await _flipHorizontallyAnimationController.forward(); 407 | } 408 | break; 409 | 410 | // Implementation of sorting animation for card right slide animation 411 | case 'slideRight': 412 | { 413 | await _slideAnimationController.reverse(); 414 | 415 | if (ascendant) { 416 | setState(() { 417 | widget.itemIdList.sort(); 418 | _listPositionRight = _newListSlideRight; 419 | }); 420 | } else { 421 | setState(() { 422 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 423 | _listPositionRight = _newListSlideRight; 424 | }); 425 | } 426 | 427 | await _slideAnimationController.forward(); 428 | } 429 | break; 430 | 431 | // Implementation of sorting animation for card left slide animation 432 | case 'slideLeft': 433 | { 434 | await _slideAnimationController.reverse(); 435 | 436 | if (ascendant) { 437 | setState(() { 438 | widget.itemIdList.sort(); 439 | _listPositionLeft = _newListSlideLeft; 440 | }); 441 | } else { 442 | setState(() { 443 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 444 | _listPositionLeft = _newListSlideLeft; 445 | }); 446 | } 447 | 448 | await _slideAnimationController.forward(); 449 | } 450 | break; 451 | 452 | // Implementation of sorting animation for card fading animation 453 | case 'fade': 454 | { 455 | await _listFadeAnimationController.reverse(); 456 | 457 | if (ascendant) { 458 | setState(() { 459 | widget.itemIdList.sort(); 460 | _listFadeValue = _fadeIn; 461 | }); 462 | } else { 463 | setState(() { 464 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 465 | _listFadeValue = _fadeIn; 466 | }); 467 | } 468 | 469 | await _newListFadeAnimationController.reverse(); 470 | } 471 | break; 472 | 473 | // Implementation of sorting animation for card scaling animation 474 | case 'scale': 475 | { 476 | await _listScaleAnimationController.reverse(); 477 | 478 | if (ascendant) { 479 | setState(() { 480 | widget.itemIdList.sort(); 481 | _listScaleValue = __negativeScale; 482 | }); 483 | } else { 484 | setState(() { 485 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 486 | _listScaleValue = __negativeScale; 487 | }); 488 | } 489 | 490 | await _newListScaleAnimationController.reverse(); 491 | } 492 | break; 493 | 494 | default: 495 | { 496 | if (ascendant) { 497 | setState(() { 498 | widget.itemIdList.sort(); 499 | }); 500 | } else { 501 | setState(() { 502 | widget.itemIdList.sort((a, b) => b.compareTo(a)); 503 | }); 504 | } 505 | } 506 | } 507 | } 508 | } 509 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.5.0" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.1.0" 18 | characters: 19 | dependency: transitive 20 | description: 21 | name: characters 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.1.0" 25 | charcode: 26 | dependency: transitive 27 | description: 28 | name: charcode 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.2.0" 32 | clock: 33 | dependency: transitive 34 | description: 35 | name: clock 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.0" 39 | collection: 40 | dependency: transitive 41 | description: 42 | name: collection 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.15.0" 46 | fake_async: 47 | dependency: transitive 48 | description: 49 | name: fake_async 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.2.0" 53 | flutter: 54 | dependency: "direct main" 55 | description: flutter 56 | source: sdk 57 | version: "0.0.0" 58 | flutter_test: 59 | dependency: "direct dev" 60 | description: flutter 61 | source: sdk 62 | version: "0.0.0" 63 | matcher: 64 | dependency: transitive 65 | description: 66 | name: matcher 67 | url: "https://pub.dartlang.org" 68 | source: hosted 69 | version: "0.12.10" 70 | meta: 71 | dependency: transitive 72 | description: 73 | name: meta 74 | url: "https://pub.dartlang.org" 75 | source: hosted 76 | version: "1.3.0" 77 | path: 78 | dependency: transitive 79 | description: 80 | name: path 81 | url: "https://pub.dartlang.org" 82 | source: hosted 83 | version: "1.8.0" 84 | sky_engine: 85 | dependency: transitive 86 | description: flutter 87 | source: sdk 88 | version: "0.0.99" 89 | source_span: 90 | dependency: transitive 91 | description: 92 | name: source_span 93 | url: "https://pub.dartlang.org" 94 | source: hosted 95 | version: "1.8.1" 96 | stack_trace: 97 | dependency: transitive 98 | description: 99 | name: stack_trace 100 | url: "https://pub.dartlang.org" 101 | source: hosted 102 | version: "1.10.0" 103 | stream_channel: 104 | dependency: transitive 105 | description: 106 | name: stream_channel 107 | url: "https://pub.dartlang.org" 108 | source: hosted 109 | version: "2.1.0" 110 | string_scanner: 111 | dependency: transitive 112 | description: 113 | name: string_scanner 114 | url: "https://pub.dartlang.org" 115 | source: hosted 116 | version: "1.1.0" 117 | term_glyph: 118 | dependency: transitive 119 | description: 120 | name: term_glyph 121 | url: "https://pub.dartlang.org" 122 | source: hosted 123 | version: "1.2.0" 124 | test_api: 125 | dependency: transitive 126 | description: 127 | name: test_api 128 | url: "https://pub.dartlang.org" 129 | source: hosted 130 | version: "0.3.0" 131 | typed_data: 132 | dependency: transitive 133 | description: 134 | name: typed_data 135 | url: "https://pub.dartlang.org" 136 | source: hosted 137 | version: "1.3.0" 138 | vector_math: 139 | dependency: transitive 140 | description: 141 | name: vector_math 142 | url: "https://pub.dartlang.org" 143 | source: hosted 144 | version: "2.1.0" 145 | sdks: 146 | dart: ">=2.12.0 <3.0.0" 147 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: smooth_sort 2 | description: A Flutter package for adding wonderful and custom sorting animations. 3 | version: 2.0.1 4 | homepage: https://github.com/mdg-soc-19/smooth-sort 5 | 6 | environment: 7 | sdk: '>=2.12.0 <3.0.0' 8 | 9 | dependencies: 10 | flutter: 11 | sdk: flutter 12 | 13 | dev_dependencies: 14 | flutter_test: 15 | sdk: flutter 16 | 17 | # For information on the generic Dart part of this file, see the 18 | # following page: https://dart.dev/tools/pub/pubspec 19 | 20 | # The following section is specific to Flutter. 21 | flutter: 22 | 23 | # To add assets to your package, add an assets section, like this: 24 | # assets: 25 | # - images/a_dot_burr.jpeg 26 | # - images/a_dot_ham.jpeg 27 | # 28 | # For details regarding assets in packages, see 29 | # https://flutter.dev/assets-and-images/#from-packages 30 | # 31 | # An image asset can refer to one or more resolution-specific "variants", see 32 | # https://flutter.dev/assets-and-images/#resolution-aware. 33 | 34 | # To add custom fonts to your package, add a fonts section here, 35 | # in this "flutter" section. Each entry in this list should have a 36 | # "family" key with the font family name, and a "fonts" key with a 37 | # list giving the asset and other descriptors for the font. For 38 | # example: 39 | # fonts: 40 | # - family: Schyler 41 | # fonts: 42 | # - asset: fonts/Schyler-Regular.ttf 43 | # - asset: fonts/Schyler-Italic.ttf 44 | # style: italic 45 | # - family: Trajan Pro 46 | # fonts: 47 | # - asset: fonts/TrajanPro.ttf 48 | # - asset: fonts/TrajanPro_Bold.ttf 49 | # weight: 700 50 | # 51 | # For details regarding fonts in packages, see 52 | # https://flutter.dev/custom-fonts/#from-packages 53 | -------------------------------------------------------------------------------- /smoothSortGifs/fade.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/fade.gif -------------------------------------------------------------------------------- /smoothSortGifs/flipHorizontally.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/flipHorizontally.gif -------------------------------------------------------------------------------- /smoothSortGifs/flipVertically.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/flipVertically.gif -------------------------------------------------------------------------------- /smoothSortGifs/reverseFlipHorizontally.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/reverseFlipHorizontally.gif -------------------------------------------------------------------------------- /smoothSortGifs/reverseFlipVertically.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/reverseFlipVertically.gif -------------------------------------------------------------------------------- /smoothSortGifs/scale.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/scale.gif -------------------------------------------------------------------------------- /smoothSortGifs/slideLeft.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/slideLeft.gif -------------------------------------------------------------------------------- /smoothSortGifs/slideRight.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/slideRight.gif -------------------------------------------------------------------------------- /smoothSortGifs/smooth_sort_cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mdg-soc-19/smooth-sort/45262463d94dacda5875137039e834c651a0f86d/smoothSortGifs/smooth_sort_cover.png -------------------------------------------------------------------------------- /test/smooth_sort_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | 3 | import '../example/lib/main.dart'; 4 | void main() { 5 | testWidgets('smoke test for the app', (WidgetTester tester) async { 6 | await tester.pumpWidget(MyApp()); 7 | expect(find.text("This item represents A."), findsOneWidget); 8 | }); 9 | 10 | testWidgets('full dragging', (WidgetTester tester) async { 11 | await tester.pumpWidget(MyApp()); 12 | await tester.drag(find.byType(MyApp), Offset(0.0, 400.0)); 13 | tester.pumpAndSettle(); 14 | }); 15 | 16 | testWidgets('incomplete dragging', (WidgetTester tester) async { 17 | await tester.pumpWidget(MyApp()); 18 | await tester.drag(find.byType(MyApp), Offset(0.0, 100.0)); 19 | tester.pumpAndSettle(); 20 | }); 21 | } 22 | --------------------------------------------------------------------------------