diff --git a/.gitignore b/.gitignore
index 9f87252..085f64f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,14 @@
+# Custom
+android/
+ios/
+windows/
+macos/
+linux/
+web/
+
+flutter_sdk
+.vscode
+
# Miscellaneous
*.class
*.log
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index ec289bc..0000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- // Use IntelliSense to learn about possible attributes.
- // Hover to view descriptions of existing attributes.
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
- "version": "0.2.0",
- "configurations": [
- {
- "name": "Flutter",
- "request": "launch",
- "type": "dart",
- // "flutterMode": "profile"
- }
- ]
-}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1fc312e..30704fa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## [0.6.0-nullsafety]
+Now with null safety :) - Thanks Ali1Ammar!
+
+## [0.5.5]
+Add optional `createParticlePath` function to pass in a custom `Path` for the conveti (for example a Star path, instead of the default Rectangle path). Example updated. Thanks Artur-Wisniewski.
+Fix: Animation stop event not firing. Thanks WieFel.
+
## [0.5.4+1]
Fix: Call play on the confetti controller from `initState`.
diff --git a/README.md b/README.md
index acaa5f2..a79c98d 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,27 @@
-Blast some confetti all over the screen and celebrate user achievements!
+Blast some confetti all over the screen and celebrate user achievements!
+
+
## Demo
-[WEB Demo](https://funwithflutter.github.io/confetti/#/)
-A video walkthrough is available [here](https://www.youtube.com/watch?v=jvhw3cfj2rk).
+Video showing the Confetti in Action: https://youtu.be/dGMVyUY4-6M
+
+Live [WEB Demo](https://funwithflutter.github.io/confetti/#/)
+
+An __old__ video walkthrough is available [here](https://www.youtube.com/watch?v=jvhw3cfj2rk).
## Getting Started
To use this plugin, add `confetti` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/).
-See the example to get started quickly.
+See the example to get started quickly. To generate the platform folders run:
+
+```dart
+flutter create .
+```
+
+in the example folder.
To begin you need to instantiate a `ConfettiController` variable and pass in a `Duration` argument. The `ConfettiController` can be instantiated in the `initState` method and disposed in the `dispose` method.
@@ -31,6 +42,36 @@ Other attributes that can be set are:
* `gravity` -> change the speed at which the confetti falls. A value between 0 and 1. The higher the value the faster it will fall. Default is set to `0.1`
* `particleDrag` -> configure the drag force to apply to the confetti. A value between 0 and 1. A value of 1 will be no drag at all, while 0.1, for example, will be a lot of drag. Default is set to `0.05`
* `canvas` -> set the size of the area where the confetti will be shown, by default this is set to full screen size.
+* `createParticlePath` -> An optional function that retuns a custom `Path` to generate unique particles. Default returns a rectangular path.
+
+
+### Example of a custom `createParticlePath`
+
+```dart
+Path drawStar(Size size) {
+ // Method to convert degree to radians
+ double degToRad(double deg) => deg * (pi / 180.0);
+
+ const numberOfPoints = 5;
+ final halfWidth = size.width / 2;
+ final externalRadius = halfWidth;
+ final internalRadius = halfWidth / 2.5;
+ final degreesPerStep = degToRad(360 / numberOfPoints);
+ final halfDegreesPerStep = degreesPerStep / 2;
+ final path = Path();
+ final fullAngle = degToRad(360);
+ path.moveTo(size.width, halfWidth);
+
+ for (double step = 0; step < fullAngle; step += degreesPerStep) {
+ path.lineTo(halfWidth + externalRadius * cos(step),
+ halfWidth + externalRadius * sin(step));
+ path.lineTo(halfWidth + internalRadius * cos(step + halfDegreesPerStep),
+ halfWidth + internalRadius * sin(step + halfDegreesPerStep));
+ }
+ path.close();
+ return path;
+ }
+```
Enjoy the confetti.
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 27c885b..2b97a4d 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,192 +1,10 @@
-# Specify analysis options.
-#
-# Until there are meta linter rules, each desired lint must be explicitly enabled.
-# See: https://github.com/dart-lang/linter/issues/288
-#
-# For a list of lints, see: http://dart-lang.github.io/linter/lints/
-# See the configuration guide for more
-# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
-#
-# There are other similar analysis options files in the flutter repos,
-# which should be kept in sync with this file:
-#
-# - analysis_options.yaml (this file)
-# - packages/flutter/lib/analysis_options_user.yaml
-# - https://github.com/flutter/plugins/blob/master/analysis_options.yaml
-# - https://github.com/flutter/engine/blob/master/analysis_options.yaml
-#
-# This file contains the analysis options used by Flutter tools, such as IntelliJ,
-# Android Studio, and the `flutter analyze` command.
+include: package:very_good_analysis/analysis_options.yaml
analyzer:
strong-mode:
- implicit-dynamic: true
- errors:
- # treat missing required parameters as a warning (not a hint)
- missing_required_param: warning
- # treat missing returns as a warning (not a hint)
- missing_return: warning
- # allow having TODOs in the code
- todo: ignore
- # Ignore analyzer hints for updating pubspecs when using Future or
- # Stream and not importing dart:async
- # Please see https://github.com/flutter/flutter/pull/24528 for details.
- sdk_version_async_exported_from_core: ignore
- exclude:
- - "bin/cache/**"
- # the following two are relative to the stocks example and the flutter package respectively
- # see https://github.com/dart-lang/sdk/issues/28463
- - "lib/i18n/stock_messages_*.dart"
- - "lib/src/http/**"
+ implicit-casts: false
+ implicit-dynamic: false
linter:
rules:
- # these rules are documented on and in the same order as
- # the Dart Lint rules page to make maintenance easier
- # https://github.com/dart-lang/linter/blob/master/example/all.yaml
- - always_declare_return_types
- - always_put_control_body_on_new_line
- # - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
- - always_require_non_null_named_parameters
- # - always_specify_types
- - annotate_overrides
- # - avoid_annotating_with_dynamic # conflicts with always_specify_types
- - avoid_as
- - avoid_bool_literals_in_conditional_expressions
- # - avoid_catches_without_on_clauses # we do this commonly
- # - avoid_catching_errors # we do this commonly
- - avoid_classes_with_only_static_members
- # - avoid_double_and_int_checks # only useful when targeting JS runtime
- - avoid_empty_else
- - avoid_field_initializers_in_const_classes
- - avoid_function_literals_in_foreach_calls
- # - avoid_implementing_value_types # not yet tested
- - avoid_init_to_null
- # - avoid_js_rounded_ints # only useful when targeting JS runtime
- - avoid_null_checks_in_equality_operators
- # - avoid_positional_boolean_parameters # not yet tested
- # - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
- - avoid_relative_lib_imports
- - avoid_renaming_method_parameters
- - avoid_return_types_on_setters
- # - avoid_returning_null # there are plenty of valid reasons to return null
- # - avoid_returning_null_for_future # not yet tested
- - avoid_returning_null_for_void
- # - avoid_returning_this # there are plenty of valid reasons to return this
- # - avoid_setters_without_getters # not yet tested
- # - avoid_shadowing_type_parameters # not yet tested
- # - avoid_single_cascade_in_expression_statements # not yet tested
- - avoid_slow_async_io
- - avoid_types_as_parameter_names
- # - avoid_types_on_closure_parameters # conflicts with always_specify_types
- - avoid_unused_constructor_parameters
- - avoid_void_async
- - await_only_futures
- - camel_case_types
- - cancel_subscriptions
- # - cascade_invocations # not yet tested
- # - close_sinks # not reliable enough
- # - comment_references # blocked on https://github.com/flutter/flutter/issues/20765
- # - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204
- - control_flow_in_finally
- # - curly_braces_in_flow_control_structures # not yet tested
- # - diagnostic_describe_all_properties # not yet tested
- - directives_ordering
- - empty_catches
- - empty_constructor_bodies
- - empty_statements
- # - file_names # not yet tested
- - flutter_style_todos
- - hash_and_equals
- - implementation_imports
- # - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811
- - iterable_contains_unrelated_type
- # - join_return_with_assignment # not yet tested
- - library_names
- - library_prefixes
- # - lines_longer_than_80_chars # not yet tested
- - list_remove_unrelated_type
- # - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181
- - no_adjacent_strings_in_list
- - no_duplicate_case_values
- - non_constant_identifier_names
- # - null_closures # not yet tested
- # - omit_local_variable_types # opposite of always_specify_types
- # - one_member_abstracts # too many false positives
- # - only_throw_errors # https://github.com/flutter/flutter/issues/5792
- - overridden_fields
- - package_api_docs
- - package_names
- - package_prefixed_library_names
- # - parameter_assignments # we do this commonly
- - prefer_adjacent_string_concatenation
- - prefer_asserts_in_initializer_lists
- # - prefer_asserts_with_message # not yet tested
- - prefer_collection_literals
- - prefer_conditional_assignment
- - prefer_const_constructors
- - prefer_const_constructors_in_immutables
- - prefer_const_declarations
- - prefer_const_literals_to_create_immutables
- # - prefer_constructors_over_static_methods # not yet tested
- - prefer_contains
- # - prefer_double_quotes # opposite of prefer_single_quotes
- - prefer_equal_for_default_values
- # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
- - prefer_final_fields
- # - prefer_final_in_for_each # not yet tested
- - prefer_final_locals
- # - prefer_for_elements_to_map_fromIterable # not yet tested
- - prefer_foreach
- # - prefer_function_declarations_over_variables # not yet tested
- - prefer_generic_function_type_aliases
- # - prefer_if_elements_to_conditional_expressions # not yet tested
- - prefer_if_null_operators
- - prefer_initializing_formals
- - prefer_inlined_adds
- # - prefer_int_literals # not yet tested
- # - prefer_interpolation_to_compose_strings # not yet tested
- - prefer_is_empty
- - prefer_is_not_empty
- - prefer_iterable_whereType
- # - prefer_mixin # https://github.com/dart-lang/language/issues/32
- # - prefer_null_aware_operators # disable until NNBD, see https://github.com/flutter/flutter/pull/32711#issuecomment-492930932
- - prefer_single_quotes
- - prefer_spread_collections
- - prefer_typing_uninitialized_variables
- - prefer_void_to_null
- # - provide_deprecation_message # not yet tested
- # - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml
- - recursive_getters
- - slash_for_doc_comments
- # - sort_child_properties_last # not yet tested
- - sort_constructors_first
- - sort_pub_dependencies
- - sort_unnamed_constructors_first
- - test_types_in_equals
- - throw_in_finally
- # - type_annotate_public_apis # subset of always_specify_types
- - type_init_formals
- # - unawaited_futures # too many false positives
- # - unnecessary_await_in_return # not yet tested
- - unnecessary_brace_in_string_interps
- - unnecessary_const
- - unnecessary_getters_setters
- # - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498
- - unnecessary_new
- - unnecessary_null_aware_assignments
- - unnecessary_null_in_if_null_operators
- - unnecessary_overrides
- - unnecessary_parenthesis
- - unnecessary_statements
- - unnecessary_this
- - unrelated_type_equality_checks
- # - unsafe_html # not yet tested
- - use_full_hex_values_for_flutter_colors
- # - use_function_type_syntax_for_parameters # not yet tested
- - use_rethrow_when_possible
- # - use_setters_to_change_properties # not yet tested
- # - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182
- # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
- - valid_regexps
- # - void_checks # not yet tested
\ No newline at end of file
+ public_member_api_docs: false
\ No newline at end of file
diff --git a/display/Confetti Screenshot.png b/display/Confetti Screenshot.png
new file mode 100644
index 0000000..bc659d0
Binary files /dev/null and b/display/Confetti Screenshot.png differ
diff --git a/example/.gitignore b/example/.gitignore
index 437cb45..0ef9bb3 100644
--- a/example/.gitignore
+++ b/example/.gitignore
@@ -1,3 +1,13 @@
+# Custom
+android/
+ios/
+windows/
+macos/
+linux/
+web/
+
+fvm_config.json
+
# Miscellaneous
*.class
*.log
diff --git a/example/android/.gitignore b/example/android/.gitignore
deleted file mode 100644
index bc2100d..0000000
--- a/example/android/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-gradle-wrapper.jar
-/.gradle
-/captures/
-/gradlew
-/gradlew.bat
-/local.properties
-GeneratedPluginRegistrant.java
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
deleted file mode 100644
index 0f6a5e5..0000000
--- a/example/android/app/build.gradle
+++ /dev/null
@@ -1,67 +0,0 @@
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
- localPropertiesFile.withReader('UTF-8') { reader ->
- localProperties.load(reader)
- }
-}
-
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
-def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
-if (flutterVersionCode == null) {
- flutterVersionCode = '1'
-}
-
-def flutterVersionName = localProperties.getProperty('flutter.versionName')
-if (flutterVersionName == null) {
- flutterVersionName = '1.0'
-}
-
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
-android {
- compileSdkVersion 28
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- }
-
- lintOptions {
- disable 'InvalidPackage'
- }
-
- defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "com.example.example"
- minSdkVersion 16
- targetSdkVersion 28
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- }
-
- buildTypes {
- release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig signingConfigs.debug
- }
- }
-}
-
-flutter {
- source '../..'
-}
-
-dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- testImplementation 'junit:junit:4.12'
- androidTestImplementation 'androidx.test:runner:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
-}
diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml
deleted file mode 100644
index c208884..0000000
--- a/example/android/app/src/debug/AndroidManifest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 7e6679c..0000000
--- a/example/android/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt
deleted file mode 100644
index 777dcae..0000000
--- a/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.example.example
-
-import android.os.Bundle
-import io.flutter.app.FlutterActivity
-import io.flutter.plugins.GeneratedPluginRegistrant
-
-class MainActivity: FlutterActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- GeneratedPluginRegistrant.registerWith(this)
- }
-}
diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/example/android/app/src/main/res/drawable/launch_background.xml
deleted file mode 100644
index 304732f..0000000
--- a/example/android/app/src/main/res/drawable/launch_background.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index db77bb4..0000000
Binary files a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 17987b7..0000000
Binary files a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 09d4391..0000000
Binary files a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index d5f1c8d..0000000
Binary files a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 4d6372e..0000000
Binary files a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml
deleted file mode 100644
index 00fa441..0000000
--- a/example/android/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml
deleted file mode 100644
index c208884..0000000
--- a/example/android/app/src/profile/AndroidManifest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/example/android/build.gradle b/example/android/build.gradle
deleted file mode 100644
index 3100ad2..0000000
--- a/example/android/build.gradle
+++ /dev/null
@@ -1,31 +0,0 @@
-buildscript {
- ext.kotlin_version = '1.3.50'
- repositories {
- google()
- jcenter()
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:3.5.0'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
-}
-
-allprojects {
- repositories {
- google()
- jcenter()
- }
-}
-
-rootProject.buildDir = '../build'
-subprojects {
- project.buildDir = "${rootProject.buildDir}/${project.name}"
-}
-subprojects {
- project.evaluationDependsOn(':app')
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
diff --git a/example/android/gradle.properties b/example/android/gradle.properties
deleted file mode 100644
index 38c8d45..0000000
--- a/example/android/gradle.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-org.gradle.jvmargs=-Xmx1536M
-android.enableR8=true
-android.useAndroidX=true
-android.enableJetifier=true
diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 296b146..0000000
--- a/example/android/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Jun 23 08:50:38 CEST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
diff --git a/example/android/settings.gradle b/example/android/settings.gradle
deleted file mode 100644
index 5a2f14f..0000000
--- a/example/android/settings.gradle
+++ /dev/null
@@ -1,15 +0,0 @@
-include ':app'
-
-def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
-
-def plugins = new Properties()
-def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
-if (pluginsFile.exists()) {
- pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
-}
-
-plugins.each { name, path ->
- def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
- include ":$name"
- project(":$name").projectDir = pluginDirectory
-}
diff --git a/example/ios/.gitignore b/example/ios/.gitignore
deleted file mode 100644
index e96ef60..0000000
--- a/example/ios/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-*.mode1v3
-*.mode2v3
-*.moved-aside
-*.pbxuser
-*.perspectivev3
-**/*sync/
-.sconsign.dblite
-.tags*
-**/.vagrant/
-**/DerivedData/
-Icon?
-**/Pods/
-**/.symlinks/
-profile
-xcuserdata
-**/.generated/
-Flutter/App.framework
-Flutter/Flutter.framework
-Flutter/Flutter.podspec
-Flutter/Generated.xcconfig
-Flutter/app.flx
-Flutter/app.zip
-Flutter/flutter_assets/
-Flutter/flutter_export_environment.sh
-ServiceDefinitions.json
-Runner/GeneratedPluginRegistrant.*
-
-# Exceptions to above rules.
-!default.mode1v3
-!default.mode2v3
-!default.pbxuser
-!default.perspectivev3
diff --git a/example/ios/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id
deleted file mode 100644
index ae98864..0000000
--- a/example/ios/Flutter/.last_build_id
+++ /dev/null
@@ -1 +0,0 @@
-9f0198590b1bdf8c543f660b2d54b273
\ No newline at end of file
diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist
deleted file mode 100644
index 6b4c0f7..0000000
--- a/example/ios/Flutter/AppFrameworkInfo.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- App
- CFBundleIdentifier
- io.flutter.flutter.app
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- App
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 1.0
- CFBundleSignature
- ????
- CFBundleVersion
- 1.0
- MinimumOSVersion
- 8.0
-
-
diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig
deleted file mode 100644
index 592ceee..0000000
--- a/example/ios/Flutter/Debug.xcconfig
+++ /dev/null
@@ -1 +0,0 @@
-#include "Generated.xcconfig"
diff --git a/example/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig
deleted file mode 100644
index 592ceee..0000000
--- a/example/ios/Flutter/Release.xcconfig
+++ /dev/null
@@ -1 +0,0 @@
-#include "Generated.xcconfig"
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
deleted file mode 100644
index 252c753..0000000
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,503 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 46;
- objects = {
-
-/* Begin PBXBuildFile section */
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
- 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
- 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
- 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
- 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
- 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- );
- name = "Embed Frameworks";
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
- 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
- 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
- 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
- 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
- 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
- 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
- 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
- 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 97C146EB1CF9000F007C117D /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 9740EEB11CF90186004384FC /* Flutter */ = {
- isa = PBXGroup;
- children = (
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
- 9740EEB21CF90195004384FC /* Debug.xcconfig */,
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
- 9740EEB31CF90195004384FC /* Generated.xcconfig */,
- );
- name = Flutter;
- sourceTree = "";
- };
- 97C146E51CF9000F007C117D = {
- isa = PBXGroup;
- children = (
- 9740EEB11CF90186004384FC /* Flutter */,
- 97C146F01CF9000F007C117D /* Runner */,
- 97C146EF1CF9000F007C117D /* Products */,
- );
- sourceTree = "";
- };
- 97C146EF1CF9000F007C117D /* Products */ = {
- isa = PBXGroup;
- children = (
- 97C146EE1CF9000F007C117D /* Runner.app */,
- );
- name = Products;
- sourceTree = "";
- };
- 97C146F01CF9000F007C117D /* Runner */ = {
- isa = PBXGroup;
- children = (
- 97C146FA1CF9000F007C117D /* Main.storyboard */,
- 97C146FD1CF9000F007C117D /* Assets.xcassets */,
- 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
- 97C147021CF9000F007C117D /* Info.plist */,
- 97C146F11CF9000F007C117D /* Supporting Files */,
- 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
- 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
- 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
- 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
- );
- path = Runner;
- sourceTree = "";
- };
- 97C146F11CF9000F007C117D /* Supporting Files */ = {
- isa = PBXGroup;
- children = (
- );
- name = "Supporting Files";
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 97C146ED1CF9000F007C117D /* Runner */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
- buildPhases = (
- 9740EEB61CF901F6004384FC /* Run Script */,
- 97C146EA1CF9000F007C117D /* Sources */,
- 97C146EB1CF9000F007C117D /* Frameworks */,
- 97C146EC1CF9000F007C117D /* Resources */,
- 9705A1C41CF9048500538489 /* Embed Frameworks */,
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = Runner;
- productName = Runner;
- productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 97C146E61CF9000F007C117D /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastUpgradeCheck = 1020;
- ORGANIZATIONNAME = "The Chromium Authors";
- TargetAttributes = {
- 97C146ED1CF9000F007C117D = {
- CreatedOnToolsVersion = 7.3.1;
- LastSwiftMigration = 1100;
- };
- };
- };
- buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
- compatibilityVersion = "Xcode 3.2";
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- );
- mainGroup = 97C146E51CF9000F007C117D;
- productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 97C146ED1CF9000F007C117D /* Runner */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 97C146EC1CF9000F007C117D /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
- 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
- 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
- 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Thin Binary";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
- };
- 9740EEB61CF901F6004384FC /* Run Script */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Run Script";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 97C146EA1CF9000F007C117D /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXVariantGroup section */
- 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 97C146FB1CF9000F007C117D /* Base */,
- );
- name = Main.storyboard;
- sourceTree = "";
- };
- 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 97C147001CF9000F007C117D /* Base */,
- );
- name = LaunchScreen.storyboard;
- sourceTree = "";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- 249021D3217E4FDB00AE95B9 /* Profile */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = iphoneos;
- SUPPORTED_PLATFORMS = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- VALIDATE_PRODUCT = YES;
- };
- name = Profile;
- };
- 249021D4217E4FDB00AE95B9 /* Profile */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Profile;
- };
- 97C147031CF9000F007C117D /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- MTL_ENABLE_DEBUG_INFO = YES;
- ONLY_ACTIVE_ARCH = YES;
- SDKROOT = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Debug;
- };
- 97C147041CF9000F007C117D /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = iphoneos;
- SUPPORTED_PLATFORMS = iphoneos;
- SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
- TARGETED_DEVICE_FAMILY = "1,2";
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- 97C147061CF9000F007C117D /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Debug;
- };
- 97C147071CF9000F007C117D /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.example.example;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 97C147031CF9000F007C117D /* Debug */,
- 97C147041CF9000F007C117D /* Release */,
- 249021D3217E4FDB00AE95B9 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 97C147061CF9000F007C117D /* Debug */,
- 97C147071CF9000F007C117D /* Release */,
- 249021D4217E4FDB00AE95B9 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 97C146E61CF9000F007C117D /* Project object */;
-}
diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 1d526a1..0000000
--- a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d9810..0000000
--- a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644
index f9b0d7c..0000000
--- a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- PreviewsEnabled
-
-
-
diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
deleted file mode 100644
index a28140c..0000000
--- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 1d526a1..0000000
--- a/example/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d9810..0000000
--- a/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644
index f9b0d7c..0000000
--- a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- PreviewsEnabled
-
-
-
diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift
deleted file mode 100644
index 70693e4..0000000
--- a/example/ios/Runner/AppDelegate.swift
+++ /dev/null
@@ -1,13 +0,0 @@
-import UIKit
-import Flutter
-
-@UIApplicationMain
-@objc class AppDelegate: FlutterAppDelegate {
- override func application(
- _ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
- ) -> Bool {
- GeneratedPluginRegistrant.register(with: self)
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
- }
-}
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index d36b1fa..0000000
--- a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "images" : [
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "83.5x83.5",
- "idiom" : "ipad",
- "filename" : "Icon-App-83.5x83.5@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "1024x1024",
- "idiom" : "ios-marketing",
- "filename" : "Icon-App-1024x1024@1x.png",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
deleted file mode 100644
index dc9ada4..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
deleted file mode 100644
index 28c6bf0..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
deleted file mode 100644
index 2ccbfd9..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
deleted file mode 100644
index f091b6b..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
deleted file mode 100644
index 4cde121..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
deleted file mode 100644
index d0ef06e..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
deleted file mode 100644
index dcdc230..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
deleted file mode 100644
index 2ccbfd9..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
deleted file mode 100644
index c8f9ed8..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
deleted file mode 100644
index a6d6b86..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
deleted file mode 100644
index a6d6b86..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
deleted file mode 100644
index 75b2d16..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
deleted file mode 100644
index c4df70d..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
deleted file mode 100644
index 6a84f41..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
deleted file mode 100644
index d0e1f58..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
deleted file mode 100644
index 0bedcf2..0000000
--- a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "LaunchImage.png",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@2x.png",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@3x.png",
- "scale" : "3x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
deleted file mode 100644
index 89c2725..0000000
--- a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Launch Screen Assets
-
-You can customize the launch screen with your own desired assets by replacing the image files in this directory.
-
-You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
deleted file mode 100644
index f2e259c..0000000
--- a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard
deleted file mode 100644
index f3c2851..0000000
--- a/example/ios/Runner/Base.lproj/Main.storyboard
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist
deleted file mode 100644
index a060db6..0000000
--- a/example/ios/Runner/Info.plist
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- example
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleSignature
- ????
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- LSRequiresIPhoneOS
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UIViewControllerBasedStatusBarAppearance
-
-
-
diff --git a/example/ios/Runner/Runner-Bridging-Header.h b/example/ios/Runner/Runner-Bridging-Header.h
deleted file mode 100644
index 7335fdf..0000000
--- a/example/ios/Runner/Runner-Bridging-Header.h
+++ /dev/null
@@ -1 +0,0 @@
-#import "GeneratedPluginRegistrant.h"
\ No newline at end of file
diff --git a/example/lib/main.dart b/example/lib/main.dart
index 7f5d480..e83d485 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -6,7 +6,7 @@ import 'package:flutter/material.dart';
void main() => runApp(const ConfettiSample());
class ConfettiSample extends StatelessWidget {
- const ConfettiSample({Key key}) : super(key: key);
+ const ConfettiSample({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
@@ -25,11 +25,11 @@ class MyApp extends StatefulWidget {
}
class _MyAppState extends State {
- ConfettiController _controllerCenter;
- ConfettiController _controllerCenterRight;
- ConfettiController _controllerCenterLeft;
- ConfettiController _controllerTopCenter;
- ConfettiController _controllerBottomCenter;
+ late ConfettiController _controllerCenter;
+ late ConfettiController _controllerCenterRight;
+ late ConfettiController _controllerCenterLeft;
+ late ConfettiController _controllerTopCenter;
+ late ConfettiController _controllerBottomCenter;
@override
void initState() {
@@ -56,131 +56,159 @@ class _MyAppState extends State {
super.dispose();
}
+ /// A custom Path to paint stars.
+ Path drawStar(Size size) {
+ // Method to convert degree to radians
+ double degToRad(double deg) => deg * (pi / 180.0);
+
+ const numberOfPoints = 5;
+ final halfWidth = size.width / 2;
+ final externalRadius = halfWidth;
+ final internalRadius = halfWidth / 2.5;
+ final degreesPerStep = degToRad(360 / numberOfPoints);
+ final halfDegreesPerStep = degreesPerStep / 2;
+ final path = Path();
+ final fullAngle = degToRad(360);
+ path.moveTo(size.width, halfWidth);
+
+ for (double step = 0; step < fullAngle; step += degreesPerStep) {
+ path.lineTo(halfWidth + externalRadius * cos(step),
+ halfWidth + externalRadius * sin(step));
+ path.lineTo(halfWidth + internalRadius * cos(step + halfDegreesPerStep),
+ halfWidth + internalRadius * sin(step + halfDegreesPerStep));
+ }
+ path.close();
+ return path;
+ }
+
@override
Widget build(BuildContext context) {
- return Stack(
- children: [
- //CENTER -- Blast
- Align(
- alignment: Alignment.center,
- child: ConfettiWidget(
- confettiController: _controllerCenter,
- blastDirectionality: BlastDirectionality
- .explosive, // don't specify a direction, blast randomly
- shouldLoop:
- true, // start again as soon as the animation is finished
- colors: const [
- Colors.green,
- Colors.blue,
- Colors.pink,
- Colors.orange,
- Colors.purple
- ], // manually specify the colors to be used
+ return SafeArea(
+ child: Stack(
+ children: [
+ //CENTER -- Blast
+ Align(
+ alignment: Alignment.center,
+ child: ConfettiWidget(
+ confettiController: _controllerCenter,
+ blastDirectionality: BlastDirectionality
+ .explosive, // don't specify a direction, blast randomly
+ shouldLoop:
+ true, // start again as soon as the animation is finished
+ colors: const [
+ Colors.green,
+ Colors.blue,
+ Colors.pink,
+ Colors.orange,
+ Colors.purple
+ ], // manually specify the colors to be used
+ createParticlePath: drawStar, // define a custom shape/path.
+ ),
+ ),
+ Align(
+ alignment: Alignment.center,
+ child: TextButton(
+ onPressed: () {
+ _controllerCenter.play();
+ },
+ child: _display('blast\nstars')),
+ ),
+
+ //CENTER RIGHT -- Emit left
+ Align(
+ alignment: Alignment.centerRight,
+ child: ConfettiWidget(
+ confettiController: _controllerCenterRight,
+ blastDirection: pi, // radial value - LEFT
+ particleDrag: 0.05, // apply drag to the confetti
+ emissionFrequency: 0.05, // how often it should emit
+ numberOfParticles: 20, // number of particles to emit
+ gravity: 0.05, // gravity - or fall speed
+ shouldLoop: false,
+ colors: const [
+ Colors.green,
+ Colors.blue,
+ Colors.pink
+ ], // manually specify the colors to be used
+ ),
+ ),
+ Align(
+ alignment: Alignment.centerRight,
+ child: TextButton(
+ onPressed: () {
+ _controllerCenterRight.play();
+ },
+ child: _display('pump left')),
+ ),
+
+ //CENTER LEFT - Emit right
+ Align(
+ alignment: Alignment.centerLeft,
+ child: ConfettiWidget(
+ confettiController: _controllerCenterLeft,
+ blastDirection: 0, // radial value - RIGHT
+ emissionFrequency: 0.6,
+ minimumSize: const Size(10,
+ 10), // set the minimum potential size for the confetti (width, height)
+ maximumSize: const Size(50,
+ 50), // set the maximum potential size for the confetti (width, height)
+ numberOfParticles: 1,
+ gravity: 0.1,
+ ),
+ ),
+ Align(
+ alignment: Alignment.centerLeft,
+ child: TextButton(
+ onPressed: () {
+ _controllerCenterLeft.play();
+ },
+ child: _display('singles')),
),
- ),
- Align(
- alignment: Alignment.center,
- child: FlatButton(
- onPressed: () {
- _controllerCenter.play();
- },
- child: _display('blast')),
- ),
-
- //CENTER RIGHT -- Emit left
- Align(
- alignment: Alignment.centerRight,
- child: ConfettiWidget(
- confettiController: _controllerCenterRight,
- blastDirection: pi, // radial value - LEFT
- particleDrag: 0.05, // apply drag to the confetti
- emissionFrequency: 0.05, // how often it should emit
- numberOfParticles: 20, // number of particles to emit
- gravity: 0.05, // gravity - or fall speed
- shouldLoop: false,
- colors: const [
- Colors.green,
- Colors.blue,
- Colors.pink
- ], // manually specify the colors to be used
+
+ //TOP CENTER - shoot down
+ Align(
+ alignment: Alignment.topCenter,
+ child: ConfettiWidget(
+ confettiController: _controllerTopCenter,
+ blastDirection: pi / 2,
+ maxBlastForce: 5, // set a lower max blast force
+ minBlastForce: 2, // set a lower min blast force
+ emissionFrequency: 0.05,
+ numberOfParticles: 50, // a lot of particles at once
+ gravity: 1,
+ ),
),
- ),
- Align(
- alignment: Alignment.centerRight,
- child: FlatButton(
- onPressed: () {
- _controllerCenterRight.play();
- },
- child: _display('pump left')),
- ),
-
- //CENTER LEFT - Emit right
- Align(
- alignment: Alignment.centerLeft,
- child: ConfettiWidget(
- confettiController: _controllerCenterLeft,
- blastDirection: 0, // radial value - RIGHT
- emissionFrequency: 0.6,
- minimumSize: const Size(10,
- 10), // set the minimum potential size for the confetti (width, height)
- maximumSize: const Size(50,
- 50), // set the maximum potential size for the confetti (width, height)
- numberOfParticles: 1,
- gravity: 0.1,
+ Align(
+ alignment: Alignment.topCenter,
+ child: TextButton(
+ onPressed: () {
+ _controllerTopCenter.play();
+ },
+ child: _display('goliath')),
),
- ),
- Align(
- alignment: Alignment.centerLeft,
- child: FlatButton(
- onPressed: () {
- _controllerCenterLeft.play();
- },
- child: _display('singles')),
- ),
-
- //TOP CENTER - shoot down
- Align(
- alignment: Alignment.topCenter,
- child: ConfettiWidget(
- confettiController: _controllerTopCenter,
- blastDirection: pi / 2,
- maxBlastForce: 5, // set a lower max blast force
- minBlastForce: 2, // set a lower min blast force
- emissionFrequency: 0.05,
- numberOfParticles: 50, // a lot of particles at once
- gravity: 1,
+ //BOTTOM CENTER
+ Align(
+ alignment: Alignment.bottomCenter,
+ child: ConfettiWidget(
+ confettiController: _controllerBottomCenter,
+ blastDirection: -pi / 2,
+ emissionFrequency: 0.01,
+ numberOfParticles: 20,
+ maxBlastForce: 100,
+ minBlastForce: 80,
+ gravity: 0.3,
+ ),
),
- ),
- Align(
- alignment: Alignment.topCenter,
- child: FlatButton(
- onPressed: () {
- _controllerTopCenter.play();
- },
- child: _display('goliath')),
- ),
- //BOTTOM CENTER
- Align(
- alignment: Alignment.bottomCenter,
- child: ConfettiWidget(
- confettiController: _controllerBottomCenter,
- blastDirection: -pi / 2,
- emissionFrequency: 0.01,
- numberOfParticles: 20,
- maxBlastForce: 100,
- minBlastForce: 80,
- gravity: 0.3,
+ Align(
+ alignment: Alignment.bottomCenter,
+ child: TextButton(
+ onPressed: () {
+ _controllerBottomCenter.play();
+ },
+ child: _display('hard and infrequent')),
),
- ),
- Align(
- alignment: Alignment.bottomCenter,
- child: FlatButton(
- onPressed: () {
- _controllerBottomCenter.play();
- },
- child: _display('hard and infrequent')),
- ),
- ],
+ ],
+ ),
);
}
diff --git a/example/pubspec.lock b/example/pubspec.lock
index 64064bc..353c543 100644
--- a/example/pubspec.lock
+++ b/example/pubspec.lock
@@ -7,49 +7,49 @@ packages:
name: async
url: "https://pub.dartlang.org"
source: hosted
- version: "2.4.2"
+ version: "2.5.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.0"
+ version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.3"
+ version: "1.2.0"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.1"
+ version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
- version: "1.14.13"
+ version: "1.15.0"
confetti:
dependency: "direct main"
description:
path: ".."
relative: true
source: path
- version: "0.5.4+1"
+ version: "0.6.0-nullsafety"
cupertino_icons:
dependency: "direct main"
description:
@@ -63,7 +63,7 @@ packages:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
@@ -80,28 +80,28 @@ packages:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
- version: "0.12.8"
+ version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.8"
+ version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
- version: "1.7.0"
+ version: "1.8.0"
random_color:
dependency: transitive
description:
name: random_color
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.3"
+ version: "1.0.6-nullsafety"
sky_engine:
dependency: transitive
description: flutter
@@ -113,55 +113,55 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
- version: "1.7.0"
+ version: "1.8.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
- version: "1.9.5"
+ version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.5"
+ version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
- version: "0.2.17"
+ version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
- version: "1.2.0"
+ version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.8"
+ version: "2.1.0"
sdks:
- dart: ">=2.9.0-14.0.dev <3.0.0"
+ dart: ">=2.12.0 <3.0.0"
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
index 60a17c8..5272a54 100644
--- a/example/pubspec.yaml
+++ b/example/pubspec.yaml
@@ -1,74 +1,23 @@
name: example
description: A new Flutter project.
-# The following defines the version and build number for your application.
-# A version number is three numbers separated by dots, like 1.2.43
-# followed by an optional build number separated by a +.
-# Both the version and the builder number may be overridden in flutter
-# build by specifying --build-name and --build-number, respectively.
-# In Android, build-name is used as versionName while build-number used as versionCode.
-# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
-# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
-# Read more about iOS versioning at
-# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
+publish_to: none
+
environment:
- sdk: ">=2.1.0 <3.0.0"
+ sdk: '>=2.12.0 <3.0.0'
dependencies:
- flutter:
- sdk: flutter
-
- # The following adds the Cupertino Icons font to your application.
- # Use with the CupertinoIcons class for iOS style icons.
- cupertino_icons: ^0.1.2
confetti:
path: ../
+ cupertino_icons: ^0.1.2
+ flutter:
+ sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
-
-# For information on the generic Dart part of this file, see the
-# following page: https://dart.dev/tools/pub/pubspec
-
-# The following section is specific to Flutter.
flutter:
-
- # The following line ensures that the Material Icons font is
- # included with your application, so that you can use the icons in
- # the material Icons class.
- uses-material-design: true
-
- # To add assets to your application, add an assets section, like this:
- # assets:
- # - images/a_dot_burr.jpeg
- # - images/a_dot_ham.jpeg
-
- # An image asset can refer to one or more resolution-specific "variants", see
- # https://flutter.dev/assets-and-images/#resolution-aware.
-
- # For details regarding adding assets from package dependencies, see
- # https://flutter.dev/assets-and-images/#from-packages
-
- # To add custom fonts to your application, add a fonts section here,
- # in this "flutter" section. Each entry in this list should have a
- # "family" key with the font family name, and a "fonts" key with a
- # list giving the asset and other descriptors for the font. For
- # example:
- # fonts:
- # - family: Schyler
- # fonts:
- # - asset: fonts/Schyler-Regular.ttf
- # - asset: fonts/Schyler-Italic.ttf
- # style: italic
- # - family: Trajan Pro
- # fonts:
- # - asset: fonts/TrajanPro.ttf
- # - asset: fonts/TrajanPro_Bold.ttf
- # weight: 700
- #
- # For details regarding fonts from package dependencies,
- # see https://flutter.dev/custom-fonts/#from-packages
+ uses-material-design: true
\ No newline at end of file
diff --git a/example/web/favicon.png b/example/web/favicon.png
deleted file mode 100644
index 8aaa46a..0000000
Binary files a/example/web/favicon.png and /dev/null differ
diff --git a/example/web/icons/Icon-192.png b/example/web/icons/Icon-192.png
deleted file mode 100644
index b749bfe..0000000
Binary files a/example/web/icons/Icon-192.png and /dev/null differ
diff --git a/example/web/icons/Icon-512.png b/example/web/icons/Icon-512.png
deleted file mode 100644
index 88cfd48..0000000
Binary files a/example/web/icons/Icon-512.png and /dev/null differ
diff --git a/example/web/index.html b/example/web/index.html
deleted file mode 100644
index 9b7a438..0000000
--- a/example/web/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- example
-
-
-
-
-
-
-
-
diff --git a/example/web/manifest.json b/example/web/manifest.json
deleted file mode 100644
index c638001..0000000
--- a/example/web/manifest.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name": "example",
- "short_name": "example",
- "start_url": ".",
- "display": "minimal-ui",
- "background_color": "#0175C2",
- "theme_color": "#0175C2",
- "description": "A new Flutter project.",
- "orientation": "portrait-primary",
- "prefer_related_applications": false,
- "icons": [
- {
- "src": "icons/Icon-192.png",
- "sizes": "192x192",
- "type": "image/png"
- },
- {
- "src": "icons/Icon-512.png",
- "sizes": "512x512",
- "type": "image/png"
- }
- ]
-}
diff --git a/lib/confetti.dart b/lib/confetti.dart
index 7f728e5..036c2d4 100644
--- a/lib/confetti.dart
+++ b/lib/confetti.dart
@@ -2,3 +2,4 @@ library confetti;
export 'src/confetti.dart';
export 'src/enums/blast_directionality.dart';
+export 'src/enums/confetti_controller_state.dart';
diff --git a/lib/src/confetti.dart b/lib/src/confetti.dart
index 90a89c5..38e57ff 100644
--- a/lib/src/confetti.dart
+++ b/lib/src/confetti.dart
@@ -8,8 +8,8 @@ import 'enums/confetti_controller_state.dart';
class ConfettiWidget extends StatefulWidget {
const ConfettiWidget({
- Key key,
- @required this.confettiController,
+ Key? key,
+ required this.confettiController,
this.emissionFrequency = 0.02,
this.numberOfParticles = 10,
this.maxBlastForce = 20,
@@ -25,15 +25,8 @@ class ConfettiWidget extends StatefulWidget {
this.particleDrag = 0.05,
this.canvas,
this.child,
- }) : assert(
- confettiController != null,
- emissionFrequency != null &&
- numberOfParticles != null &&
- maxBlastForce != null &&
- minBlastForce != null &&
- blastDirectionality != null &&
- blastDirection != null),
- assert(emissionFrequency >= 0 &&
+ this.createParticlePath,
+ }) : assert(emissionFrequency >= 0 &&
emissionFrequency <= 1 &&
numberOfParticles > 0 &&
maxBlastForce > 0 &&
@@ -42,25 +35,38 @@ class ConfettiWidget extends StatefulWidget {
assert(gravity >= 0 && gravity <= 1),
super(key: key);
- /// The [ConfettiController] must not be null.
+ /// Controls the animation.
final ConfettiController confettiController;
- /// The [maxBlastForce] and [minBlastForce] will determine the maximum and minimum blast force applied to
- /// a particle within it's first 5 frames of life. The default [maxBlastForce] is set to `20`
+ /// The [maxBlastForce] and [minBlastForce] will determine the maximum and
+ /// minimum blast force applied to a particle within it's first 5 frames of
+ /// life. The default [maxBlastForce] is set to `20`
final double maxBlastForce;
- /// The [maxBlastForce] and [minBlastForce] will determine the maximum and minimum blast force applied to
- /// a particle within it's first 5 frames of life. The default [minBlastForce] is set to `5`
+ /// The [maxBlastForce] and [minBlastForce] will determine the maximum and
+ /// minimum blast force applied to a particle within it's first 5 frames of
+ /// life. The default [minBlastForce] is set to `5`
final double minBlastForce;
- /// The [blastDirectionality] is an enum that takes one of two values - directional or explosive.
+ /// The [blastDirectionality] is an enum that takes one of two
+ /// values - directional or explosive.
+ ///
/// The default is set to directional
final BlastDirectionality blastDirectionality;
- /// The [blastDirection] is a radial value to determine the direction of the particle emission.
- /// The default is set to `PI` (180 degrees). A value of `PI` will emit to the left of the canvas/screen.
+ /// The [blastDirection] is a radial value to determine the direction of the
+ /// particle emission.
+ ///
+ /// The default is set to `PI` (180 degrees).
+ /// A value of `PI` will emit to the left of the canvas/screen.
final double blastDirection;
+ /// The [createParticlePath] is optional function that returns custom Path
+ /// needed to generate particles.
+ ///
+ /// The default function returns rectangular path
+ final Path Function(Size size)? createParticlePath;
+
/// The [gravity] is the speed at which the confetti will fall.
/// The higher the [gravity] the faster it will fall.
///
@@ -68,42 +74,54 @@ class ConfettiWidget extends StatefulWidget {
/// Default value is `0.1`
final double gravity;
- /// The [emissionFrequency] should be a value between 0 and 1. The higher the value the higher the
- /// likelihood that particles will be emitted on a single frame. Default is set to `0.02` (2% chance)
+ /// The [emissionFrequency] should be a value between 0 and 1.
+ /// The higher the value the higher the likelihood that particles will be
+ /// emitted on a single frame.
+ ///
+ /// Default is set to `0.02` (2% chance).
final double emissionFrequency;
- /// The [numberOfParticles] to be emitted per emission. Default is set to `10`
+ /// The [numberOfParticles] to be emitted per emission.
+ ///
+ /// Default is set to `10`.
final int numberOfParticles;
- /// The [shouldLoop] attribute determines if the [emissionDuration] will reset which will result
- /// in continues particles being emitted.
+ /// The [shouldLoop] attribute determines if the animation will
+ /// reset once it completes, resulting in a continuous particle emission.
final bool shouldLoop;
- /// The [displayTarget] attribute determines if a crosshair will be displayed to show the location
- /// of the particle emitter
+ /// The [displayTarget] attribute determines if a crosshair will be displayed
+ /// to show the location of the particle emitter.
final bool displayTarget;
/// List of Colors to iterate over - if null then random values will be chosen
- final List colors;
+ final List? colors;
- /// An optional parameter to set the minimum size potential size for the confetti.
- /// Must be smaller than the [maximumSize] attribute. Cannot be null
+ /// An optional parameter to set the minimum size potential size for
+ /// the confetti.
+ ///
+ /// Must be smaller than the [maximumSize] attribute.
final Size minimumSize;
/// An optional parameter to set the maximum potential size for the confetti.
- /// Must be bigger than the [minimumSize] attribute. Cannot be null
+ /// Must be bigger than the [minimumSize] attribute.
final Size maximumSize;
- /// An optional parameter to specify drag force, effecting the movement of the confetti.
- /// Using `1.0` will give no drag at all, while, for example, using `0.1` will give a lot of drag. Default is set to `0.05`.
+ /// An optional parameter to specify drag force, effecting the movement
+ /// of the confetti.
+ ///
+ /// Using `1.0` will give no drag at all, while, for example, using `0.1`
+ /// will give a lot of drag. Default is set to `0.05`.
final double particleDrag;
- /// An optional parameter to specify the area size where the confetti will be thrown.
- /// By default this is set to screen size.
- final Size canvas;
+ /// An optional parameter to specify the area size where the confetti will
+ /// be thrown.
+ ///
+ /// By default this is set to then screen size.
+ final Size? canvas;
/// Child widget to display
- final Widget child;
+ final Widget? child;
@override
_ConfettiWidgetState createState() => _ConfettiWidgetState();
@@ -113,12 +131,12 @@ class _ConfettiWidgetState extends State
with SingleTickerProviderStateMixin {
final GlobalKey _particleSystemKey = GlobalKey();
- AnimationController _animController;
- Animation _animation;
- ParticleSystem _particleSystem;
+ late AnimationController _animController;
+ late Animation _animation;
+ late ParticleSystem _particleSystem;
/// Keeps track of emition position on screen layout changes
- Offset _emitterPosition;
+ Offset? _emitterPosition;
/// Keeps track of the screen size on layout changes
/// Controls the sizing restrictions for when confetti should be vissible
@@ -138,8 +156,9 @@ class _ConfettiWidgetState extends State
blastDirectionality: widget.blastDirectionality,
colors: widget.colors,
minimumSize: widget.minimumSize,
- maximumsize: widget.maximumSize,
- particleDrag: widget.particleDrag);
+ maximumSize: widget.maximumSize,
+ particleDrag: widget.particleDrag,
+ createParticlePath: widget.createParticlePath);
_particleSystem.addListener(_particleSystemListener);
@@ -151,8 +170,9 @@ class _ConfettiWidgetState extends State
_animController = AnimationController(
vsync: this, duration: widget.confettiController.duration);
_animation = Tween(begin: 0, end: 1).animate(_animController);
- _animation.addListener(_animationListener);
- _animation.addStatusListener(_animationStatusListener);
+ _animation
+ ..addListener(_animationListener)
+ ..addStatusListener(_animationStatusListener);
if (widget.confettiController.state == ConfettiControllerState.playing) {
_startAnimation();
@@ -206,7 +226,7 @@ class _ConfettiWidgetState extends State
void _startAnimation() {
// Make sure widgets are built before setting screen size and position
- WidgetsBinding.instance.addPostFrameCallback((_) {
+ WidgetsBinding.instance!.addPostFrameCallback((_) {
_setScreenSize();
_setEmitterPosition();
_animController.forward(from: 0);
@@ -215,6 +235,7 @@ class _ConfettiWidgetState extends State
void _stopAnimation() {
_animController.stop();
+ widget.confettiController.stop();
}
void _continueAnimation() {
@@ -232,8 +253,8 @@ class _ConfettiWidgetState extends State
}
Offset _getContainerPosition() {
- final RenderBox containerRenderBox =
- _particleSystemKey.currentContext.findRenderObject();
+ final containerRenderBox =
+ _particleSystemKey.currentContext!.findRenderObject() as RenderBox;
return containerRenderBox.localToGlobal(Offset.zero);
}
@@ -242,12 +263,13 @@ class _ConfettiWidgetState extends State
}
/// On layout change update the position of the emitter
- /// and the screen size
+ /// and the screen size.
///
- /// Only update the emitter if it has already been set.
- /// To avoid RenderObject issues.
- /// The emitter position is first set in the [addPostFrameCallback]
- /// in [initState]
+ /// Only update the emitter if it has already been set, to avoid RenderObject
+ /// issues.
+ ///
+ /// The emitter position is first set in the `addPostFrameCallback`
+ /// in [initState].
void _updatePositionAndSize() {
if (_getScreenSize() != _screenSize) {
_setScreenSize();
@@ -275,21 +297,21 @@ class _ConfettiWidgetState extends State
@override
void dispose() {
- widget.confettiController.stop();
+ widget.confettiController.stop(notify: false);
_animController.dispose();
widget.confettiController.removeListener(_handleChange);
_particleSystem.removeListener(_particleSystemListener);
- _particleSystem = null;
super.dispose();
}
}
class ParticlePainter extends CustomPainter {
- ParticlePainter(Listenable repaint,
- {@required this.particles,
- paintEmitterTarget = true,
- emitterTargetColor = Colors.black})
- : _paintEmitterTarget = paintEmitterTarget,
+ ParticlePainter(
+ Listenable? repaint, {
+ required this.particles,
+ bool paintEmitterTarget = true,
+ Color emitterTargetColor = Colors.black,
+ }) : _paintEmitterTarget = paintEmitterTarget,
_emitterPaint = Paint()
..color = emitterTargetColor
..style = PaintingStyle.stroke
@@ -310,9 +332,6 @@ class ParticlePainter extends CustomPainter {
if (_paintEmitterTarget) {
_paintEmitter(canvas);
}
- if (particles == null) {
- return;
- }
_paintParticles(canvas);
}
@@ -320,18 +339,17 @@ class ParticlePainter extends CustomPainter {
void _paintEmitter(Canvas canvas) {
const radius = 10.0;
canvas.drawCircle(Offset.zero, radius, _emitterPaint);
- final path = Path();
- path.moveTo(0, -radius);
- path.lineTo(0, radius);
- path.moveTo(-radius, 0);
- path.lineTo(radius, 0);
+ final path = Path()
+ ..moveTo(0, -radius)
+ ..lineTo(0, radius)
+ ..moveTo(-radius, 0)
+ ..lineTo(radius, 0);
canvas.drawPath(path, _emitterPaint);
}
void _paintParticles(Canvas canvas) {
for (final particle in particles) {
- final rotationMatrix4 = Matrix4.identity();
- rotationMatrix4
+ final rotationMatrix4 = Matrix4.identity()
..translate(particle.location.dx, particle.location.dy)
..rotateX(particle.angleX)
..rotateY(particle.angleY)
@@ -350,9 +368,7 @@ class ParticlePainter extends CustomPainter {
class ConfettiController extends ChangeNotifier {
ConfettiController({this.duration = const Duration(seconds: 30)})
- : assert(duration != null &&
- !duration.isNegative &&
- duration.inMicroseconds > 0);
+ : assert(!duration.isNegative && duration.inMicroseconds > 0);
Duration duration;
@@ -365,8 +381,10 @@ class ConfettiController extends ChangeNotifier {
notifyListeners();
}
- void stop() {
+ void stop({bool notify = true}) {
_state = ConfettiControllerState.stopped;
- notifyListeners();
+ if (notify) {
+ notifyListeners();
+ }
}
}
diff --git a/lib/src/helper.dart b/lib/src/helper.dart
index d89404e..fa6338b 100644
--- a/lib/src/helper.dart
+++ b/lib/src/helper.dart
@@ -4,7 +4,7 @@ import 'dart:ui' as ui;
final _rand = Random();
double randomize(double min, double max) {
- return ui.lerpDouble(min, max, _rand.nextDouble());
+ return ui.lerpDouble(min, max, _rand.nextDouble())!;
}
void debugPrint(String message) {
diff --git a/lib/src/particle.dart b/lib/src/particle.dart
index 0efbc72..0f898a4 100644
--- a/lib/src/particle.dart
+++ b/lib/src/particle.dart
@@ -16,43 +16,33 @@ enum ParticleSystemStatus {
}
class ParticleSystem extends ChangeNotifier {
- ParticleSystem(
- {@required double emissionFrequency,
- @required int numberOfParticles,
- @required double maxBlastForce,
- @required double minBlastForce,
- @required double blastDirection,
- @required BlastDirectionality blastDirectionality,
- @required List colors,
- @required Size minimumSize,
- @required Size maximumsize,
- @required double particleDrag,
- @required double gravity})
- : assert(
- emissionFrequency != null &&
- numberOfParticles != null &&
- maxBlastForce != null &&
- minBlastForce != null &&
- blastDirection != null &&
- minimumSize != null &&
- maximumsize != null &&
- particleDrag != null &&
- blastDirectionality != null,
- ),
- assert(maxBlastForce > 0 &&
+ ParticleSystem({
+ required double emissionFrequency,
+ required int numberOfParticles,
+ required double maxBlastForce,
+ required double minBlastForce,
+ required double blastDirection,
+ required BlastDirectionality blastDirectionality,
+ required List? colors,
+ required Size minimumSize,
+ required Size maximumSize,
+ required double particleDrag,
+ required double gravity,
+ Path Function(Size size)? createParticlePath,
+ }) : assert(maxBlastForce > 0 &&
minBlastForce > 0 &&
emissionFrequency >= 0 &&
emissionFrequency <= 1 &&
numberOfParticles > 0 &&
minimumSize.width > 0 &&
minimumSize.height > 0 &&
- maximumsize.width > 0 &&
- maximumsize.height > 0 &&
- minimumSize.width <= maximumsize.width &&
- minimumSize.height <= maximumsize.height &&
+ maximumSize.width > 0 &&
+ maximumSize.height > 0 &&
+ minimumSize.width <= maximumSize.width &&
+ minimumSize.height <= maximumSize.height &&
particleDrag >= 0.0 &&
particleDrag <= 1 &&
- minimumSize.height <= maximumsize.height),
+ minimumSize.height <= maximumSize.height),
assert(gravity >= 0 && gravity <= 1),
_blastDirection = blastDirection,
_blastDirectionality = blastDirectionality,
@@ -63,11 +53,12 @@ class ParticleSystem extends ChangeNotifier {
_numberOfParticles = numberOfParticles,
_colors = colors,
_minimumSize = minimumSize,
- _maximumSize = maximumsize,
+ _maximumSize = maximumSize,
_particleDrag = particleDrag,
- _rand = Random();
+ _rand = Random(),
+ _createParticlePath = createParticlePath;
- ParticleSystemStatus _particleSystemStatus;
+ ParticleSystemStatus? _particleSystemStatus;
final List _particles = [];
@@ -80,21 +71,22 @@ class ParticleSystem extends ChangeNotifier {
final double _blastDirection;
final BlastDirectionality _blastDirectionality;
final double _gravity;
- final List _colors;
+ final List? _colors;
final Size _minimumSize;
final Size _maximumSize;
final double _particleDrag;
+ final Path Function(Size size)? _createParticlePath;
- Offset _particleSystemPosition;
- Size _screenSize;
+ Offset? _particleSystemPosition;
+ Size? _screenSize;
- double _bottomBorder;
- double _rightBorder;
- double _leftBorder;
+ late double _bottomBorder;
+ late double _rightBorder;
+ late double _leftBorder;
final Random _rand;
- set particleSystemPosition(Offset position) {
+ set particleSystemPosition(Offset? position) {
_particleSystemPosition = position;
}
@@ -116,7 +108,7 @@ class ParticleSystem extends ChangeNotifier {
}
List get particles => _particles;
- ParticleSystemStatus get particleSystemStatus => _particleSystemStatus;
+ ParticleSystemStatus? get particleSystemStatus => _particleSystemStatus;
void update() {
_clean();
@@ -147,31 +139,26 @@ class ParticleSystem extends ChangeNotifier {
}
void _setScreenBorderPositions() {
- _bottomBorder = _screenSize.height * 1.1;
- _rightBorder = _screenSize.width * 1.1;
- _leftBorder = _screenSize.width - _rightBorder;
+ _bottomBorder = _screenSize!.height * 1.1;
+ _rightBorder = _screenSize!.width * 1.1;
+ _leftBorder = _screenSize!.width - _rightBorder;
}
void _updateParticles() {
- if (particles == null) {
- return;
- }
for (final particle in _particles) {
particle.update();
}
}
void _clean() {
- if (_particleSystemPosition != null &&
- _screenSize != null &&
- particles != null) {
+ if (_particleSystemPosition != null && _screenSize != null) {
_particles
.removeWhere((particle) => _isOutsideOfBorder(particle.location));
}
}
bool _isOutsideOfBorder(Offset particleLocation) {
- final globalParticlePosition = particleLocation + _particleSystemPosition;
+ final globalParticlePosition = particleLocation + _particleSystemPosition!;
return (globalParticlePosition.dy >= _bottomBorder) ||
(globalParticlePosition.dx >= _rightBorder) ||
(globalParticlePosition.dx <= _leftBorder);
@@ -181,7 +168,7 @@ class ParticleSystem extends ChangeNotifier {
return List.generate(
number,
(i) => Particle(_generateParticleForce(), _randomColor(), _randomSize(),
- _gravity, _particleDrag));
+ _gravity, _particleDrag, _createParticlePath));
}
double get _randomBlastDirection =>
@@ -200,11 +187,11 @@ class ParticleSystem extends ChangeNotifier {
Color _randomColor() {
if (_colors != null) {
- if (_colors.length == 1) {
- return _colors[0];
+ if (_colors!.length == 1) {
+ return _colors![0];
}
- final index = _rand.nextInt(_colors.length);
- return _colors[index];
+ final index = _rand.nextInt(_colors!.length);
+ return _colors![index];
}
return RandomColor().randomColor();
}
@@ -219,7 +206,7 @@ class ParticleSystem extends ChangeNotifier {
class Particle {
Particle(vmath.Vector2 startUpForce, Color color, Size size, double gravity,
- double particleDrag)
+ double particleDrag, Path Function(Size size)? createParticlePath)
: _startUpForce = startUpForce,
_color = color,
_mass = randomize(1, 11),
@@ -228,7 +215,9 @@ class Particle {
_acceleration = vmath.Vector2.zero(),
_velocity = vmath.Vector2(randomize(-3, 3), randomize(-3, 3)),
// _size = size,
- _pathShape = createPath(size),
+ _pathShape = createParticlePath != null
+ ? createParticlePath(size)
+ : createPath(size),
_aVelocityX = randomize(-0.1, 0.1),
_aVelocityY = randomize(-0.1, 0.1),
_aVelocityZ = randomize(-0.1, 0.1),
@@ -247,7 +236,7 @@ class Particle {
double _aVelocityY;
double _aZ = 0;
double _aVelocityZ;
- final double _gravity;
+ final double? _gravity;
final _aAcceleration = 0.0001;
final Color _color;
@@ -257,28 +246,27 @@ class Particle {
double _timeAlive = 0;
static Path createPath(Size size) {
- final pathShape = Path();
- pathShape.moveTo(0, 0);
- pathShape.lineTo(-size.width, 0);
- pathShape.lineTo(-size.width, size.height);
- pathShape.lineTo(0, size.height);
- pathShape.close();
+ final pathShape = Path()
+ ..moveTo(0, 0)
+ ..lineTo(-size.width, 0)
+ ..lineTo(-size.width, size.height)
+ ..lineTo(0, size.height)
+ ..close();
return pathShape;
}
void applyForce(vmath.Vector2 force) {
- final f = force.clone();
- f.divide(vmath.Vector2.all(_mass));
+ final f = force.clone()..divide(vmath.Vector2.all(_mass));
_acceleration.add(f);
}
void drag() {
final speed = sqrt(pow(_velocity.x, 2) + pow(_velocity.y, 2));
final dragMagnitude = _particleDrag * speed * speed;
- final drag = _velocity.clone();
- drag.multiply(vmath.Vector2.all(-1));
- drag.normalize();
- drag.multiply(vmath.Vector2.all(dragMagnitude));
+ final drag = _velocity.clone()
+ ..multiply(vmath.Vector2.all(-1))
+ ..normalize()
+ ..multiply(vmath.Vector2.all(dragMagnitude));
applyForce(drag);
}
@@ -302,7 +290,7 @@ class Particle {
_timeAlive += 1;
- applyForce(vmath.Vector2(0, _gravity));
+ applyForce(vmath.Vector2(0, _gravity!));
_velocity.add(_acceleration);
_location.add(_velocity);
diff --git a/pubspec.lock b/pubspec.lock
index f306942..a2e5140 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -7,49 +7,49 @@ packages:
name: async
url: "https://pub.dartlang.org"
source: hosted
- version: "2.4.2"
+ version: "2.5.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.0"
+ version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.3"
+ version: "1.2.0"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.1"
+ version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
- version: "1.14.13"
+ version: "1.15.0"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
@@ -66,28 +66,35 @@ packages:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
- version: "0.12.8"
+ version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.8"
+ version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
- version: "1.7.0"
+ version: "1.8.0"
+ pedantic:
+ dependency: transitive
+ description:
+ name: pedantic
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.11.0"
random_color:
dependency: "direct main"
description:
name: random_color
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.3"
+ version: "1.0.6-nullsafety"
sky_engine:
dependency: transitive
description: flutter
@@ -99,55 +106,62 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
- version: "1.7.0"
+ version: "1.8.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
- version: "1.9.5"
+ version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.0"
+ version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.5"
+ version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
- version: "0.2.17"
+ version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
- version: "1.2.0"
+ version: "1.3.0"
vector_math:
dependency: "direct main"
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
- version: "2.0.8"
+ version: "2.1.0"
+ very_good_analysis:
+ dependency: "direct dev"
+ description:
+ name: very_good_analysis
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.0.0"
sdks:
- dart: ">=2.9.0-14.0.dev <3.0.0"
+ dart: ">=2.12.0 <3.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index fc06fd9..ceed291 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,54 +1,22 @@
name: confetti
-description: Blast colorful confetti all over the screen. Celebrate in app achievements with style. Control the velocity, angle, gravity and amount of confetti.
-version: 0.5.4+1
+description: Blast colorful confetti all over the screen. Celebrate in app
+ achievements with style. Control the velocity, angle, gravity and amount of
+ confetti.
+version: 0.6.0-nullsafety
homepage: https://github.com/funwithflutter/flutter_confetti
environment:
- sdk: ">=2.1.0 <3.0.0"
+ sdk: '>=2.12.0 <3.0.0'
dependencies:
flutter:
sdk: flutter
- random_color: ^1.0.3
- vector_math: ^2.0.8
+ random_color: ^1.0.6-nullsafety
+ vector_math: ^2.1.0-nullsafety.3
dev_dependencies:
flutter_test:
sdk: flutter
+ very_good_analysis: ^2.0.0
-# For information on the generic Dart part of this file, see the
-# following page: https://dart.dev/tools/pub/pubspec
-
-# The following section is specific to Flutter.
-flutter:
-
- # To add assets to your package, add an assets section, like this:
- # assets:
- # - images/a_dot_burr.jpeg
- # - images/a_dot_ham.jpeg
- #
- # For details regarding assets in packages, see
- # https://flutter.dev/assets-and-images/#from-packages
- #
- # An image asset can refer to one or more resolution-specific "variants", see
- # https://flutter.dev/assets-and-images/#resolution-aware.
-
- # To add custom fonts to your package, add a fonts section here,
- # in this "flutter" section. Each entry in this list should have a
- # "family" key with the font family name, and a "fonts" key with a
- # list giving the asset and other descriptors for the font. For
- # example:
- # fonts:
- # - family: Schyler
- # fonts:
- # - asset: fonts/Schyler-Regular.ttf
- # - asset: fonts/Schyler-Italic.ttf
- # style: italic
- # - family: Trajan Pro
- # fonts:
- # - asset: fonts/TrajanPro.ttf
- # - asset: fonts/TrajanPro_Bold.ttf
- # weight: 700
- #
- # For details regarding fonts in packages, see
- # https://flutter.dev/custom-fonts/#from-packages
+flutter: null