From 0c472f998a3e561b47a9002fba33138ea6e30f2b Mon Sep 17 00:00:00 2001 From: Jonatas Date: Fri, 9 Oct 2020 19:49:37 -0300 Subject: [PATCH] update to 3.13.2 --- .vscode/launch.json | 77 -- CHANGELOG.md | 5 + README-es.md | 20 +- README.md | 6 +- README.pl.md | 16 +- README.pt-br.md | 30 +- README.zh-cn.md | 18 +- counter-app-gif.gif | Bin 148078 -> 0 bytes example/android/.gitignore | 11 - example/android/app/build.gradle | 63 - .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 47 - .../getx/demo/app/example/MainActivity.kt | 6 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 18 - .../app/src/profile/AndroidManifest.xml | 7 - example/android/build.gradle | 31 - example/android/gradle.properties | 4 - .../gradle/wrapper/gradle-wrapper.properties | 6 - example/android/settings.gradle | 11 - example/linux/.gitignore | 1 - example/linux/CMakeLists.txt | 106 -- example/linux/flutter/CMakeLists.txt | 88 -- .../flutter/generated_plugin_registrant.cc | 9 - .../flutter/generated_plugin_registrant.h | 13 - example/linux/flutter/generated_plugins.cmake | 15 - example/linux/main.cc | 10 - example/linux/my_application.cc | 46 - example/linux/my_application.h | 18 - example/pubspec.yaml | 16 +- example/web/favicon.png | Bin 917 -> 0 bytes example/web/icons/Icon-192.png | Bin 5292 -> 0 bytes example/web/icons/Icon-512.png | Bin 8252 -> 0 bytes example/web/index.html | 33 - example/web/manifest.json | 23 - get.png | Bin 117778 -> 0 bytes getx.png | Bin 128190 -> 0 bytes .../src/routes/default_transitions.dart | 1 - lib/get_rx/src/rx_core/rx_impl.dart | 2 +- lib/get_rx/src/rx_iterables/rx_list.dart | 2 +- lib/get_rx/src/rx_iterables/rx_map.dart | 3 +- lib/get_rx/src/rx_iterables/rx_set.dart | 2 +- logo-no-background.png | Bin 75588 -> 0 bytes packages/get_core/.gitignore | 74 -- packages/get_core/.metadata | 10 - packages/get_core/CHANGELOG.md | 9 - packages/get_core/LICENSE | 21 - packages/get_core/README.md | 14 - packages/get_core/analysis_options.yaml | 85 -- packages/get_core/lib/get_core.dart | 7 - packages/get_core/lib/src/get_interface.dart | 11 - packages/get_core/lib/src/get_main.dart | 12 - packages/get_core/lib/src/log.dart | 10 - .../get_core/lib/src/smart_management.dart | 22 - packages/get_core/pubspec.yaml | 50 - packages/get_instance/.gitignore | 74 -- packages/get_instance/.metadata | 10 - packages/get_instance/CHANGELOG.md | 8 - packages/get_instance/LICENSE | 21 - packages/get_instance/README.md | 14 - packages/get_instance/analysis_options.yaml | 85 -- packages/get_instance/example/main.dart | 11 - packages/get_instance/lib/get_instance.dart | 5 - .../lib/src/bindings_interface.dart | 65 - .../lib/src/extension_instance.dart | 115 -- .../get_instance/lib/src/get_instance.dart | 420 ------- packages/get_instance/lib/src/lifecycle.dart | 40 - packages/get_instance/pubspec.yaml | 19 - .../get_instance/test/get_instance_test.dart | 131 -- packages/get_instance/test/util/matcher.dart | 120 -- packages/get_navigation/.gitignore | 74 -- packages/get_navigation/.metadata | 10 - packages/get_navigation/CHANGELOG.md | 10 - packages/get_navigation/LICENSE | 21 - packages/get_navigation/README.md | 14 - packages/get_navigation/analysis_options.yaml | 85 -- .../get_navigation/lib/get_navigation.dart | 14 - .../lib/src/bottomsheet/bottomsheet.dart | 332 ----- .../lib/src/dialog/dialog_route.dart | 78 -- .../lib/src/extension_navigation.dart | 1095 ----------------- .../lib/src/root/parse_route.dart | 226 ---- .../lib/src/root/root_controller.dart | 52 - .../lib/src/root/root_widget.dart | 300 ----- .../lib/src/routes/custom_transition.dart | 13 - .../lib/src/routes/default_route.dart | 602 --------- .../lib/src/routes/default_transitions.dart | 187 --- .../lib/src/routes/get_route.dart | 45 - .../src/routes/observers/route_observer.dart | 207 ---- .../lib/src/routes/transitions_component.dart | 13 - .../lib/src/routes/transitions_type.dart | 21 - .../lib/src/snackbar/snack.dart | 688 ----------- .../lib/src/snackbar/snack_route.dart | 394 ------ packages/get_navigation/pubspec.yaml | 56 - .../get_navigation/test/bottomsheet_test.dart | 72 -- packages/get_navigation/test/dialog_test.dart | 53 - .../get_navigation/test/get_main_test.dart | 471 ------- .../get_navigation/test/root_widget_test.dart | 102 -- packages/get_navigation/test/routes_test.dart | 43 - .../get_navigation/test/utils/wrapper.dart | 53 - packages/get_rx/.gitignore | 74 -- packages/get_rx/.metadata | 10 - packages/get_rx/CHANGELOG.md | 8 - packages/get_rx/LICENSE | 21 - packages/get_rx/README.md | 14 - packages/get_rx/analysis_options.yaml | 85 -- packages/get_rx/coverage/lcov.info | 677 ---------- packages/get_rx/example/main.dart | 12 - packages/get_rx/lib/get_rx.dart | 8 - packages/get_rx/lib/src/rx_core/rx_impl.dart | 330 ----- .../get_rx/lib/src/rx_core/rx_interface.dart | 28 - packages/get_rx/lib/src/rx_core/rx_num.dart | 617 ---------- .../get_rx/lib/src/rx_iterables/rx_list.dart | 449 ------- .../get_rx/lib/src/rx_iterables/rx_map.dart | 205 --- .../get_rx/lib/src/rx_iterables/rx_set.dart | 344 ------ .../lib/src/rx_typedefs/rx_typedefs.dart | 2 - .../get_rx/lib/src/rx_workers/rx_workers.dart | 201 --- .../lib/src/rx_workers/utils/debouncer.dart | 27 - packages/get_rx/pubspec.yaml | 19 - packages/get_rx/test/rx_workers_test.dart | 80 -- packages/get_state_manager/.gitignore | 74 -- packages/get_state_manager/.metadata | 10 - packages/get_state_manager/CHANGELOG.md | 9 - packages/get_state_manager/LICENSE | 21 - packages/get_state_manager/README.md | 14 - .../get_state_manager/analysis_options.yaml | 85 -- .../lib/get_state_manager.dart | 13 - .../lib/src/rx_flutter/rx_disposable.dart | 48 - .../lib/src/rx_flutter/rx_getx_widget.dart | 131 -- .../lib/src/rx_flutter/rx_obx_widget.dart | 120 -- .../rx_flutter/rx_ticket_provider_mixin.dart | 25 - .../lib/src/simple/get_state.dart | 305 ----- .../lib/src/simple/get_view.dart | 120 -- .../lib/src/simple/immutable_state.dart | 148 --- .../lib/src/simple/mixin_state.dart | 42 - .../lib/src/simple/simple_builder.dart | 148 --- packages/get_state_manager/pubspec.yaml | 56 - .../test/get_mixin_state_test.dart | 101 -- .../get_state_manager/test/get_obx_test.dart | 69 -- .../test/get_rxstate_test.dart | 99 -- .../test/get_state_test.dart | 109 -- packages/get_test/.gitignore | 74 -- packages/get_test/.metadata | 10 - packages/get_test/CHANGELOG.md | 14 - packages/get_test/LICENSE | 21 - packages/get_test/README.md | 14 - packages/get_test/analysis_options.yaml | 85 -- packages/get_test/example/.gitignore | 41 - packages/get_test/example/.metadata | 10 - packages/get_test/example/README.md | 16 - packages/get_test/example/lib/main.dart | 102 -- packages/get_test/example/pubspec.yaml | 81 -- packages/get_test/lib/get_test.dart | 142 --- packages/get_test/lib/utils/image_test.dart | 3 - .../get_test/lib/utils/image_test_utils.dart | 181 --- packages/get_test/pubspec.yaml | 57 - packages/get_utils/.gitignore | 74 -- packages/get_utils/.metadata | 10 - packages/get_utils/CHANGELOG.md | 11 - packages/get_utils/LICENSE | 21 - packages/get_utils/README.md | 14 - packages/get_utils/analysis_options.yaml | 85 -- packages/get_utils/lib/get_utils.dart | 4 - .../src/extensions/context_extensions.dart | 131 -- .../lib/src/extensions/double_extensions.dart | 8 - .../src/extensions/duration_extensions.dart | 19 - .../src/extensions/dynamic_extensions.dart | 18 - .../get_utils/lib/src/extensions/export.dart | 8 - .../src/extensions/internacionalization.dart | 88 -- .../lib/src/extensions/num_extensions.dart | 67 - .../lib/src/extensions/string_extensions.dart | 82 -- .../lib/src/extensions/widget_extensions.dart | 56 - .../lib/src/get_utils/get_utils.dart | 581 --------- .../get_utils/lib/src/platform/platform.dart | 23 - .../lib/src/platform/platform_io.dart | 21 - .../lib/src/platform/platform_web.dart | 35 - .../get_utils/lib/src/queue/get_queue.dart | 34 - packages/get_utils/pubspec.yaml | 55 - packages/get_utils/test/platform_test.dart | 16 - .../get_utils/test/platform_web_test.dart | 16 - pubspec.yaml | 2 +- 185 files changed, 62 insertions(+), 14803 deletions(-) delete mode 100644 .vscode/launch.json delete mode 100644 counter-app-gif.gif delete mode 100644 example/android/.gitignore delete mode 100644 example/android/app/build.gradle delete mode 100644 example/android/app/src/debug/AndroidManifest.xml delete mode 100644 example/android/app/src/main/AndroidManifest.xml delete mode 100644 example/android/app/src/main/kotlin/getx/demo/app/example/MainActivity.kt delete mode 100644 example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 example/android/app/src/main/res/values/styles.xml delete mode 100644 example/android/app/src/profile/AndroidManifest.xml delete mode 100644 example/android/build.gradle delete mode 100644 example/android/gradle.properties delete mode 100644 example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 example/android/settings.gradle delete mode 100644 example/linux/.gitignore delete mode 100644 example/linux/CMakeLists.txt delete mode 100644 example/linux/flutter/CMakeLists.txt delete mode 100644 example/linux/flutter/generated_plugin_registrant.cc delete mode 100644 example/linux/flutter/generated_plugin_registrant.h delete mode 100644 example/linux/flutter/generated_plugins.cmake delete mode 100644 example/linux/main.cc delete mode 100644 example/linux/my_application.cc delete mode 100644 example/linux/my_application.h delete mode 100644 example/web/favicon.png delete mode 100644 example/web/icons/Icon-192.png delete mode 100644 example/web/icons/Icon-512.png delete mode 100644 example/web/index.html delete mode 100644 example/web/manifest.json delete mode 100644 get.png delete mode 100644 getx.png delete mode 100644 logo-no-background.png delete mode 100644 packages/get_core/.gitignore delete mode 100644 packages/get_core/.metadata delete mode 100644 packages/get_core/CHANGELOG.md delete mode 100644 packages/get_core/LICENSE delete mode 100644 packages/get_core/README.md delete mode 100644 packages/get_core/analysis_options.yaml delete mode 100644 packages/get_core/lib/get_core.dart delete mode 100644 packages/get_core/lib/src/get_interface.dart delete mode 100644 packages/get_core/lib/src/get_main.dart delete mode 100644 packages/get_core/lib/src/log.dart delete mode 100644 packages/get_core/lib/src/smart_management.dart delete mode 100644 packages/get_core/pubspec.yaml delete mode 100644 packages/get_instance/.gitignore delete mode 100644 packages/get_instance/.metadata delete mode 100644 packages/get_instance/CHANGELOG.md delete mode 100644 packages/get_instance/LICENSE delete mode 100644 packages/get_instance/README.md delete mode 100644 packages/get_instance/analysis_options.yaml delete mode 100644 packages/get_instance/example/main.dart delete mode 100644 packages/get_instance/lib/get_instance.dart delete mode 100644 packages/get_instance/lib/src/bindings_interface.dart delete mode 100644 packages/get_instance/lib/src/extension_instance.dart delete mode 100644 packages/get_instance/lib/src/get_instance.dart delete mode 100644 packages/get_instance/lib/src/lifecycle.dart delete mode 100644 packages/get_instance/pubspec.yaml delete mode 100644 packages/get_instance/test/get_instance_test.dart delete mode 100644 packages/get_instance/test/util/matcher.dart delete mode 100644 packages/get_navigation/.gitignore delete mode 100644 packages/get_navigation/.metadata delete mode 100644 packages/get_navigation/CHANGELOG.md delete mode 100644 packages/get_navigation/LICENSE delete mode 100644 packages/get_navigation/README.md delete mode 100644 packages/get_navigation/analysis_options.yaml delete mode 100644 packages/get_navigation/lib/get_navigation.dart delete mode 100644 packages/get_navigation/lib/src/bottomsheet/bottomsheet.dart delete mode 100644 packages/get_navigation/lib/src/dialog/dialog_route.dart delete mode 100644 packages/get_navigation/lib/src/extension_navigation.dart delete mode 100644 packages/get_navigation/lib/src/root/parse_route.dart delete mode 100644 packages/get_navigation/lib/src/root/root_controller.dart delete mode 100644 packages/get_navigation/lib/src/root/root_widget.dart delete mode 100644 packages/get_navigation/lib/src/routes/custom_transition.dart delete mode 100644 packages/get_navigation/lib/src/routes/default_route.dart delete mode 100644 packages/get_navigation/lib/src/routes/default_transitions.dart delete mode 100644 packages/get_navigation/lib/src/routes/get_route.dart delete mode 100644 packages/get_navigation/lib/src/routes/observers/route_observer.dart delete mode 100644 packages/get_navigation/lib/src/routes/transitions_component.dart delete mode 100644 packages/get_navigation/lib/src/routes/transitions_type.dart delete mode 100644 packages/get_navigation/lib/src/snackbar/snack.dart delete mode 100644 packages/get_navigation/lib/src/snackbar/snack_route.dart delete mode 100644 packages/get_navigation/pubspec.yaml delete mode 100644 packages/get_navigation/test/bottomsheet_test.dart delete mode 100644 packages/get_navigation/test/dialog_test.dart delete mode 100644 packages/get_navigation/test/get_main_test.dart delete mode 100644 packages/get_navigation/test/root_widget_test.dart delete mode 100644 packages/get_navigation/test/routes_test.dart delete mode 100644 packages/get_navigation/test/utils/wrapper.dart delete mode 100644 packages/get_rx/.gitignore delete mode 100644 packages/get_rx/.metadata delete mode 100644 packages/get_rx/CHANGELOG.md delete mode 100644 packages/get_rx/LICENSE delete mode 100644 packages/get_rx/README.md delete mode 100644 packages/get_rx/analysis_options.yaml delete mode 100644 packages/get_rx/coverage/lcov.info delete mode 100644 packages/get_rx/example/main.dart delete mode 100644 packages/get_rx/lib/get_rx.dart delete mode 100644 packages/get_rx/lib/src/rx_core/rx_impl.dart delete mode 100644 packages/get_rx/lib/src/rx_core/rx_interface.dart delete mode 100644 packages/get_rx/lib/src/rx_core/rx_num.dart delete mode 100644 packages/get_rx/lib/src/rx_iterables/rx_list.dart delete mode 100644 packages/get_rx/lib/src/rx_iterables/rx_map.dart delete mode 100644 packages/get_rx/lib/src/rx_iterables/rx_set.dart delete mode 100644 packages/get_rx/lib/src/rx_typedefs/rx_typedefs.dart delete mode 100644 packages/get_rx/lib/src/rx_workers/rx_workers.dart delete mode 100644 packages/get_rx/lib/src/rx_workers/utils/debouncer.dart delete mode 100644 packages/get_rx/pubspec.yaml delete mode 100644 packages/get_rx/test/rx_workers_test.dart delete mode 100644 packages/get_state_manager/.gitignore delete mode 100644 packages/get_state_manager/.metadata delete mode 100644 packages/get_state_manager/CHANGELOG.md delete mode 100644 packages/get_state_manager/LICENSE delete mode 100644 packages/get_state_manager/README.md delete mode 100644 packages/get_state_manager/analysis_options.yaml delete mode 100644 packages/get_state_manager/lib/get_state_manager.dart delete mode 100644 packages/get_state_manager/lib/src/rx_flutter/rx_disposable.dart delete mode 100644 packages/get_state_manager/lib/src/rx_flutter/rx_getx_widget.dart delete mode 100644 packages/get_state_manager/lib/src/rx_flutter/rx_obx_widget.dart delete mode 100644 packages/get_state_manager/lib/src/rx_flutter/rx_ticket_provider_mixin.dart delete mode 100644 packages/get_state_manager/lib/src/simple/get_state.dart delete mode 100644 packages/get_state_manager/lib/src/simple/get_view.dart delete mode 100644 packages/get_state_manager/lib/src/simple/immutable_state.dart delete mode 100644 packages/get_state_manager/lib/src/simple/mixin_state.dart delete mode 100644 packages/get_state_manager/lib/src/simple/simple_builder.dart delete mode 100644 packages/get_state_manager/pubspec.yaml delete mode 100644 packages/get_state_manager/test/get_mixin_state_test.dart delete mode 100644 packages/get_state_manager/test/get_obx_test.dart delete mode 100644 packages/get_state_manager/test/get_rxstate_test.dart delete mode 100644 packages/get_state_manager/test/get_state_test.dart delete mode 100644 packages/get_test/.gitignore delete mode 100644 packages/get_test/.metadata delete mode 100644 packages/get_test/CHANGELOG.md delete mode 100644 packages/get_test/LICENSE delete mode 100644 packages/get_test/README.md delete mode 100644 packages/get_test/analysis_options.yaml delete mode 100644 packages/get_test/example/.gitignore delete mode 100644 packages/get_test/example/.metadata delete mode 100644 packages/get_test/example/README.md delete mode 100644 packages/get_test/example/lib/main.dart delete mode 100644 packages/get_test/example/pubspec.yaml delete mode 100644 packages/get_test/lib/get_test.dart delete mode 100644 packages/get_test/lib/utils/image_test.dart delete mode 100644 packages/get_test/lib/utils/image_test_utils.dart delete mode 100644 packages/get_test/pubspec.yaml delete mode 100644 packages/get_utils/.gitignore delete mode 100644 packages/get_utils/.metadata delete mode 100644 packages/get_utils/CHANGELOG.md delete mode 100644 packages/get_utils/LICENSE delete mode 100644 packages/get_utils/README.md delete mode 100644 packages/get_utils/analysis_options.yaml delete mode 100644 packages/get_utils/lib/get_utils.dart delete mode 100644 packages/get_utils/lib/src/extensions/context_extensions.dart delete mode 100644 packages/get_utils/lib/src/extensions/double_extensions.dart delete mode 100644 packages/get_utils/lib/src/extensions/duration_extensions.dart delete mode 100644 packages/get_utils/lib/src/extensions/dynamic_extensions.dart delete mode 100644 packages/get_utils/lib/src/extensions/export.dart delete mode 100644 packages/get_utils/lib/src/extensions/internacionalization.dart delete mode 100644 packages/get_utils/lib/src/extensions/num_extensions.dart delete mode 100644 packages/get_utils/lib/src/extensions/string_extensions.dart delete mode 100644 packages/get_utils/lib/src/extensions/widget_extensions.dart delete mode 100644 packages/get_utils/lib/src/get_utils/get_utils.dart delete mode 100644 packages/get_utils/lib/src/platform/platform.dart delete mode 100644 packages/get_utils/lib/src/platform/platform_io.dart delete mode 100644 packages/get_utils/lib/src/platform/platform_web.dart delete mode 100644 packages/get_utils/lib/src/queue/get_queue.dart delete mode 100644 packages/get_utils/pubspec.yaml delete mode 100644 packages/get_utils/test/platform_test.dart delete mode 100644 packages/get_utils/test/platform_web_test.dart diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 1fc11d547..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - // Use o IntelliSense para aprender sobre possíveis atributos. - // Passe o mouse para ver as descrições dos atributos existentes. - // Para obter mais informações, visite: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "getx", - "cwd": "getx", - "request": "launch", - "type": "dart" - }, - { - "name": "example debug", - "cwd": "getx/example", - "request": "launch", - "flutterMode": "debug", - "type": "dart" - }, - { - "name": "example profile", - "cwd": "getx/example", - "request": "launch", - "flutterMode": "profile", - "type": "dart" - }, - { - "name": "example release", - "cwd": "getx/example", - "request": "launch", - "flutterMode": "release", - "type": "dart" - }, - { - "name": "get_core", - "cwd": "packages/get_core", - "request": "launch", - "type": "dart" - }, - { - "name": "get_instance", - "cwd": "packages/get_instance", - "request": "launch", - "type": "dart" - }, - { - "name": "get_navigation", - "cwd": "packages/get_navigation", - "request": "launch", - "type": "dart" - }, - { - "name": "get_rx", - "cwd": "packages/get_rx", - "request": "launch", - "type": "dart" - }, - { - "name": "get_state_manager", - "cwd": "packages/get_state_manager", - "request": "launch", - "type": "dart" - }, - { - "name": "get_test", - "cwd": "packages/get_test", - "request": "launch", - "type": "dart" - }, - { - "name": "get_utils", - "cwd": "packages/get_utils", - "request": "launch", - "type": "dart" - } - ] -} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7df5ee436..6d01bc79b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## [3.13.2] +- Reunification of the package. +During the 2 week period, we try to keep this package as a compilation of smaller packages. We were successful in separating, getx is well decoupled and it was only necessary to send the internal folders as packages to pub.dev, however, it became very complicated to contribute to the package. This is because it was necessary to clone the repository, replace all pubspec packages with local paths, and after modification, return the original paths to do the PR. With that, the frequency of updates, which was about 4 to 5 days, became almost 2 weeks, and this is not legal for a community as active as Getx, which uses this package precisely in addition to being modern and performance, be constantly improving. This led contributors to the conclusion that getx works best together. +Additional packages will continue to be maintained, and will have the same base as the main package, however, development will take place in the full and main package, and as the addition of new features or bug fixes arrives, we will migrate to the individual packages . Getx reached the mark of 50 contributors today, more than 1500 likes in the pub, and will continue to make development easy. + ## [3.13.1] - Remove spaces whitespaces from dart files - diff --git a/README-es.md b/README-es.md index 88bca7bd9..40f249ac4 100644 --- a/README-es.md +++ b/README-es.md @@ -1,4 +1,4 @@ -![](get.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) *Idiomas: Español (este archivo), [Lengua china](README.zh-cn.md), [Inglés](README.md), [Portugués de Brasil](README.pt-br.md), [Polaco](README.pl.md).* @@ -13,30 +13,30 @@ Buy Me A Coffee -![](getx.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png)

Lamentamos la inconsistencia en la traducción. El paquete GetX se actualiza con bastante frecuencia y es posible que las traducciones a documentos no sean tan rápidas. Entonces, para que esta documentación aún tenga todo el contenido, dejaré aquí todos los textos nuevos sin traducir (considero que es mejor tener los documentos en inglés que no tenerlos), por lo que si alguien quiere traducir, sería de gran ayuda 😁

- [Communication and support channels:](#communication-and-support-channels) - [Sobre GetX](#sobre-getx) - [Como contribuir](#como-contribuir) -- [Instalando](#installing) -- [Proyecto Counter en GetX](#proyeto-counter-no-getx) +- [Installing](#installing) +- [Proyecto Counter no GetX](#proyecto-counter-no-getx) - [Los tres pilares](#los-tres-pilares) - [Gestión del Estado](#gestión-del-estado) - - [STATE_MANAGER Reactivo](#reactivo-state_manager) + - [Reactivo STATE_MANAGER](#reactivo-state_manager) - [Más detalles sobre la gestión del estado.](#más-detalles-sobre-la-gestión-del-estado) - - [Explicación en video sobre state management](#video-explanation-about-state-management) + - [Explicación en video sobre state management](#explicación-en-video-sobre-state-management) - [Gestión de Rutas](#gestión-de-rutas) - [Más detalles sobre la gestión de rutas.](#más-detalles-sobre-la-gestión-de-rutas) - - [Explicación del video](#video-explanation) + - [Explicación del video](#explicación-del-video) - [Gestión de dependencias](#gestión-de-dependencias) - [Más detalles sobre la gestión de dependencias.](#más-detalles-sobre-la-gestión-de-dependencias) -- [Utilidades](#utils) +- [Utilidades](#utilidades) - [Cambiar de tema](#cambiar-de-tema) - [Otras API avanzadas y configuraciones manuales](#otras-api-avanzadas-y-configuraciones-manuales) - [Configuraciones globales opcionales](#configuraciones-globales-opcionales) - - [Explicación en video de Other GetX Features](#video-explanation-of-other-getx-features) + - [Video explanation of Other GetX Features](#video-explanation-of-other-getx-features) - [Rompiendo cambios desde 2.0](#rompiendo-cambios-desde-20) - [¿Por qué Getx?](#por-qué-getx) @@ -155,7 +155,7 @@ class Other extends StatelessWidget { Resultado: -![](counter-app-gif.gif) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) Este es un proyecto simple pero ya deja en claro cuán poderoso es GetX. A medida que su proyecto crezca, esta diferencia se volverá más significativa. GetX fue diseñado para trabajar con equipos, pero también simplifica el trabajo de un desarrollador individual. Mejore sus plazos, entregue todo a tiempo, sin perder rendimiento. GetX no es para todos, pero si te identificaste con esa frase, ¡GET es para ti! diff --git a/README.md b/README.md index 12f13aa14..e9a90018f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![](get.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) _Languages: English (this file), [Chinese](README.zh-cn.md), [Brazilian Portuguese](README.pt-br.md), [Spanish](README-es.md),[Polish](README.pl.md)._ @@ -13,7 +13,7 @@ _Languages: English (this file), [Chinese](README.zh-cn.md), [Brazilian Portugue Buy Me A Coffee -![](getx.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) - [About Get](#about-get) - [Installing](#installing) @@ -148,7 +148,7 @@ class Other extends StatelessWidget { Result: -![](counter-app-gif.gif) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) This is a simple project but it already makes clear how powerful Get is. As your project grows, this difference will become more significant. diff --git a/README.pl.md b/README.pl.md index 3183de2f0..dfd71d0c8 100644 --- a/README.pl.md +++ b/README.pl.md @@ -1,4 +1,4 @@ -![](get.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) *Languages: [English](README.md), [Język chiński](README.zh-cn.md), [Brazilian Portuguese](README.pt-br.md), [Spanish](README-es.md), Polish (Jesteś tu).* @@ -14,28 +14,28 @@ Buy Me A Coffee -![](getx.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) - [Kanały komunikacji i wsparcia:](#kanały-komunikacji-i-wsparcia) - [Wprowadzenie](#wprowadzenie) - [Instalacja](#instalacja) - [Counter App z GetX](#counter-app-z-getx) -- [Trzy fialary](#trzy-filary) +- [Trzy filary](#trzy-filary) - [Menadżer stanu](#menadżer-stanu) - [Reaktywny menadżer stanu](#reaktywny-menadżer-stanu) - [Bardziej szczegółowo o menadżerze stanu](#bardziej-szczegółowo-o-menadżerze-stanu) - [Video tłumaczące użycie menadżera stanu](#video-tłumaczące-użycie-menadżera-stanu) - - [Zarzadzanie routami](#zarządzanie-routami) + - [Zarządzanie routami](#zarządzanie-routami) - [Więcej o routach](#więcej-o-routach) - [Video tłumaczące użycie](#video-tłumaczące-użycie) - [Zarządzanie dependencies](#zarządzanie-dependencies) - - [Bardziej szczefółowo o menadżerze dependencies](#bardziej-szczegółowo-o-menadżerze-dependencies) + - [Bardziej szczegółowo o menadżerze dependencies](#bardziej-szczegółowo-o-menadżerze-dependencies) - [Jak włożyć coś od siebie](#jak-włożyć-coś-od-siebie) - [Narzędzia](#narzędzia) - [Zmiana motywu](#zmiana-motywu) - - [Inne zaawansowane API](#inne-zaawansowane-api) + - [Inne zaawansowane API](#inne-zaawansowane-api) - [Opcjonalne globalne ustawienia i manualna konfiguracja](#opcjonalne-globalne-ustawienia-i-manualna-konfiguracja) - - [Video tłumaczace inne funkcjonalności GetX](#video-tłumaczące-inne-funkcjonalności-getx) + - [Video tłumaczące inne funkcjonalności GetX](#video-tłumaczące-inne-funkcjonalności-getx) - [Zmiany od 2.0](#zmiany-od-20) @@ -130,7 +130,7 @@ class Other extends StatelessWidget { ``` Wynik: -![](counter-app-gif.gif) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) Jest to prosty projekt, ale już na jego przykładzie widać potęgę Get. Wzraz ze wzrostem rozmiaru aplikacji ta różnica tylko się powieksza. diff --git a/README.pt-br.md b/README.pt-br.md index 2912a1a18..88c2cb1d0 100644 --- a/README.pt-br.md +++ b/README.pt-br.md @@ -1,4 +1,4 @@ -![](get.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) *Idiomas: [Inglês](README.md), [Língua chinesa](README.zh-cn.md), Português Brasileiro (este arquivo), [Espanhol](README-es.md), [Polaco](README.pl.md).* @@ -14,7 +14,7 @@ Buy Me A Coffee -![](getx.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png)

Pedimos desculpas por qualquer parte não traduzida aqui. O GetX™ é atualizado com muita frequência e as traduções podem não vir ao mesmo tempo. Então, para manter essa documentação pelo menos com tudo que a versão em inglês tem, eu vou deixar todos os textos não-traduzidos aqui (eu considero que é melhor ele estar lá em inglês do que não estar), então se alguém quiser traduzir, seria muito útil 😁

@@ -36,7 +36,7 @@ - [Traduções](#traduções) - [Usando traduções](#usando-traduções) - [Localidade](#localidade) - - [Alterar Local](#alterar-local) + - [Alterar local](#alterar-local) - [Localidade do sistema operacional](#localidade-do-sistema-operacional) - [Mudar tema (changeTheme)](#mudar-tema-changetheme) - [Outras APIs avançadas](#outras-apis-avançadas) @@ -44,17 +44,17 @@ - [Widgets de Estado Local](#widgets-de-estado-local) - [ValueBuilder](#valuebuilder) - [ObxValue](#obxvalue) + - [Explicação em vídeo sobre Outras Features do GetX](#explicação-em-vídeo-sobre-outras-features-do-getx) - [Dicas Úteis](#dicas-úteis) - [GetView](#getview) - [GetWidget](#getwidget) - [GetxService](#getxservice) - - [Explicação em vídeo sobre Outras Features do GetX](#explicação-em-vídeo-sobre-outras-features-do-getx) - [Breaking Changes da versão 2 para 3](#breaking-changes-da-versão-2-para-3) - [Tipagem Rx](#tipagem-rx) - [RxController e GetBuilder se uniram](#rxcontroller-e-getbuilder-se-uniram) - [Rotas nomeadas](#rotas-nomeadas) - - [Porque essa mudança](#porque-essa-mudança) -- [Por que GetX?](#por-que-getx) + - [Porque essa mudança?](#porque-essa-mudança) +- [Por que GetX™?](#por-que-getx) - [Comunidade](#comunidade) - [Canais da comunidade](#canais-da-comunidade) - [Como contribuir](#como-contribuir) @@ -147,7 +147,7 @@ class Outra extends StatelessWidget { Resultado: -![](counter-app-gif.gif) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) Esse é um projeto simples mas já deixa claro o quão poderoso o Get é. Enquanto seu projeto cresce, essa diferença se torna bem mais significante. @@ -824,14 +824,14 @@ o ciclo de vida de seu aplicativo, use GetxService. ## Tipagem Rx -| Antes | Depois | -| -------- | ---------- | -| StringX | `RxString` | -| IntX | `RxInt` | -| MapX | `RxMap` | -| ListX | `RxList` | -| NumX | `RxNum` | -| DoubleX | `RxDouble` | +| Antes | Depois | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | ## RxController e GetBuilder se uniram diff --git a/README.zh-cn.md b/README.zh-cn.md index c5e6d4346..3b27edb81 100644 --- a/README.zh-cn.md +++ b/README.zh-cn.md @@ -1,4 +1,4 @@ -![](get.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) _语言: 中文, [英文](README.md), [巴西葡萄牙语](README.pt-br.md), [西班牙语](README-es.md), [波兰语](README.pl.md)_ @@ -13,11 +13,11 @@ _语言: 中文, [英文](README.md), [巴西葡萄牙语](README.pt-br.md), [ Buy Me A Coffee -![](getx.png) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) -- [关于 Get](#关于Get) +- [关于Get](#关于get) - [安装](#安装) -- [GetX 的计数器示例](#GetX的计数器示例) +- [GetX的计数器示例](#getx的计数器示例) - [三大功能](#三大功能) - [状态管理](#状态管理) - [响应式状态管理器](#响应式状态管理器) @@ -34,7 +34,7 @@ _语言: 中文, [英文](README.md), [巴西葡萄牙语](README.pt-br.md), [ - [改变语言](#改变语言) - [系统语言](#系统语言) - [改变主题](#改变主题) - - [其他高级API](#其他高级API) + - [其他高级API](#其他高级api) - [可选的全局设置和手动配置](#可选的全局设置和手动配置) - [局部状态组件](#局部状态组件) - [ValueBuilder](#valuebuilder) @@ -43,10 +43,10 @@ _语言: 中文, [英文](README.md), [巴西葡萄牙语](README.pt-br.md), [ - [GetView](#getview) - [GetWidget](#getwidget) - [GetxService](#getxservice) -- [从2.0开始的兼容性变化](#从2.0开始的兼容性变化) -- [为什么选择Getx?](#为什么选择Getx?) +- [从2.0开始的兼容性变化](#从20开始的兼容性变化) +- [为什么选择Getx?](#为什么选择getx) - [社区](#社区) - - [社区频道](#社区频道) + - [社区渠道](#社区渠道) - [如何做贡献](#如何做贡献) - [文章和视频](#文章和视频) @@ -151,7 +151,7 @@ class Other extends StatelessWidget { 结果: -![](counter-app-gif.gif) +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) 这是一个简单的项目,但它已经让人明白Get的强大。随着项目的发展,这种差异将变得更加显著。 diff --git a/counter-app-gif.gif b/counter-app-gif.gif deleted file mode 100644 index d4b7fc7eff46d462836836ff7a8750c7d4ae403c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148078 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

;#mS?w{( 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 diff --git a/example/android/.gitignore b/example/android/.gitignore deleted file mode 100644 index 0a741cb43..000000000 --- a/example/android/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle deleted file mode 100644 index c04b826b6..000000000 --- a/example/android/app/build.gradle +++ /dev/null @@ -1,63 +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 29 - - 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 "getx.demo.app.example" - minSdkVersion 16 - targetSdkVersion 29 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -} diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 1172bc4d2..000000000 --- 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 af0bcf2c2..000000000 --- a/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/example/android/app/src/main/kotlin/getx/demo/app/example/MainActivity.kt b/example/android/app/src/main/kotlin/getx/demo/app/example/MainActivity.kt deleted file mode 100644 index b51fd2c8c..000000000 --- a/example/android/app/src/main/kotlin/getx/demo/app/example/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package getx.demo.app.example - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} 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 304732f88..000000000 --- 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 db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ 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 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ 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 d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof 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 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` 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 1f83a33fd..000000000 --- a/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +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 1172bc4d2..000000000 --- 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 3100ad2d5..000000000 --- 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 a6738207f..000000000 --- a/example/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true -android.enableR8=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 296b146b7..000000000 --- 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 44e62bcf0..000000000 --- a/example/android/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -include ':app' - -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() - -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } - -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/example/linux/.gitignore b/example/linux/.gitignore deleted file mode 100644 index d3896c984..000000000 --- a/example/linux/.gitignore +++ /dev/null @@ -1 +0,0 @@ -flutter/ephemeral diff --git a/example/linux/CMakeLists.txt b/example/linux/CMakeLists.txt deleted file mode 100644 index 632fd41a8..000000000 --- a/example/linux/CMakeLists.txt +++ /dev/null @@ -1,106 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(runner LANGUAGES CXX) - -set(BINARY_NAME "example") -set(APPLICATION_ID "getx.demo.app.example") - -cmake_policy(SET CMP0063 NEW) - -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Configure build options. -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") -endif() - -# Compilation settings that should be applied to most targets. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_14) - target_compile_options(${TARGET} PRIVATE -Wall -Werror) - target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") - target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") -endfunction() - -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") - -# Flutter library and tool build rules. -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) - -add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") - -# Application build -add_executable(${BINARY_NAME} - "main.cc" - "my_application.cc" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" -) -apply_standard_settings(${BINARY_NAME}) -target_link_libraries(${BINARY_NAME} PRIVATE flutter) -target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) -add_dependencies(${BINARY_NAME} flutter_assemble) -# Only the install-generated bundle's copy of the executable will launch -# correctly, since the resources must in the right relative locations. To avoid -# people trying to run the unbundled copy, put it in a subdirectory instead of -# the default top-level location. -set_target_properties(${BINARY_NAME} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" -) - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# By default, "installing" just makes a relocatable bundle in the build -# directory. -set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -# Start with a clean build bundle directory every time. -install(CODE " - file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") - " COMPONENT Runtime) - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -if(PLUGIN_BUNDLED_LIBRARIES) - install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") - install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() diff --git a/example/linux/flutter/CMakeLists.txt b/example/linux/flutter/CMakeLists.txt deleted file mode 100644 index 4f48a7ced..000000000 --- a/example/linux/flutter/CMakeLists.txt +++ /dev/null @@ -1,88 +0,0 @@ -cmake_minimum_required(VERSION 3.10) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. - -# Serves the same purpose as list(TRANSFORM ... PREPEND ...), -# which isn't available in 3.10. -function(list_prepend LIST_NAME PREFIX) - set(NEW_LIST "") - foreach(element ${${LIST_NAME}}) - list(APPEND NEW_LIST "${PREFIX}${element}") - endforeach(element) - set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) -endfunction() - -# === Flutter Library === -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) -pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) -pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) -pkg_check_modules(BLKID REQUIRED IMPORTED_TARGET blkid) - -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "fl_basic_message_channel.h" - "fl_binary_codec.h" - "fl_binary_messenger.h" - "fl_dart_project.h" - "fl_engine.h" - "fl_json_message_codec.h" - "fl_json_method_codec.h" - "fl_message_codec.h" - "fl_method_call.h" - "fl_method_channel.h" - "fl_method_codec.h" - "fl_method_response.h" - "fl_plugin_registrar.h" - "fl_plugin_registry.h" - "fl_standard_message_codec.h" - "fl_standard_method_codec.h" - "fl_string_codec.h" - "fl_value.h" - "fl_view.h" - "flutter_linux.h" -) -list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") -target_link_libraries(flutter INTERFACE - PkgConfig::GTK - PkgConfig::GLIB - PkgConfig::GIO - PkgConfig::BLKID -) -add_dependencies(flutter flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CMAKE_CURRENT_BINARY_DIR}/_phony_ - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" - linux-x64 ${CMAKE_BUILD_TYPE} -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} -) diff --git a/example/linux/flutter/generated_plugin_registrant.cc b/example/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index d38195aa0..000000000 --- a/example/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,9 +0,0 @@ -// -// Generated file. Do not edit. -// - -#include "generated_plugin_registrant.h" - - -void fl_register_plugins(FlPluginRegistry* registry) { -} diff --git a/example/linux/flutter/generated_plugin_registrant.h b/example/linux/flutter/generated_plugin_registrant.h deleted file mode 100644 index 9bf747894..000000000 --- a/example/linux/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// Generated file. Do not edit. -// - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void fl_register_plugins(FlPluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/example/linux/flutter/generated_plugins.cmake b/example/linux/flutter/generated_plugins.cmake deleted file mode 100644 index 51436ae8c..000000000 --- a/example/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) diff --git a/example/linux/main.cc b/example/linux/main.cc deleted file mode 100644 index 058e6178f..000000000 --- a/example/linux/main.cc +++ /dev/null @@ -1,10 +0,0 @@ -#include "my_application.h" - -int main(int argc, char** argv) { - // Only X11 is currently supported. - // Wayland support is being developed: https://github.com/flutter/flutter/issues/57932. - gdk_set_allowed_backends("x11"); - - g_autoptr(MyApplication) app = my_application_new(); - return g_application_run(G_APPLICATION(app), argc, argv); -} diff --git a/example/linux/my_application.cc b/example/linux/my_application.cc deleted file mode 100644 index f28ca3094..000000000 --- a/example/linux/my_application.cc +++ /dev/null @@ -1,46 +0,0 @@ -#include "my_application.h" - -#include - -#include "flutter/generated_plugin_registrant.h" - -struct _MyApplication { - GtkApplication parent_instance; -}; - -G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) - -// Implements GApplication::activate. -static void my_application_activate(GApplication* application) { - GtkWindow* window = - GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); - gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "example"); - gtk_header_bar_set_show_close_button(header_bar, TRUE); - gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); - gtk_window_set_default_size(window, 1280, 720); - gtk_widget_show(GTK_WIDGET(window)); - - g_autoptr(FlDartProject) project = fl_dart_project_new(); - - FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); - - fl_register_plugins(FL_PLUGIN_REGISTRY(view)); - - gtk_widget_grab_focus(GTK_WIDGET(view)); -} - -static void my_application_class_init(MyApplicationClass* klass) { - G_APPLICATION_CLASS(klass)->activate = my_application_activate; -} - -static void my_application_init(MyApplication* self) {} - -MyApplication* my_application_new() { - return MY_APPLICATION(g_object_new(my_application_get_type(), - "application-id", APPLICATION_ID, - nullptr)); -} diff --git a/example/linux/my_application.h b/example/linux/my_application.h deleted file mode 100644 index 72271d5e4..000000000 --- a/example/linux/my_application.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef FLUTTER_MY_APPLICATION_H_ -#define FLUTTER_MY_APPLICATION_H_ - -#include - -G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, - GtkApplication) - -/** - * my_application_new: - * - * Creates a new Flutter-based application. - * - * Returns: a new #MyApplication. - */ -MyApplication* my_application_new(); - -#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 1dcc58f03..e846e5ded 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -27,16 +27,14 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. get: - git: - url: git://github.com/jonataslaw/getx.git - path: getx - ref: master + path: ../ dio: ^3.0.9 - get_test: - git: - url: git://github.com/jonataslaw/getx.git - path: packages/get_test - ref: master + get_test: ^3.13.2 + +dependency_overrides: + get: + path: ../ + dev_dependencies: flutter_test: sdk: flutter diff --git a/example/web/favicon.png b/example/web/favicon.png deleted file mode 100644 index 8aaa46ac1ae21512746f852a42ba87e4165dfdd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM diff --git a/example/web/icons/Icon-192.png b/example/web/icons/Icon-192.png deleted file mode 100644 index b749bfef07473333cf1dd31e9eed89862a5d52aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5292 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 diff --git a/example/web/icons/Icon-512.png b/example/web/icons/Icon-512.png deleted file mode 100644 index 88cfd48dff1169879ba46840804b412fe02fefd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8252 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 diff --git a/example/web/index.html b/example/web/index.html deleted file mode 100644 index a0c14606f..000000000 --- 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 8c012917d..000000000 --- a/example/web/manifest.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "example", - "short_name": "example", - "start_url": ".", - "display": "standalone", - "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/get.png b/get.png deleted file mode 100644 index e08f5e7ca4054a133d1cd3ccfd961c5c7a7a3ba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117778 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 {ThirU5R^5?sv98J0ZLO^3b^xC>ZH zd^zdLR{5dHJ65m+Qwcl?6IQ-iP(%`ooFn-3Ff-UZBnYvbME6A5*eedJVjV*HZNV;<_~I5HC@JOdgb`AG1^6)=3$*ICB`JW4cHxEC&3crB7=P8wHvzI@WPH4 zvd9`P6zK*N11H5}k170eltjzW&25?}kN2A>kr+yUEJ8Uwg1ZZU

Lru3RjPO}n&2 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

)apPpfU8Hq{K^j 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 z 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 diff --git a/lib/get_navigation/src/routes/default_transitions.dart b/lib/get_navigation/src/routes/default_transitions.dart index 992c3914a..02947e7ab 100644 --- a/lib/get_navigation/src/routes/default_transitions.dart +++ b/lib/get_navigation/src/routes/default_transitions.dart @@ -184,4 +184,3 @@ class SizeTransitions { ); } } - diff --git a/lib/get_rx/src/rx_core/rx_impl.dart b/lib/get_rx/src/rx_core/rx_impl.dart index 6c1e66e72..269287d29 100644 --- a/lib/get_rx/src/rx_core/rx_impl.dart +++ b/lib/get_rx/src/rx_core/rx_impl.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'dart:collection'; -import 'package:meta/meta.dart'; +import 'package:flutter/foundation.dart'; import '../rx_core/rx_interface.dart'; part 'rx_num.dart'; diff --git a/lib/get_rx/src/rx_iterables/rx_list.dart b/lib/get_rx/src/rx_iterables/rx_list.dart index f9563cf94..68c0dd5af 100644 --- a/lib/get_rx/src/rx_iterables/rx_list.dart +++ b/lib/get_rx/src/rx_iterables/rx_list.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:collection'; import 'dart:math'; -import 'package:meta/meta.dart'; +import 'package:flutter/foundation.dart'; import '../rx_core/rx_impl.dart'; import '../rx_core/rx_interface.dart'; diff --git a/lib/get_rx/src/rx_iterables/rx_map.dart b/lib/get_rx/src/rx_iterables/rx_map.dart index c9b9c26df..ffae94d71 100644 --- a/lib/get_rx/src/rx_iterables/rx_map.dart +++ b/lib/get_rx/src/rx_iterables/rx_map.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:collection'; -import 'package:meta/meta.dart'; - +import 'package:flutter/foundation.dart'; import '../rx_core/rx_impl.dart'; import '../rx_core/rx_interface.dart'; import '../rx_typedefs/rx_typedefs.dart'; diff --git a/lib/get_rx/src/rx_iterables/rx_set.dart b/lib/get_rx/src/rx_iterables/rx_set.dart index d621d6686..b78c23cb5 100644 --- a/lib/get_rx/src/rx_iterables/rx_set.dart +++ b/lib/get_rx/src/rx_iterables/rx_set.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'dart:collection'; -import 'package:meta/meta.dart'; +import 'package:flutter/foundation.dart'; import '../rx_core/rx_impl.dart'; import '../rx_core/rx_interface.dart'; diff --git a/logo-no-background.png b/logo-no-background.png deleted file mode 100644 index a8ddd3cfbb00fb4de3f59dab21fdf90aa4819f5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75588 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 diff --git a/packages/get_core/.gitignore b/packages/get_core/.gitignore deleted file mode 100644 index 1985397a2..000000000 --- a/packages/get_core/.gitignore +++ /dev/null @@ -1,74 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 diff --git a/packages/get_core/.metadata b/packages/get_core/.metadata deleted file mode 100644 index 3207f67d3..000000000 --- a/packages/get_core/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: a27c242b0eea731317cfec5bbdd9d35452ab3ecb - channel: dev - -project_type: package diff --git a/packages/get_core/CHANGELOG.md b/packages/get_core/CHANGELOG.md deleted file mode 100644 index 57b4e07ed..000000000 --- a/packages/get_core/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -## [3.13.0] -* Bump to Get 3.13.0 - -## [3.12.0] -* Bump to Get 3.12.0 - -## [3.10.2] - -* Initial release diff --git a/packages/get_core/LICENSE b/packages/get_core/LICENSE deleted file mode 100644 index 2fb920baf..000000000 --- a/packages/get_core/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jonny Borges - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/get_core/README.md b/packages/get_core/README.md deleted file mode 100644 index ffd72c852..000000000 --- a/packages/get_core/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# get_core - -A new Flutter package project. - -## Getting Started - -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/packages/get_core/analysis_options.yaml b/packages/get_core/analysis_options.yaml deleted file mode 100644 index 38018b421..000000000 --- a/packages/get_core/analysis_options.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# Include option is buggy: -# https://github.com/flutter/flutter/issues/62591 -# In case the include issue gets fixed, lines below INCLUDE_FIX -# can be removed - -# include: package:effective_dart/analysis_options.1.2.0.yaml -analyzer: - strong-mode: - implicit-casts: false -linter: - rules: - await_only_futures: true - # This one is desirable, but that's a lot of work for now - public_member_api_docs: false - # Desirable, but would be breaking changes: - avoid_positional_boolean_parameters: false - constant_identifier_names: false - include_file_not_found: false - - # INCLUDE_FIX (copy of effective dart 1.2.0) - # STYLE - camel_case_types: true - camel_case_extensions: true - library_names: true - file_names: true - library_prefixes: true - non_constant_identifier_names: true - directives_ordering: true - lines_longer_than_80_chars: true # avoid - curly_braces_in_flow_control_structures: true - - # DOCUMENTATION - slash_for_doc_comments: true - package_api_docs: true # prefer - #- comment_references # Unused because https://github.com/dart-lang/sdk/issues/36974 - - # USAGE - implementation_imports: true - avoid_relative_lib_imports: true # prefer - prefer_relative_imports: true # prefer - prefer_adjacent_string_concatenation: true - prefer_interpolation_to_compose_strings: true # prefer - unnecessary_brace_in_string_interps: true # avoid - prefer_collection_literals: true - avoid_function_literals_in_foreach_calls: true # avoid - prefer_iterable_whereType: true - prefer_function_declarations_over_variables: true - unnecessary_lambdas: true - prefer_equal_for_default_values: true - avoid_init_to_null: true - unnecessary_getters_setters: true - #- unnecessary_getters # prefer # Disabled pending fix: https://github.com/dart-lang/linter/issues/23 - #- prefer_expression_function_bodies # consider - unnecessary_this: true - prefer_initializing_formals: true - type_init_formals: true - empty_constructor_bodies: true - unnecessary_new: true - unnecessary_const: true - avoid_catches_without_on_clauses: true # avoid - avoid_catching_errors: true - use_rethrow_when_possible: true - - # DESIGN - use_to_and_as_if_applicable: true # prefer - one_member_abstracts: true # avoid - avoid_classes_with_only_static_members: true # avoid - prefer_mixin: true - prefer_final_fields: true # prefer - use_setters_to_change_properties: true - avoid_setters_without_getters: true - avoid_returning_null: true # avoid - avoid_returning_this: true # avoid - type_annotate_public_apis: true # prefer - #- prefer_typing_uninitialized_variables # consider - omit_local_variable_types: true # avoid - avoid_types_on_closure_parameters: true # avoid - avoid_return_types_on_setters: true # avoid - prefer_generic_function_type_aliases: true - avoid_private_typedef_functions: true # prefer - #- use_function_type_syntax_for_parameters # consider - hash_and_equals: true - avoid_equals_and_hash_code_on_mutable_classes: true # avoid - avoid_null_checks_in_equality_operators: true - diff --git a/packages/get_core/lib/get_core.dart b/packages/get_core/lib/get_core.dart deleted file mode 100644 index f2361e782..000000000 --- a/packages/get_core/lib/get_core.dart +++ /dev/null @@ -1,7 +0,0 @@ -library get_core; - -export 'src/get_interface.dart'; -export 'src/get_main.dart'; -export 'src/log.dart'; - -export 'src/smart_management.dart'; diff --git a/packages/get_core/lib/src/get_interface.dart b/packages/get_core/lib/src/get_interface.dart deleted file mode 100644 index 044e22e16..000000000 --- a/packages/get_core/lib/src/get_interface.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'log.dart'; -import 'smart_management.dart'; - -/// GetInterface allows any auxiliary package to be merged into the "Get" -/// class through extensions -abstract class GetInterface { - SmartManagement smartManagement = SmartManagement.full; - String reference; - bool isLogEnable = true; - LogWriterCallback log = defaultLogWriterCallback; -} diff --git a/packages/get_core/lib/src/get_main.dart b/packages/get_core/lib/src/get_main.dart deleted file mode 100644 index cab2be9ac..000000000 --- a/packages/get_core/lib/src/get_main.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'get_interface.dart'; - -///Use to instead of Navigator.push, off instead of Navigator.pushReplacement, -///offAll instead of Navigator.pushAndRemoveUntil. For named routes just -///add "named" after them. Example: toNamed, offNamed, and AllNamed. -///To return to the previous screen, use back(). -///No need to pass any context to Get, just put the name of the route inside -///the parentheses and the magic will occur. -class _GetImpl extends GetInterface {} - -// ignore: non_constant_identifier_names -final Get = _GetImpl(); diff --git a/packages/get_core/lib/src/log.dart b/packages/get_core/lib/src/log.dart deleted file mode 100644 index 0af9108c5..000000000 --- a/packages/get_core/lib/src/log.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'dart:developer' as developer; -import 'get_main.dart'; - -///Voidcallback from logs -typedef LogWriterCallback = void Function(String text, {bool isError}); - -/// default logger from GetX -void defaultLogWriterCallback(String value, {bool isError = false}) { - if (isError || Get.isLogEnable) developer.log(value, name: 'GETX'); -} diff --git a/packages/get_core/lib/src/smart_management.dart b/packages/get_core/lib/src/smart_management.dart deleted file mode 100644 index c4f06418c..000000000 --- a/packages/get_core/lib/src/smart_management.dart +++ /dev/null @@ -1,22 +0,0 @@ -/// GetX by default disposes unused controllers from memory, -/// Through different behaviors. -/// SmartManagement.full -/// [SmartManagement.full] is the default one. Dispose classes that are -/// not being used and were not set to be permanent. In the majority -/// of the cases you will want to keep this config untouched. -/// If you new to GetX then don't change this. -/// [SmartManagement.onlyBuilders] only controllers started in init: -/// or loaded into a Binding with Get.lazyPut() will be disposed. If you use -/// Get.put() or Get.putAsync() or any other approach, SmartManagement -/// will not have permissions to exclude this dependency. With the default -/// behavior, even widgets instantiated with "Get.put" will be removed, -/// unlike SmartManagement.onlyBuilders. -/// [SmartManagement.keepFactory]Just like SmartManagement.full, -/// it will remove it's dependencies when it's not being used anymore. -/// However, it will keep their factory, which means it will recreate -/// the dependency if you need that instance again. -enum SmartManagement { - full, - onlyBuilder, - keepFactory, -} diff --git a/packages/get_core/pubspec.yaml b/packages/get_core/pubspec.yaml deleted file mode 100644 index 8cc83818f..000000000 --- a/packages/get_core/pubspec.yaml +++ /dev/null @@ -1,50 +0,0 @@ -name: get_core -description: A base package from allow use resources from GetX™ framework. -version: 3.13.0 -homepage: https://github.com/jonataslaw/getx - -environment: - sdk: ">=2.7.0 <3.0.0" - -dependencies: - - -dev_dependencies: - - -# 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 diff --git a/packages/get_instance/.gitignore b/packages/get_instance/.gitignore deleted file mode 100644 index 1985397a2..000000000 --- a/packages/get_instance/.gitignore +++ /dev/null @@ -1,74 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 diff --git a/packages/get_instance/.metadata b/packages/get_instance/.metadata deleted file mode 100644 index 3207f67d3..000000000 --- a/packages/get_instance/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: a27c242b0eea731317cfec5bbdd9d35452ab3ecb - channel: dev - -project_type: package diff --git a/packages/get_instance/CHANGELOG.md b/packages/get_instance/CHANGELOG.md deleted file mode 100644 index 4cb259062..000000000 --- a/packages/get_instance/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -## [3.13.0] -* Bump to Get 3.13.0 - -## [3.12.0] -* Bump to Get 3.12.0 - -## [3.10.2] -- Initial release diff --git a/packages/get_instance/LICENSE b/packages/get_instance/LICENSE deleted file mode 100644 index 2fb920baf..000000000 --- a/packages/get_instance/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jonny Borges - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/get_instance/README.md b/packages/get_instance/README.md deleted file mode 100644 index 2e2d26468..000000000 --- a/packages/get_instance/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# get_instance - -A new Flutter package project. - -## Getting Started - -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/packages/get_instance/analysis_options.yaml b/packages/get_instance/analysis_options.yaml deleted file mode 100644 index 38018b421..000000000 --- a/packages/get_instance/analysis_options.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# Include option is buggy: -# https://github.com/flutter/flutter/issues/62591 -# In case the include issue gets fixed, lines below INCLUDE_FIX -# can be removed - -# include: package:effective_dart/analysis_options.1.2.0.yaml -analyzer: - strong-mode: - implicit-casts: false -linter: - rules: - await_only_futures: true - # This one is desirable, but that's a lot of work for now - public_member_api_docs: false - # Desirable, but would be breaking changes: - avoid_positional_boolean_parameters: false - constant_identifier_names: false - include_file_not_found: false - - # INCLUDE_FIX (copy of effective dart 1.2.0) - # STYLE - camel_case_types: true - camel_case_extensions: true - library_names: true - file_names: true - library_prefixes: true - non_constant_identifier_names: true - directives_ordering: true - lines_longer_than_80_chars: true # avoid - curly_braces_in_flow_control_structures: true - - # DOCUMENTATION - slash_for_doc_comments: true - package_api_docs: true # prefer - #- comment_references # Unused because https://github.com/dart-lang/sdk/issues/36974 - - # USAGE - implementation_imports: true - avoid_relative_lib_imports: true # prefer - prefer_relative_imports: true # prefer - prefer_adjacent_string_concatenation: true - prefer_interpolation_to_compose_strings: true # prefer - unnecessary_brace_in_string_interps: true # avoid - prefer_collection_literals: true - avoid_function_literals_in_foreach_calls: true # avoid - prefer_iterable_whereType: true - prefer_function_declarations_over_variables: true - unnecessary_lambdas: true - prefer_equal_for_default_values: true - avoid_init_to_null: true - unnecessary_getters_setters: true - #- unnecessary_getters # prefer # Disabled pending fix: https://github.com/dart-lang/linter/issues/23 - #- prefer_expression_function_bodies # consider - unnecessary_this: true - prefer_initializing_formals: true - type_init_formals: true - empty_constructor_bodies: true - unnecessary_new: true - unnecessary_const: true - avoid_catches_without_on_clauses: true # avoid - avoid_catching_errors: true - use_rethrow_when_possible: true - - # DESIGN - use_to_and_as_if_applicable: true # prefer - one_member_abstracts: true # avoid - avoid_classes_with_only_static_members: true # avoid - prefer_mixin: true - prefer_final_fields: true # prefer - use_setters_to_change_properties: true - avoid_setters_without_getters: true - avoid_returning_null: true # avoid - avoid_returning_this: true # avoid - type_annotate_public_apis: true # prefer - #- prefer_typing_uninitialized_variables # consider - omit_local_variable_types: true # avoid - avoid_types_on_closure_parameters: true # avoid - avoid_return_types_on_setters: true # avoid - prefer_generic_function_type_aliases: true - avoid_private_typedef_functions: true # prefer - #- use_function_type_syntax_for_parameters # consider - hash_and_equals: true - avoid_equals_and_hash_code_on_mutable_classes: true # avoid - avoid_null_checks_in_equality_operators: true - diff --git a/packages/get_instance/example/main.dart b/packages/get_instance/example/main.dart deleted file mode 100644 index 84019aeb3..000000000 --- a/packages/get_instance/example/main.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:get_instance/get_instance.dart'; - -void main() { - Get.put(Foo()); - - final foo = Get.find(); - final foo2 = Get.find(); - print(foo == foo2); // true -} - -class Foo {} diff --git a/packages/get_instance/lib/get_instance.dart b/packages/get_instance/lib/get_instance.dart deleted file mode 100644 index fe4dc8a0a..000000000 --- a/packages/get_instance/lib/get_instance.dart +++ /dev/null @@ -1,5 +0,0 @@ -export 'package:get_core/get_core.dart'; -export 'src/bindings_interface.dart'; -export 'src/extension_instance.dart'; -export 'src/get_instance.dart'; -export 'src/lifecycle.dart'; diff --git a/packages/get_instance/lib/src/bindings_interface.dart b/packages/get_instance/lib/src/bindings_interface.dart deleted file mode 100644 index b7b9cc75c..000000000 --- a/packages/get_instance/lib/src/bindings_interface.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'get_instance.dart'; - -/// [Bindings] should be extended or implemented. -/// When using [GetMaterialApp], all [GetPage]s and navigation -/// methods (like Get.to()) have a [binding] property that takes an -/// instance of Bindings to manage the -/// dependencies() (via [Get.put()]) for the Route you are opening. -// ignore: one_member_abstracts -abstract class Bindings { - void dependencies(); -} - -/// Simplifies Bindings generation from a single callback. -/// To avoid the creation of a custom Binding instance per route. -/// -/// Example: -/// ``` -/// GetPage( -/// name: '/', -/// page: () => Home(), -/// // This might cause you an error. -/// // binding: BindingsBuilder(() => Get.put(HomeController())), -/// binding: BindingsBuilder(() { Get.put(HomeController(); })), -/// // Using .lazyPut() works fine. -/// // binding: BindingsBuilder(() => Get.lazyPut(() => HomeController())), -/// ), -/// ``` -class BindingsBuilder extends Bindings { - /// Register your dependencies in the [builder] callback. - final BindingBuilderCallback builder; - - /// Shortcut to register 1 Controller with Get.put(), - /// Prevents the issue of the fat arrow function with the constructor. - /// BindingsBuilder(() => Get.put(HomeController())), - /// - /// Sample: - /// ``` - /// GetPage( - /// name: '/', - /// page: () => Home(), - /// binding: BindingsBuilder.put(() => HomeController()), - /// ), - /// ``` - factory BindingsBuilder.put(InstanceBuilderCallback builder, - {String tag, bool permanent = false}) { - return BindingsBuilder(() => GetInstance() - .put(null, tag: tag, permanent: permanent, builder: builder)); - } - - /// WARNING: don't use `()=> Get.put(Controller())`, - /// if only passing 1 callback use `BindingsBuilder.put(Controller())` - /// or `BindingsBuilder(()=> Get.lazyPut(Controller()))` - BindingsBuilder(this.builder); - - @override - void dependencies() { - builder(); - } -} - -// abstract class INavigation {} -// typedef Snack = Function(); -// typedef Modal = Function(); -// typedef Route = Function(); -typedef BindingBuilderCallback = void Function(); diff --git a/packages/get_instance/lib/src/extension_instance.dart b/packages/get_instance/lib/src/extension_instance.dart deleted file mode 100644 index 77b627eb1..000000000 --- a/packages/get_instance/lib/src/extension_instance.dart +++ /dev/null @@ -1,115 +0,0 @@ -import 'package:get_core/get_core.dart'; - -import 'get_instance.dart'; - -extension Inst on GetInterface { - /// Creates a new Instance lazily from the [builder()] callback. - /// - /// The first time you call [Get.find()], the [builder()] callback will create - /// the Instance and persisted as a Singleton (like you would use - /// [Get.put()]). - /// - /// Using [Get.smartManagement] as [SmartManagement.keepFactory] has - /// the same outcome - /// as using [fenix:true] : - /// The internal register of [builder()] will remain in memory to recreate - /// the Instance if the Instance has been removed with [Get.delete()]. - /// Therefore, future calls to [Get.find()] will return the same Instance. - /// - /// If you need to make use of GetxController's life-cycle - /// ([onInit(), onStart(), onClose()]) - /// [fenix] is a great choice to mix with [GetBuilder()] and [GetX()] widgets, - /// and/or [GetMaterialApp] Navigation. - /// - /// You could use [Get.lazyPut(fenix:true)] in your app's [main()] instead of - /// [Bindings()] for each [GetPage]. - /// And the memory management will be similar. - /// - /// Subsequent calls to [Get.lazyPut()] with the same parameters - /// (<[S]> and optionally [tag] will **not** override the original). - void lazyPut(InstanceBuilderCallback builder, - {String tag, bool fenix = false}) { - GetInstance().lazyPut(builder, tag: tag, fenix: fenix); - } - - /// async version of [Get.put()]. - /// Awaits for the resolution of the Future from [builder()] parameter and - /// stores the Instance returned. - Future putAsync(AsyncInstanceBuilderCallback builder, - {String tag, bool permanent = false}) async => - GetInstance().putAsync(builder, tag: tag, permanent: permanent); - - /// Creates a new Class Instance [S] from the builder callback[S]. - /// Every time [find]<[S]>() is used, it calls the builder method to generate - /// a new Instance [S]. - /// It also registers each [instance.onClose()] with the current - /// Route [GetConfig.currentRoute] to keep the lifecycle active. - /// Is important to know that the instances created are only stored per Route. - /// So, if you call `Get.delete()` the "instance factory" used in this - /// method ([Get.create()]) will be removed, but NOT the instances - /// already created by it. - /// Uses `tag` as the other methods. - /// - /// Example: - /// - /// ```create(() => Repl()); - /// Repl a = find(); - /// Repl b = find(); - /// print(a==b); (false)``` - void create(InstanceBuilderCallback builder, - {String tag, bool permanent = true}) => - GetInstance().create(builder, tag: tag, permanent: permanent); - - /// Finds a Instance of the required Class <[S]>(or [tag]) - /// In the case of using [Get.create()], it will generate an Instance - /// each time you call [Get.find()]. - S find({String tag}) => GetInstance().find(tag: tag); - - /// Injects an [Instance] in memory. - /// - /// No need to define the generic type <[S]> as it's inferred - /// from the [dependency] parameter. - /// - /// - [dependency] The Instance to be injected. - /// - [tag] optionally, use a [tag] as an "id" to create multiple records - /// of the same Type<[S]> the [tag] does **not** conflict with the same tags - /// used by other [dependencies] Types. - /// - [permanent] keeps the Instance in memory and persist it, - /// not following [Get.smartManagement] - /// rules. Although, can be removed by [GetInstance.reset()] - /// and [Get.delete()] - /// - [builder] If defined, the [dependency] must be returned from here - S put(S dependency, - {String tag, - bool permanent = false, - InstanceBuilderCallback builder}) => - GetInstance() - .put(dependency, tag: tag, permanent: permanent, builder: builder); - - /// Clears all registered instances (and/or tags). - /// Even the persistent ones. - /// - /// - [clearFactory] clears the callbacks registered by [Get.lazyPut()] - /// - [clearRouteBindings] clears Instances associated with Routes when using - /// [GetMaterialApp]. - bool reset({bool clearFactory = true, bool clearRouteBindings = true}) => - GetInstance().reset( - clearFactory: clearFactory, clearRouteBindings: clearRouteBindings); - - /// Deletes the Instance<[S]>, cleaning the memory and closes any open - /// controllers ([DisposableInterface]). - /// - /// - [tag] Optional "tag" used to register the Instance - /// - [force] Will delete an Instance even if marked as [permanent]. - Future delete({String tag, bool force = false}) async => - GetInstance().delete(tag: tag, force: force); - - /// Checks if a Class Instance<[S]> (or [tag]) is registered in memory. - /// - [tag] optional, if you use a [tag] to register the Instance. - bool isRegistered({String tag}) => GetInstance().isRegistered(tag: tag); - - /// Checks if an Instance<[S]> (or [tag]) returned from a factory builder - /// [Get.lazyPut()], is registered in memory. - /// - [tag] optional, if you use a [tag] to register the Instance. - bool isPrepared({String tag}) => GetInstance().isPrepared(tag: tag); -} diff --git a/packages/get_instance/lib/src/get_instance.dart b/packages/get_instance/lib/src/get_instance.dart deleted file mode 100644 index 8fecd9b55..000000000 --- a/packages/get_instance/lib/src/get_instance.dart +++ /dev/null @@ -1,420 +0,0 @@ -import 'dart:async'; -import 'dart:collection'; - -import 'package:get_core/get_core.dart'; - -import 'lifecycle.dart'; - -class GetInstance { - factory GetInstance() => _getInstance ??= GetInstance._(); - - const GetInstance._(); - - static GetInstance _getInstance; - - /// Holds references to every registered Instance when using - /// [Get.put()] - static final Map _singl = {}; - - /// Holds a reference to every registered callback when using - /// [Get.lazyPut()] - static final Map _factory = {}; - - /// Holds a reference to [Get.reference] when the Instance was - /// created to manage the memory. - static final Map _routesKey = {}; - - /// Stores the onClose() references of instances created with [Get.create()] - /// using the [Get.reference]. - /// Experimental feature to keep the lifecycle and memory management with - /// non-singleton instances. - static final Map> _routesByCreate = {}; - - /// Creates a new Instance lazily from the [builder()] callback. - /// - /// The first time you call [Get.find()], the [builder()] callback will create - /// the Instance and persisted as a Singleton (like you would - /// use [Get.put()]). - /// - /// Using [Get.smartManagement] as [SmartManagement.keepFactory] has - /// the same outcome as using [fenix:true] : - /// The internal register of [builder()] will remain in memory to recreate - /// the Instance if the Instance has been removed with [Get.delete()]. - /// Therefore, future calls to [Get.find()] will return the same Instance. - /// - /// If you need to make use of GetxController's life-cycle - /// ([onInit(), onStart(), onClose()]) [fenix] is a great choice to mix with - /// [GetBuilder()] and [GetX()] widgets, and/or [GetMaterialApp] Navigation. - /// - /// You could use [Get.lazyPut(fenix:true)] in your app's [main()] instead - /// of [Bindings()] for each [GetPage]. - /// And the memory management will be similar. - /// - /// Subsequent calls to [Get.lazyPut()] with the same parameters - /// (<[S]> and optionally [tag] will **not** override the original). - void lazyPut( - InstanceBuilderCallback builder, { - String tag, - bool fenix = false, - }) { - final key = _getKey(S, tag); - _factory.putIfAbsent(key, () => _Lazy(builder, fenix)); - } - - /// async version of [Get.put()]. - /// Awaits for the resolution of the Future from [builder()] parameter and - /// stores the Instance returned. - Future putAsync( - AsyncInstanceBuilderCallback builder, { - String tag, - bool permanent = false, - }) async { - return put(await builder(), tag: tag, permanent: permanent); - } - - /// Injects an instance <[S]> in memory to be globally accessible. - /// - /// No need to define the generic type <[S]> as it's inferred from - /// the [dependency] - /// - /// - [dependency] The Instance to be injected. - /// - [tag] optionally, use a [tag] as an "id" to create multiple records of - /// the same Type<[S]> - /// - [permanent] keeps the Instance in memory, not following - /// [Get.smartManagement] rules. - S put( - S dependency, { - String tag, - bool permanent = false, - InstanceBuilderCallback builder, - }) { - _insert( - isSingleton: true, - name: tag, - permanent: permanent, - builder: builder ?? (() => dependency)); - return find(tag: tag); - } - - /// Creates a new Class Instance [S] from the builder callback[S]. - /// Every time [find]<[S]>() is used, it calls the builder method to generate - /// a new Instance [S]. - /// It also registers each [instance.onClose()] with the current - /// Route [Get.reference] to keep the lifecycle active. - /// Is important to know that the instances created are only stored per Route. - /// So, if you call `Get.delete()` the "instance factory" used in this - /// method ([Get.create()]) will be removed, but NOT the instances - /// already created by it. - /// - /// Example: - /// - /// ```create(() => Repl()); - /// Repl a = find(); - /// Repl b = find(); - /// print(a==b); (false)``` - void create( - InstanceBuilderCallback builder, { - String tag, - bool permanent = true, - }) { - _insert( - isSingleton: false, name: tag, builder: builder, permanent: permanent); - } - - /// Injects the Instance [S] builder into the [_singleton] HashMap. - void _insert({ - bool isSingleton, - String name, - bool permanent = false, - InstanceBuilderCallback builder, - }) { - assert(builder != null); - final key = _getKey(S, name); - _singl.putIfAbsent( - key, - () => - _InstanceBuilderFactory(isSingleton, builder, permanent, false)); - } - - /// Clears from memory registered Instances associated with [routeName] when - /// using [Get.smartManagement] as [SmartManagement.full] or - /// [SmartManagement.keepFactory] - /// Meant for internal usage of [GetPageRoute] and [GetDialogRoute] - void removeDependencyByRoute(String routeName) { - final keysToRemove = []; - _routesKey.forEach((key, value) { - if (value == routeName) { - keysToRemove.add(key); - } - }); - - /// Removes [Get.create()] instances registered in [routeName]. - if (_routesByCreate.containsKey(routeName)) { - for (final onClose in _routesByCreate[routeName]) { - // assure the [DisposableInterface] instance holding a reference - // to [onClose()] wasn't disposed. - if (onClose != null) { - onClose(); - } - } - _routesByCreate[routeName].clear(); - _routesByCreate.remove(routeName); - } - - for (final element in keysToRemove) { - delete(key: element); - } - - for (final element in keysToRemove) { - _routesKey?.remove(element); - } - keysToRemove.clear(); - } - - /// Initializes the dependencies for a Class Instance [S] (or tag), - /// If its a Controller, it starts the lifecycle process. - /// Optionally associating the current Route to the lifetime of the instance, - /// if [Get.smartManagement] is marked as [SmartManagement.full] or - /// [Get.keepFactory] - /// Only flags `isInit` if it's using `Get.create()` - /// (not for Singletons access). - /// Returns the instance if not initialized, required for Get.create() to - /// work properly. - S _initDependencies({String name}) { - final key = _getKey(S, name); - final isInit = _singl[key].isInit; - S i; - if (!isInit) { - i = _startController(tag: name); - if (_singl[key].isSingleton) { - _singl[key].isInit = true; - if (Get.smartManagement != SmartManagement.onlyBuilder) { - _registerRouteInstance(tag: name); - } - } - } - return i; - } - - /// Links a Class instance [S] (or [tag]) to the current route. - /// Requires usage of [GetMaterialApp]. - void _registerRouteInstance({String tag}) { - _routesKey.putIfAbsent(_getKey(S, tag), () => Get.reference); - } - - /// Finds and returns a Instance<[S]> (or [tag]) without further processing. - S findByType(Type type, {String tag}) { - final key = _getKey(type, tag); - return _singl[key].getDependency() as S; - } - - /// Initializes the controller - S _startController({String tag}) { - final key = _getKey(S, tag); - final i = _singl[key].getDependency() as S; - if (i is GetLifeCycle) { - if (i.onStart != null) { - i.onStart(); - Get.log('"$key" has been initialized'); - } - if (!_singl[key].isSingleton && i.onClose != null) { - _routesByCreate[Get.reference] ??= HashSet(); - _routesByCreate[Get.reference].add(i.onClose); - } - } - return i; - } - - S putOrFind(InstanceBuilderCallback dep, {String tag}) { - final key = _getKey(S, tag); - - if (_singl.containsKey(key)) { - return _singl[key].getDependency() as S; - } else { - if (_factory.containsKey(key)) { - final _value = put((_factory[key].builder() as S), tag: tag); - - if (Get.smartManagement != SmartManagement.keepFactory) { - if (!_factory[key].fenix) { - _factory.remove(key); - } - } - return _value; - } - - return GetInstance().put(dep(), tag: tag); - } - } - - /// Finds the registered type <[S]> (or [tag]) - /// In case of using Get.[create] to register a type <[S]> or [tag], - /// it will create an instance each time you call [find]. - /// If the registered type <[S]> (or [tag]) is a Controller, - /// it will initialize it's lifecycle. - S find({String tag}) { - final key = _getKey(S, tag); - if (isRegistered(tag: tag)) { - if (_singl[key] == null) { - if (tag == null) { - throw 'Class "$S" is not registered'; - } else { - throw 'Class "$S" with tag "$tag" is not registered'; - } - } - - /// although dirty solution, the lifecycle starts inside - /// `initDependencies`, so we have to return the instance from there - /// to make it compatible with `Get.create()`. - final i = _initDependencies(name: tag); - return i ?? _singl[key].getDependency() as S; - } else { - if (!_factory.containsKey(key)) { - // ignore: lines_longer_than_80_chars - throw '"$S" not found. You need to call "Get.put($S())" or "Get.lazyPut(()=>$S())"'; - } - - Get.log('Lazy instance "$S" created'); - final _value = put(_factory[key].builder() as S, tag: tag); - _initDependencies(name: tag); - - if (Get.smartManagement != SmartManagement.keepFactory && - !_factory[key].fenix) { - _factory.remove(key); - } - - return _value; - } - } - - /// Generates the key based on [type] (and optionally a [name]) - /// to register an Instance Builder in the hashmap. - String _getKey(Type type, String name) { - return name == null ? type.toString() : type.toString() + name; - } - - /// Clears all registered instances (and/or tags). - /// Even the persistent ones. - /// - /// [clearFactory] clears the callbacks registered by [lazyPut] - /// [clearRouteBindings] clears Instances associated with routes. - /// - bool reset({bool clearFactory = true, bool clearRouteBindings = true}) { - if (clearFactory) _factory.clear(); - if (clearRouteBindings) _routesKey.clear(); - _singl.clear(); - return true; - } - - /// Delete registered Class Instance [S] (or [tag]) and, closes any open - /// controllers [DisposableInterface], cleans up the memory - /// - /// /// Deletes the Instance<[S]>, cleaning the memory. - // /// - // /// - [tag] Optional "tag" used to register the Instance - // /// - [key] For internal usage, is the processed key used to register - // /// the Instance. **don't use** it unless you know what you are doing. - - /// Deletes the Instance<[S]>, cleaning the memory and closes any open - /// controllers ([DisposableInterface]). - /// - /// - [tag] Optional "tag" used to register the Instance - /// - [key] For internal usage, is the processed key used to register - /// the Instance. **don't use** it unless you know what you are doing. - /// - [force] Will delete an Instance even if marked as [permanent]. - bool delete({String tag, String key, bool force = false}) { - // return _queue.secure(() { - return _delete(tag: tag, key: key, force: force); - // }); - } - - bool _delete({String tag, String key, bool force = false}) { - final newKey = key ?? _getKey(S, tag); - - if (!_singl.containsKey(newKey)) { - Get.log('Instance "$newKey" already removed.', isError: true); - return false; - } - - final builder = _singl[newKey]; - if (builder.permanent && !force) { - Get.log( - // ignore: lines_longer_than_80_chars - '"$newKey" has been marked as permanent, SmartManagement is not authorized to delete it.', - isError: true, - ); - return false; - } - final i = builder.dependency; - - if (i is GetxServiceMixin && !force) { - return false; - } - if (i is GetLifeCycle) { - i.onClose(); - Get.log('"$newKey" onClose() called'); - } - - _singl.removeWhere((oldKey, value) => (oldKey == newKey)); - if (_singl.containsKey(newKey)) { - Get.log('Error removing object "$newKey"', isError: true); - } else { - Get.log('"$newKey" deleted from memory'); - } - // _routesKey?.remove(key); - return true; - } - - /// Check if a Class Instance<[S]> (or [tag]) is registered in memory. - /// - [tag] is optional, if you used a [tag] to register the Instance. - bool isRegistered({String tag}) => _singl.containsKey(_getKey(S, tag)); - - /// Checks if a lazy factory callback ([Get.lazyPut()] that returns an - /// Instance<[S]> is registered in memory. - /// - [tag] is optional, if you used a [tag] to register the lazy Instance. - bool isPrepared({String tag}) => _factory.containsKey(_getKey(S, tag)); -} - -typedef InstanceBuilderCallback = S Function(); - -typedef AsyncInstanceBuilderCallback = Future Function(); - -/// Internal class to register instances with Get.[put]<[S]>(). -class _InstanceBuilderFactory { - /// Marks the Builder as a single instance. - /// For reusing [dependency] instead of [builderFunc] - bool isSingleton; - - /// Stores the actual object instance when [isSingleton]=true. - S dependency; - - /// Generates (and regenerates) the instance when [isSingleton]=false. - /// Usually used by factory methods - InstanceBuilderCallback builderFunc; - - /// Flag to persist the instance in memory, - /// without considering [Get.smartManagement] - bool permanent = false; - - bool isInit = false; - - _InstanceBuilderFactory( - this.isSingleton, - this.builderFunc, - this.permanent, - this.isInit, - ); - - /// Gets the actual instance by it's [builderFunc] or the persisted instance. - S getDependency() { - return isSingleton ? dependency ??= builderFunc() : builderFunc(); - } -} - -/// Internal class to register a future instance with [lazyPut], -/// keeps a reference to the callback to be called. -class _Lazy { - bool fenix; - InstanceBuilderCallback builder; - - _Lazy(this.builder, this.fenix); -} diff --git a/packages/get_instance/lib/src/lifecycle.dart b/packages/get_instance/lib/src/lifecycle.dart deleted file mode 100644 index fe61dd036..000000000 --- a/packages/get_instance/lib/src/lifecycle.dart +++ /dev/null @@ -1,40 +0,0 @@ -/// Special callable class to keep the contract of a regular method, and avoid -/// overrides if you extend the class that uses it, as Dart has no final -/// methods. -/// Used in [DisposableInterface] to avoid the danger of overriding onStart. -/// -class _InternalFinalCallback { - T Function() callback; - - _InternalFinalCallback(); - - T call() => callback.call(); -} - -abstract class GetLifeCycle { - /// Called at the exact moment the widget is allocated in memory. - /// It uses an internal "callable" type, to avoid any @overrides in subclases. - /// This method should be internal and is required to define the - /// lifetime cycle of the subclass. - final onStart = _InternalFinalCallback(); - - /// Called immediately after the widget is allocated in memory. - /// You might use this to initialize something for the controller. - void onInit() {} - - /// Called 1 frame after onInit(). It is the perfect place to enter - /// navigation events, like snackbar, dialogs, or a new route, or - /// async request. - void onReady() {} - - /// Called before [onDelete] method. [onClose] might be used to - /// dispose resources used by the controller. Like closing events, - /// or streams before the controller is destroyed. - /// Or dispose objects that can potentially create some memory leaks, - /// like TextEditingControllers, AnimationControllers. - /// Might be useful as well to persist some data on disk. - void onClose() {} -} - -/// Allow track difference between GetxServices and GetxControllers -mixin GetxServiceMixin {} diff --git a/packages/get_instance/pubspec.yaml b/packages/get_instance/pubspec.yaml deleted file mode 100644 index 091f6909a..000000000 --- a/packages/get_instance/pubspec.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: get_instance -description: A smart dependency injector to GetX™ framework. -version: 3.13.0 -homepage: https://github.com/jonataslaw/getx - -environment: - sdk: ">=2.7.0 <3.0.0" - - -dependencies: - get_core: ">=3.13.0 <4.0.0" - -dev_dependencies: - test: ">=1.0.0 <2.0.0" - test_coverage: ">=0.4.3 <1.0.0" - - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec diff --git a/packages/get_instance/test/get_instance_test.dart b/packages/get_instance/test/get_instance_test.dart deleted file mode 100644 index eb25dbd9f..000000000 --- a/packages/get_instance/test/get_instance_test.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:get_instance/get_instance.dart'; -import 'package:test/test.dart'; -import 'package:get_core/get_core.dart'; -import 'util/matcher.dart' as m; - -class Mock { - static Future test() async { - await Future.delayed(Duration.zero); - return 'test'; - } -} - -class Controller {} - -class DisposableController extends GetLifeCycle { - DisposableController() { - onStart.callback = _onStart; - } - - // Internal callback that starts the cycle of this controller. - void _onStart() { - onInit(); - } - - bool initialized = false; - - void onInit() async { - initialized = true; - } -} - -// ignore: one_member_abstracts -abstract class Service { - String post(); -} - -class Api implements Service { - @override - String post() { - return 'test'; - } -} - -void main() { - test('Get.putAsync test', () async { - await Get.putAsync(Mock.test); - expect('test', Get.find()); - Get.reset(); - }); - - test('Get.put test', () async { - final instance = Get.put(Controller()); - expect(instance, Get.find()); - Get.reset(); - }); - - test('Get.put tag test', () async { - final instance = Get.put(Controller(), tag: 'one'); - final instance2 = Get.put(Controller(), tag: 'two'); - expect(instance == instance2, false); - expect(Get.find(tag: 'one') == Get.find(tag: 'two'), - false); - expect(Get.find(tag: 'one') == Get.find(tag: 'one'), - true); - expect(Get.find(tag: 'two') == Get.find(tag: 'two'), - true); - Get.reset(); - }); - - test('Get.lazyPut tag test', () async { - Get.lazyPut(() => Controller(), tag: 'one'); - Get.lazyPut(() => Controller(), tag: 'two'); - - expect(Get.find(tag: 'one') == Get.find(tag: 'two'), - false); - expect(Get.find(tag: 'one') == Get.find(tag: 'one'), - true); - expect(Get.find(tag: 'two') == Get.find(tag: 'two'), - true); - Get.reset(); - }); - - test('Get.lazyPut test', () async { - final controller = Controller(); - Get.lazyPut(() => controller); - final ct1 = Get.find(); - expect(ct1, controller); - Get.reset(); - }); - - test('Get.lazyPut with abstract class test', () async { - final api = Api(); - Get.lazyPut(() => api); - final ct1 = Get.find(); - expect(ct1, api); - Get.reset(); - }); - - test('Get.create with abstract class test', () async { - Get.create(() => Api()); - final ct1 = Get.find(); - final ct2 = Get.find(); - expect(ct1 is Service, true); - expect(ct2 is Service, true); - expect(ct1 == ct2, false); - Get.reset(); - }); - - group('test put, delete and check onInit execution', () { - tearDownAll(Get.reset); - - test('Get.put test with init check', () async { - final instance = Get.put(DisposableController()); - expect(instance, Get.find()); - expect(instance.initialized, true); - }); - - test('Get.delete test with disposable controller', () async { - expect(await Get.delete(), true); - expect(() => Get.find(), - throwsA(m.TypeMatcher())); - }); - - test('Get.put test after delete with disposable controller and init check', - () async { - final instance = Get.put(DisposableController()); - expect(instance, Get.find()); - expect(instance.initialized, true); - }); - }); -} diff --git a/packages/get_instance/test/util/matcher.dart b/packages/get_instance/test/util/matcher.dart deleted file mode 100644 index 930f36666..000000000 --- a/packages/get_instance/test/util/matcher.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'package:test/test.dart'; - -// Copyright 2014, the Dart project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: - -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. - -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -class _FunctionMatcher extends CustomMatcher { - final dynamic Function(T value) _feature; - - _FunctionMatcher(String name, this._feature, matcher) - : super('`$name`:', '`$name`', matcher); - - @override - Object featureValueOf(covariant T actual) => _feature(actual); -} - -class HavingMatcher implements TypeMatcher { - final TypeMatcher _parent; - final List<_FunctionMatcher> _functionMatchers; - - HavingMatcher(TypeMatcher parent, String description, - Object Function(T) feature, dynamic matcher, - [Iterable<_FunctionMatcher> existing]) - : _parent = parent, - _functionMatchers = [ - ...?existing, - _FunctionMatcher(description, feature, matcher) - ]; - - @override - TypeMatcher having( - Object Function(T) feature, String description, dynamic matcher) => - HavingMatcher(_parent, description, feature, matcher, _functionMatchers); - - @override - bool matches(dynamic item, Map matchState) { - for (var matcher in [_parent].followedBy(_functionMatchers)) { - if (!matcher.matches(item, matchState)) { - addStateInfo(matchState, {'matcher': matcher}); - return false; - } - } - return true; - } - - @override - Description describeMismatch( - dynamic item, - Description mismatchDescription, - Map matchState, - bool verbose, - ) { - var matcher = matchState['matcher'] as Matcher; - matcher.describeMismatch( - item, mismatchDescription, matchState['state'] as Map, verbose); - return mismatchDescription; - } - - @override - Description describe(Description description) => description - .add('') - .addDescriptionOf(_parent) - .add(' with ') - .addAll('', ' and ', '', _functionMatchers); -} - -class TypeMatcher extends Matcher { - const TypeMatcher(); - - TypeMatcher having( - Object Function(T) feature, String description, dynamic matcher) => - HavingMatcher(this, description, feature, matcher); - - @override - Description describe(Description description) { - var name = _stripDynamic(T); - return description.add(""); - } - - @override - bool matches(Object item, Map matchState) => item is T; - - @override - Description describeMismatch( - dynamic item, - Description mismatchDescription, - Map matchState, - bool verbose, - ) { - var name = _stripDynamic(T); - return mismatchDescription.add("is not an instance of '$name'"); - } -} - -String _stripDynamic(Type type) => - type.toString().replaceAll(_dart2DynamicArgs, ''); -final _dart2DynamicArgs = RegExp(''); diff --git a/packages/get_navigation/.gitignore b/packages/get_navigation/.gitignore deleted file mode 100644 index 1985397a2..000000000 --- a/packages/get_navigation/.gitignore +++ /dev/null @@ -1,74 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 diff --git a/packages/get_navigation/.metadata b/packages/get_navigation/.metadata deleted file mode 100644 index 3207f67d3..000000000 --- a/packages/get_navigation/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: a27c242b0eea731317cfec5bbdd9d35452ab3ecb - channel: dev - -project_type: package diff --git a/packages/get_navigation/CHANGELOG.md b/packages/get_navigation/CHANGELOG.md deleted file mode 100644 index f9d3a4a6d..000000000 --- a/packages/get_navigation/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ -## [3.13.0] -* Bump to Get 3.13.0 - -## [3.12.0] -* Bump to Get 3.12.0 -* Fix defaultCustomTransition - -## [3.10.2] - -- initial release diff --git a/packages/get_navigation/LICENSE b/packages/get_navigation/LICENSE deleted file mode 100644 index 2fb920baf..000000000 --- a/packages/get_navigation/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jonny Borges - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/get_navigation/README.md b/packages/get_navigation/README.md deleted file mode 100644 index 61fd12578..000000000 --- a/packages/get_navigation/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# get_navigation - -A new Flutter package project. - -## Getting Started - -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/packages/get_navigation/analysis_options.yaml b/packages/get_navigation/analysis_options.yaml deleted file mode 100644 index 38018b421..000000000 --- a/packages/get_navigation/analysis_options.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# Include option is buggy: -# https://github.com/flutter/flutter/issues/62591 -# In case the include issue gets fixed, lines below INCLUDE_FIX -# can be removed - -# include: package:effective_dart/analysis_options.1.2.0.yaml -analyzer: - strong-mode: - implicit-casts: false -linter: - rules: - await_only_futures: true - # This one is desirable, but that's a lot of work for now - public_member_api_docs: false - # Desirable, but would be breaking changes: - avoid_positional_boolean_parameters: false - constant_identifier_names: false - include_file_not_found: false - - # INCLUDE_FIX (copy of effective dart 1.2.0) - # STYLE - camel_case_types: true - camel_case_extensions: true - library_names: true - file_names: true - library_prefixes: true - non_constant_identifier_names: true - directives_ordering: true - lines_longer_than_80_chars: true # avoid - curly_braces_in_flow_control_structures: true - - # DOCUMENTATION - slash_for_doc_comments: true - package_api_docs: true # prefer - #- comment_references # Unused because https://github.com/dart-lang/sdk/issues/36974 - - # USAGE - implementation_imports: true - avoid_relative_lib_imports: true # prefer - prefer_relative_imports: true # prefer - prefer_adjacent_string_concatenation: true - prefer_interpolation_to_compose_strings: true # prefer - unnecessary_brace_in_string_interps: true # avoid - prefer_collection_literals: true - avoid_function_literals_in_foreach_calls: true # avoid - prefer_iterable_whereType: true - prefer_function_declarations_over_variables: true - unnecessary_lambdas: true - prefer_equal_for_default_values: true - avoid_init_to_null: true - unnecessary_getters_setters: true - #- unnecessary_getters # prefer # Disabled pending fix: https://github.com/dart-lang/linter/issues/23 - #- prefer_expression_function_bodies # consider - unnecessary_this: true - prefer_initializing_formals: true - type_init_formals: true - empty_constructor_bodies: true - unnecessary_new: true - unnecessary_const: true - avoid_catches_without_on_clauses: true # avoid - avoid_catching_errors: true - use_rethrow_when_possible: true - - # DESIGN - use_to_and_as_if_applicable: true # prefer - one_member_abstracts: true # avoid - avoid_classes_with_only_static_members: true # avoid - prefer_mixin: true - prefer_final_fields: true # prefer - use_setters_to_change_properties: true - avoid_setters_without_getters: true - avoid_returning_null: true # avoid - avoid_returning_this: true # avoid - type_annotate_public_apis: true # prefer - #- prefer_typing_uninitialized_variables # consider - omit_local_variable_types: true # avoid - avoid_types_on_closure_parameters: true # avoid - avoid_return_types_on_setters: true # avoid - prefer_generic_function_type_aliases: true - avoid_private_typedef_functions: true # prefer - #- use_function_type_syntax_for_parameters # consider - hash_and_equals: true - avoid_equals_and_hash_code_on_mutable_classes: true # avoid - avoid_null_checks_in_equality_operators: true - diff --git a/packages/get_navigation/lib/get_navigation.dart b/packages/get_navigation/lib/get_navigation.dart deleted file mode 100644 index 029912330..000000000 --- a/packages/get_navigation/lib/get_navigation.dart +++ /dev/null @@ -1,14 +0,0 @@ -library get_navigation; - -export 'package:get_core/get_core.dart'; -export 'src/bottomsheet/bottomsheet.dart'; -export 'src/extension_navigation.dart'; -export 'src/root/root_widget.dart'; -export 'src/routes/custom_transition.dart'; -export 'src/routes/default_route.dart'; -export 'src/routes/default_route.dart'; -export 'src/routes/get_route.dart'; -export 'src/routes/observers/route_observer.dart'; -export 'src/routes/transitions_type.dart'; -export 'src/snackbar/snack.dart'; -export 'src/snackbar/snack_route.dart'; diff --git a/packages/get_navigation/lib/src/bottomsheet/bottomsheet.dart b/packages/get_navigation/lib/src/bottomsheet/bottomsheet.dart deleted file mode 100644 index 11707dcd7..000000000 --- a/packages/get_navigation/lib/src/bottomsheet/bottomsheet.dart +++ /dev/null @@ -1,332 +0,0 @@ -import 'package:flutter/material.dart'; - -class GetModalBottomSheetRoute extends PopupRoute { - GetModalBottomSheetRoute({ - this.builder, - this.theme, - this.barrierLabel, - this.backgroundColor, - this.isPersistent, - this.elevation, - this.shape, - this.removeTop = true, - this.clipBehavior, - this.modalBarrierColor, - this.isDismissible = true, - this.enableDrag = true, - @required this.isScrollControlled, - RouteSettings settings, - this.enterBottomSheetDuration = const Duration(milliseconds: 250), - this.exitBottomSheetDuration = const Duration(milliseconds: 200), - }) : assert(isScrollControlled != null), - name = "BOTTOMSHEET: ${builder.hashCode}", - assert(isDismissible != null), - assert(enableDrag != null), - super(settings: settings); - final bool isPersistent; - final WidgetBuilder builder; - final ThemeData theme; - final bool isScrollControlled; - final Color backgroundColor; - final double elevation; - final ShapeBorder shape; - final Clip clipBehavior; - final Color modalBarrierColor; - final bool isDismissible; - final bool enableDrag; - final String name; - final Duration enterBottomSheetDuration; - final Duration exitBottomSheetDuration; - // remove safearea from top - final bool removeTop; - - @override - Duration get transitionDuration => Duration(milliseconds: 700); - - @override - bool get barrierDismissible => isDismissible; - - @override - final String barrierLabel; - - @override - Color get barrierColor => modalBarrierColor ?? Colors.black54; - - AnimationController _animationController; - - @override - AnimationController createAnimationController() { - assert(_animationController == null); - _animationController = - BottomSheet.createAnimationController(navigator.overlay); - _animationController.duration = enterBottomSheetDuration; - _animationController.reverseDuration = exitBottomSheetDuration; - return _animationController; - } - - @override - Widget buildPage(BuildContext context, Animation animation, - Animation secondaryAnimation) { - final sheetTheme = - theme?.bottomSheetTheme ?? Theme.of(context).bottomSheetTheme; - // By definition, the bottom sheet is aligned to the bottom of the page - // and isn't exposed to the top padding of the MediaQuery. - Widget bottomSheet = MediaQuery.removePadding( - context: context, - removeTop: removeTop, - child: Padding( - padding: - EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - child: _GetModalBottomSheet( - route: this, - backgroundColor: backgroundColor ?? - sheetTheme?.modalBackgroundColor ?? - sheetTheme?.backgroundColor, - elevation: - elevation ?? sheetTheme?.modalElevation ?? sheetTheme?.elevation, - shape: shape, - clipBehavior: clipBehavior, - isScrollControlled: isScrollControlled, - enableDrag: enableDrag, - ), - ), - ); - if (theme != null) bottomSheet = Theme(data: theme, child: bottomSheet); - return bottomSheet; - } -} - -class _GetModalBottomSheet extends StatefulWidget { - const _GetModalBottomSheet({ - Key key, - this.route, - this.backgroundColor, - this.elevation, - this.shape, - this.clipBehavior, - this.isScrollControlled = false, - this.enableDrag = true, - this.isPersistent = false, - }) : assert(isScrollControlled != null), - assert(enableDrag != null), - super(key: key); - final bool isPersistent; - final GetModalBottomSheetRoute route; - final bool isScrollControlled; - final Color backgroundColor; - final double elevation; - final ShapeBorder shape; - final Clip clipBehavior; - final bool enableDrag; - - @override - _GetModalBottomSheetState createState() => _GetModalBottomSheetState(); -} - -class _GetModalBottomSheetState extends State<_GetModalBottomSheet> { - String _getRouteLabel(MaterialLocalizations localizations) { - if ((Theme.of(context).platform == TargetPlatform.android) || - (Theme.of(context).platform == TargetPlatform.fuchsia)) { - return localizations.dialogLabel; - } else { - return ''; - } - } - - @override - Widget build(BuildContext context) { - assert(debugCheckHasMediaQuery(context)); - assert(debugCheckHasMaterialLocalizations(context)); - final mediaQuery = MediaQuery.of(context); - final localizations = MaterialLocalizations.of(context); - final routeLabel = _getRouteLabel(localizations); - - return AnimatedBuilder( - animation: widget.route.animation, - builder: (context, child) { - // Disable the initial animation when accessible navigation is on so - // that the semantics are added to the tree at the correct time. - final animationValue = mediaQuery.accessibleNavigation - ? 1.0 - : widget.route.animation.value; - return Semantics( - scopesRoute: true, - namesRoute: true, - label: routeLabel, - explicitChildNodes: true, - child: ClipRect( - child: CustomSingleChildLayout( - delegate: _GetModalBottomSheetLayout( - animationValue, widget.isScrollControlled), - child: widget.isPersistent == false - ? BottomSheet( - animationController: widget.route._animationController, - onClosing: () { - if (widget.route.isCurrent) { - Navigator.pop(context); - } - }, - builder: widget.route.builder, - backgroundColor: widget.backgroundColor, - elevation: widget.elevation, - shape: widget.shape, - clipBehavior: widget.clipBehavior, - enableDrag: widget.enableDrag, - ) - : Scaffold( - bottomSheet: BottomSheet( - animationController: - widget.route._animationController, - onClosing: () { - // if (widget.route.isCurrent) { - // Navigator.pop(context); - // } - }, - builder: widget.route.builder, - backgroundColor: widget.backgroundColor, - elevation: widget.elevation, - shape: widget.shape, - clipBehavior: widget.clipBehavior, - enableDrag: widget.enableDrag, - ), - )), - ), - ); - }, - ); - } -} - -class _GetPerModalBottomSheet extends StatefulWidget { - const _GetPerModalBottomSheet({ - Key key, - this.route, - this.isPersistent, - this.backgroundColor, - this.elevation, - this.shape, - this.clipBehavior, - this.isScrollControlled = false, - this.enableDrag = true, - }) : assert(isScrollControlled != null), - assert(enableDrag != null), - super(key: key); - final bool isPersistent; - final GetModalBottomSheetRoute route; - final bool isScrollControlled; - final Color backgroundColor; - final double elevation; - final ShapeBorder shape; - final Clip clipBehavior; - final bool enableDrag; - - @override - // ignore: lines_longer_than_80_chars - _GetPerModalBottomSheetState createState() => - _GetPerModalBottomSheetState(); -} - -// ignore: lines_longer_than_80_chars -class _GetPerModalBottomSheetState - extends State<_GetPerModalBottomSheet> { - String _getRouteLabel(MaterialLocalizations localizations) { - if ((Theme.of(context).platform == TargetPlatform.android) || - (Theme.of(context).platform == TargetPlatform.fuchsia)) { - return localizations.dialogLabel; - } else { - return ''; - } - } - - @override - Widget build(BuildContext context) { - assert(debugCheckHasMediaQuery(context)); - assert(debugCheckHasMaterialLocalizations(context)); - final mediaQuery = MediaQuery.of(context); - final localizations = MaterialLocalizations.of(context); - final routeLabel = _getRouteLabel(localizations); - - return AnimatedBuilder( - animation: widget.route.animation, - builder: (context, child) { - // Disable the initial animation when accessible navigation is on so - // that the semantics are added to the tree at the correct time. - final animationValue = mediaQuery.accessibleNavigation - ? 1.0 - : widget.route.animation.value; - return Semantics( - scopesRoute: true, - namesRoute: true, - label: routeLabel, - explicitChildNodes: true, - child: ClipRect( - child: CustomSingleChildLayout( - delegate: _GetModalBottomSheetLayout( - animationValue, widget.isScrollControlled), - child: widget.isPersistent == false - ? BottomSheet( - animationController: widget.route._animationController, - onClosing: () { - if (widget.route.isCurrent) { - Navigator.pop(context); - } - }, - builder: widget.route.builder, - backgroundColor: widget.backgroundColor, - elevation: widget.elevation, - shape: widget.shape, - clipBehavior: widget.clipBehavior, - enableDrag: widget.enableDrag, - ) - : Scaffold( - bottomSheet: BottomSheet( - animationController: - widget.route._animationController, - onClosing: () { - // if (widget.route.isCurrent) { - // Navigator.pop(context); - // } - }, - builder: widget.route.builder, - backgroundColor: widget.backgroundColor, - elevation: widget.elevation, - shape: widget.shape, - clipBehavior: widget.clipBehavior, - enableDrag: widget.enableDrag, - ), - )), - ), - ); - }, - ); - } -} - -class _GetModalBottomSheetLayout extends SingleChildLayoutDelegate { - _GetModalBottomSheetLayout(this.progress, this.isScrollControlled); - - final double progress; - final bool isScrollControlled; - - @override - BoxConstraints getConstraintsForChild(BoxConstraints constraints) { - return BoxConstraints( - minWidth: constraints.maxWidth, - maxWidth: constraints.maxWidth, - minHeight: 0.0, - maxHeight: isScrollControlled - ? constraints.maxHeight - : constraints.maxHeight * 9.0 / 16.0, - ); - } - - @override - Offset getPositionForChild(Size size, Size childSize) { - return Offset(0.0, size.height - childSize.height * progress); - } - - @override - bool shouldRelayout(_GetModalBottomSheetLayout oldDelegate) { - return progress != oldDelegate.progress; - } -} diff --git a/packages/get_navigation/lib/src/dialog/dialog_route.dart b/packages/get_navigation/lib/src/dialog/dialog_route.dart deleted file mode 100644 index 5ddb50f45..000000000 --- a/packages/get_navigation/lib/src/dialog/dialog_route.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_state_manager/get_state_manager.dart'; - -class GetDialogRoute extends PopupRoute { - GetDialogRoute({ - @required RoutePageBuilder pageBuilder, - bool barrierDismissible = true, - String barrierLabel, - Color barrierColor = const Color(0x80000000), - Duration transitionDuration = const Duration(milliseconds: 200), - RouteTransitionsBuilder transitionBuilder, - RouteSettings settings, - }) : assert(barrierDismissible != null), - widget = pageBuilder, - name = "DIALOG: ${pageBuilder.hashCode}", - _barrierDismissible = barrierDismissible, - _barrierLabel = barrierLabel, - _barrierColor = barrierColor, - _transitionDuration = transitionDuration, - _transitionBuilder = transitionBuilder, - super(settings: settings); - - final RoutePageBuilder widget; - - @override - bool get barrierDismissible => _barrierDismissible; - final bool _barrierDismissible; - - final String name; - - @override - void dispose() { - if (Get.smartManagement != SmartManagement.onlyBuilder) { - WidgetsBinding.instance.addPostFrameCallback( - (_) => GetInstance().removeDependencyByRoute(name)); - } - super.dispose(); - } - - @override - String get barrierLabel => _barrierLabel; - final String _barrierLabel; - - @override - Color get barrierColor => _barrierColor; - final Color _barrierColor; - - @override - Duration get transitionDuration => _transitionDuration; - final Duration _transitionDuration; - - final RouteTransitionsBuilder _transitionBuilder; - - @override - Widget buildPage(BuildContext context, Animation animation, - Animation secondaryAnimation) { - return Semantics( - child: widget(context, animation, secondaryAnimation), - scopesRoute: true, - explicitChildNodes: true, - ); - } - - @override - Widget buildTransitions(BuildContext context, Animation animation, - Animation secondaryAnimation, Widget child) { - if (_transitionBuilder == null) { - return FadeTransition( - opacity: CurvedAnimation( - parent: animation, - curve: Curves.linear, - ), - child: child); - } // Some default transition - return _transitionBuilder(context, animation, secondaryAnimation, child); - } -} diff --git a/packages/get_navigation/lib/src/extension_navigation.dart b/packages/get_navigation/lib/src/extension_navigation.dart deleted file mode 100644 index 1ac836a40..000000000 --- a/packages/get_navigation/lib/src/extension_navigation.dart +++ /dev/null @@ -1,1095 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_state_manager/get_state_manager.dart'; -import 'package:get_utils/get_utils.dart'; -import '../get_navigation.dart'; -import 'dialog/dialog_route.dart'; -import 'root/parse_route.dart'; -import 'root/root_controller.dart'; -import 'routes/transitions_type.dart'; - -//TODO: Split this class on "Snackbar" "Dialog" "bottomSheet" -//and "navigation" extensions -extension GetNavigation on GetInterface { - /// **Navigation.push()** shortcut.

- /// - /// Pushes a new [page] to the stack - /// - /// It has the advantage of not needing context, - /// so you can call from your business logic - /// - /// You can set a custom [transition], and a transition [duration]. - /// - /// You can send any type of value to the other route in the [arguments]. - /// - /// Just like native routing in Flutter, you can push a route - /// as a [fullscreenDialog], - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// If you want the same behavior of ios that pops a route when the user drag, - /// you can set [popGesture] to true - /// - /// If you're using the [Bindings] api, you must define it here - /// - /// By default, GetX will prevent you from push a route that you already in, - /// if you want to push anyway, set [preventDuplicates] to false - Future to( - Widget page, { - bool opaque, - Transition transition, - Curve curve, - Duration duration, - int id, - bool fullscreenDialog = false, - dynamic arguments, - Bindings binding, - bool preventDuplicates = true, - bool popGesture, - }) { - var routeName = "/${page.runtimeType.toString()}"; - if (preventDuplicates && routeName == currentRoute) { - return null; - } - return global(id)?.currentState?.push( - GetPageRoute( - opaque: opaque ?? true, - page: () => page, - routeName: routeName, - settings: RouteSettings( - // name: forceRouteName ? '${a.runtimeType}' : '', - arguments: arguments, - ), - popGesture: popGesture ?? defaultPopGesture, - transition: transition ?? defaultTransition, - curve: curve ?? defaultTransitionCurve, - fullscreenDialog: fullscreenDialog, - binding: binding, - transitionDuration: duration ?? defaultTransitionDuration, - ), - ); - } - - /// **Navigation.pushNamed()** shortcut.

- /// - /// Pushes a new named [page] to the stack. - /// - /// It has the advantage of not needing context, so you can call - /// from your business logic. - /// - /// You can send any type of value to the other route in the [arguments]. - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// By default, GetX will prevent you from push a route that you already in, - /// if you want to push anyway, set [preventDuplicates] to false - /// - /// Note: Always put a slash on the route ('/page1'), to avoid unnexpected errors - Future toNamed( - String page, { - dynamic arguments, - int id, - bool preventDuplicates = true, - }) { - if (preventDuplicates && page == currentRoute) { - return null; - } - return global(id)?.currentState?.pushNamed(page, arguments: arguments); - } - - /// **Navigation.pushReplacementNamed()** shortcut.

- /// - /// Pop the current named [page] in the stack and push a new one in its place - /// - /// It has the advantage of not needing context, so you can call - /// from your business logic. - /// - /// You can send any type of value to the other route in the [arguments]. - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// By default, GetX will prevent you from push a route that you already in, - /// if you want to push anyway, set [preventDuplicates] to false - /// - /// Note: Always put a slash on the route ('/page1'), to avoid unnexpected errors - Future offNamed( - String page, { - dynamic arguments, - int id, - bool preventDuplicates = true, - }) { - if (preventDuplicates && page == currentRoute) { - return null; - } - return global(id) - ?.currentState - ?.pushReplacementNamed(page, arguments: arguments); - } - - /// **Navigation.popUntil()** shortcut.

- /// - /// Calls pop several times in the stack until [predicate] returns true - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// [predicate] can be used like this: - /// `Get.until((route) => Get.currentRoute == '/home')`so when you get to home page, - /// - /// or also like this: - /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the - /// dialog is closed - void until(RoutePredicate predicate, {int id}) { - // if (key.currentState.mounted) // add this if appear problems on future with route navigate - // when widget don't mounted - return global(id)?.currentState?.popUntil(predicate); - } - - /// **Navigation.pushAndRemoveUntil()** shortcut.

- /// - /// Push the given [page], and then pop several pages in the stack until - /// [predicate] returns true - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// Obs: unlike other get methods, this one you need to send a function - /// that returns the widget to the page argument, like this: - /// Get.offUntil( () => HomePage() ) - /// - /// [predicate] can be used like this: - /// `Get.until((route) => Get.currentRoute == '/home')`so when you get to home page, - /// - /// or also like this: - /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the dialog - /// is closed - Future offUntil(Route page, RoutePredicate predicate, {int id}) { - // if (key.currentState.mounted) // add this if appear problems on future with route navigate - // when widget don't mounted - return global(id)?.currentState?.pushAndRemoveUntil(page, predicate); - } - - /// **Navigation.pushNamedAndRemoveUntil()** shortcut.

- /// - /// Push the given named [page], and then pop several pages in the stack - /// until [predicate] returns true - /// - /// You can send any type of value to the other route in the [arguments]. - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// [predicate] can be used like this: - /// `Get.until((route) => Get.currentRoute == '/home')`so when you get to home page, - /// or also like - /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the dialog - /// is closed - /// - /// Note: Always put a slash on the route ('/page1'), to avoid unnexpected errors - Future offNamedUntil( - String page, - RoutePredicate predicate, { - int id, - dynamic arguments, - }) { - return global(id) - ?.currentState - ?.pushNamedAndRemoveUntil(page, predicate, arguments: arguments); - } - - /// **Navigation.popAndPushNamed()** shortcut.

- /// - /// Pop the current named page and pushes a new [page] to the stack - /// in its place - /// - /// You can send any type of value to the other route in the [arguments]. - /// It is very similar to `offNamed()` but use a different approach - /// - /// The `offNamed()` pop a page, and goes to the next. The - /// `offAndToNamed()` goes to the next page, and removes the previous one. - /// The route transition animation is different. - Future offAndToNamed( - String page, { - dynamic arguments, - int id, - dynamic result, - }) { - return global(id) - ?.currentState - ?.popAndPushNamed(page, arguments: arguments, result: result); - } - - /// **Navigation.removeRoute()** shortcut.

- /// - /// Remove a specific [route] from the stack - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - void removeRoute(Route route, {int id}) { - return global(id)?.currentState?.removeRoute(route); - } - - /// **Navigation.pushNamedAndRemoveUntil()** shortcut.

- /// - /// Push a named [page] and pop several pages in the stack - /// until [predicate] returns true. [predicate] is optional - /// - /// It has the advantage of not needing context, so you can - /// call from your business logic. - /// - /// You can send any type of value to the other route in the [arguments]. - /// - /// [predicate] can be used like this: - /// `Get.until((route) => Get.currentRoute == '/home')`so when you get to home page, - /// or also like - /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the dialog - /// is closed - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// Note: Always put a slash on the route ('/page1'), to avoid unexpected errors - Future offAllNamed( - String newRouteName, { - RoutePredicate predicate, - dynamic arguments, - int id, - }) { - return global(id)?.currentState?.pushNamedAndRemoveUntil( - newRouteName, - predicate ?? (_) => false, - arguments: arguments, - ); - } - - /// Returns true if a Snackbar, Dialog or BottomSheet is currently OPEN - bool get isOverlaysOpen => - (isSnackbarOpen || isDialogOpen || isBottomSheetOpen); - - /// Returns true if there is no Snackbar, Dialog or BottomSheet open - bool get isOverlaysClosed => - (!isSnackbarOpen && !isDialogOpen && !isBottomSheetOpen); - - /// **Navigation.popUntil()** shortcut.

- /// - /// Pop the current page, snackbar, dialog or bottomsheet in the stack - /// - /// if your set [closeOverlays] to true, Get.back() will close the - /// currently open snackbar/dialog/bottomsheet AND the current page - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// It has the advantage of not needing context, so you can call - /// from your business logic. - void back({ - dynamic result, - bool closeOverlays = false, - bool canPop = true, - int id, - }) { - if (closeOverlays && isOverlaysOpen) { - navigator?.popUntil((route) { - return (isOverlaysClosed); - }); - } - if (canPop) { - if (global(id)?.currentState?.canPop() == true) { - global(id)?.currentState?.pop(result); - } - } else { - global(id)?.currentState?.pop(result); - } - } - - /// **Navigation.popUntil()** (with predicate) shortcut .

- /// - /// Close as many routes as defined by [times] - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - void close(int times, [int id]) { - if ((times == null) || (times < 1)) { - times = 1; - } - var count = 0; - var back = global(id)?.currentState?.popUntil((route) => count++ == times); - - return back; - } - - /// **Navigation.pushReplacement()** shortcut .

- /// - /// Pop the current page and pushes a new [page] to the stack - /// - /// It has the advantage of not needing context, - /// so you can call from your business logic - /// - /// You can set a custom [transition], define a Tween [curve], - /// and a transition [duration]. - /// - /// You can send any type of value to the other route in the [arguments]. - /// - /// Just like native routing in Flutter, you can push a route - /// as a [fullscreenDialog], - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// If you want the same behavior of ios that pops a route when the user drag, - /// you can set [popGesture] to true - /// - /// If you're using the [Bindings] api, you must define it here - /// - /// By default, GetX will prevent you from push a route that you already in, - /// if you want to push anyway, set [preventDuplicates] to false - Future off( - Widget page, { - bool opaque = false, - Transition transition, - Curve curve, - bool popGesture, - int id, - dynamic arguments, - Bindings binding, - bool fullscreenDialog = false, - bool preventDuplicates = true, - Duration duration, - }) { - var routeName = "/${page.runtimeType.toString()}"; - if (preventDuplicates && routeName == currentRoute) { - return null; - } - return global(id)?.currentState?.pushReplacement(GetPageRoute( - opaque: opaque ?? true, - page: () => page, - binding: binding, - settings: RouteSettings(arguments: arguments), - routeName: routeName, - fullscreenDialog: fullscreenDialog, - popGesture: popGesture ?? defaultPopGesture, - transition: transition ?? defaultTransition, - curve: curve ?? defaultTransitionCurve, - transitionDuration: duration ?? defaultTransitionDuration)); - } - - /// **Navigation.pushAndRemoveUntil()** shortcut .

- /// - /// Push a [page] and pop several pages in the stack - /// until [predicate] returns true. [predicate] is optional - /// - /// It has the advantage of not needing context, - /// so you can call from your business logic - /// - /// You can set a custom [transition], a [curve] and a transition [duration]. - /// - /// You can send any type of value to the other route in the [arguments]. - /// - /// Just like native routing in Flutter, you can push a route - /// as a [fullscreenDialog], - /// - /// [predicate] can be used like this: - /// `Get.until((route) => Get.currentRoute == '/home')`so when you get to home page, - /// or also like - /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the dialog - /// is closed - /// - /// [id] is for when you are using nested navigation, - /// as explained in documentation - /// - /// If you want the same behavior of ios that pops a route when the user drag, - /// you can set [popGesture] to true - /// - /// If you're using the [Bindings] api, you must define it here - /// - /// By default, GetX will prevent you from push a route that you already in, - /// if you want to push anyway, set [preventDuplicates] to false - Future offAll( - Widget page, { - RoutePredicate predicate, - bool opaque = false, - bool popGesture, - int id, - dynamic arguments, - Bindings binding, - bool fullscreenDialog = false, - Transition transition, - Curve curve, - Duration duration, - }) { - var routeName = "/${page.runtimeType.toString()}"; - - return global(id)?.currentState?.pushAndRemoveUntil( - GetPageRoute( - opaque: opaque ?? true, - popGesture: popGesture ?? defaultPopGesture, - page: () => page, - binding: binding, - settings: RouteSettings(arguments: arguments), - fullscreenDialog: fullscreenDialog, - routeName: routeName, - transition: transition ?? defaultTransition, - curve: curve ?? defaultTransitionCurve, - transitionDuration: duration ?? defaultTransitionDuration, - ), - predicate ?? (route) => false); - } - - /// Show a dialog. - /// You can pass a [transitionDuration] and/or [transitionCurve], - /// overriding the defaults when the dialog shows up and closes. - /// When the dialog closes, uses those animations in reverse. - Future dialog( - Widget widget, { - bool barrierDismissible = true, - Color barrierColor, - bool useSafeArea = true, - bool useRootNavigator = true, - RouteSettings routeSettings, - Duration transitionDuration, - Curve transitionCurve, - }) { - assert(widget != null); - assert(barrierDismissible != null); - assert(useSafeArea != null); - assert(useRootNavigator != null); - assert(debugCheckHasMaterialLocalizations(context)); - - final theme = Theme.of(context, shadowThemeOnly: true); - return generalDialog( - pageBuilder: (buildContext, animation, secondaryAnimation) { - final pageChild = widget; - Widget dialog = Builder(builder: (context) { - return theme != null - ? Theme(data: theme, child: pageChild) - : pageChild; - }); - if (useSafeArea) { - dialog = SafeArea(child: dialog); - } - return dialog; - }, - barrierDismissible: barrierDismissible, - barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, - barrierColor: barrierColor ?? Colors.black54, - transitionDuration: transitionDuration ?? defaultDialogTransitionDuration, - transitionBuilder: (context, animation, secondaryAnimation, child) { - return FadeTransition( - opacity: CurvedAnimation( - parent: animation, - curve: transitionCurve ?? defaultDialogTransitionCurve, - ), - child: child, - ); - }, - useRootNavigator: useRootNavigator, - routeSettings: routeSettings, - ); - } - - /// Api from showGeneralDialog with no context - Future generalDialog({ - @required RoutePageBuilder pageBuilder, - bool barrierDismissible = false, - String barrierLabel, - Color barrierColor = const Color(0x80000000), - Duration transitionDuration = const Duration(milliseconds: 200), - RouteTransitionsBuilder transitionBuilder, - bool useRootNavigator = true, - RouteSettings routeSettings, - }) { - assert(pageBuilder != null); - assert(useRootNavigator != null); - assert(!barrierDismissible || barrierLabel != null); - return Navigator.of(overlayContext, rootNavigator: useRootNavigator) - .push(GetDialogRoute( - pageBuilder: pageBuilder, - barrierDismissible: barrierDismissible, - barrierLabel: barrierLabel, - barrierColor: barrierColor, - transitionDuration: transitionDuration, - transitionBuilder: transitionBuilder, - settings: routeSettings, - )); - } - - /// Custom UI Dialog. - Future defaultDialog({ - String title = "Alert", - TextStyle titleStyle, - Widget content, - VoidCallback onConfirm, - VoidCallback onCancel, - VoidCallback onCustom, - Color cancelTextColor, - Color confirmTextColor, - String textConfirm, - String textCancel, - String textCustom, - Widget confirm, - Widget cancel, - Widget custom, - Color backgroundColor, - bool barrierDismissible = true, - Color buttonColor, - String middleText = "Dialog made in 3 lines of code", - TextStyle middleTextStyle, - double radius = 20.0, - // ThemeData themeData, - List actions, - }) { - var leanCancel = onCancel != null || textCancel != null; - var leanConfirm = onConfirm != null || textConfirm != null; - actions ??= []; - - if (cancel != null) { - actions.add(cancel); - } else { - if (leanCancel) { - actions.add(FlatButton( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - onPressed: () { - onCancel?.call(); - back(); - }, - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 8), - child: Text( - textCancel ?? "Cancel", - style: TextStyle(color: cancelTextColor ?? theme.accentColor), - ), - shape: RoundedRectangleBorder( - side: BorderSide( - color: buttonColor ?? theme.accentColor, - width: 2, - style: BorderStyle.solid), - borderRadius: BorderRadius.circular(100)), - )); - } - } - if (confirm != null) { - actions.add(confirm); - } else { - if (leanConfirm) { - actions.add(FlatButton( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - color: buttonColor ?? theme.accentColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(100)), - child: Text( - textConfirm ?? "Ok", - style: TextStyle(color: confirmTextColor ?? theme.primaryColor), - ), - onPressed: () { - onConfirm?.call(); - })); - } - } - - return dialog( - AlertDialog( - titlePadding: EdgeInsets.all(8), - contentPadding: EdgeInsets.all(8), - backgroundColor: backgroundColor ?? theme.dialogBackgroundColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(radius))), - title: Text(title, textAlign: TextAlign.center, style: titleStyle), - content: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - content ?? - Text(middleText ?? "", - textAlign: TextAlign.center, style: middleTextStyle), - SizedBox(height: 16), - ButtonTheme( - minWidth: 78.0, - height: 34.0, - child: Wrap( - alignment: WrapAlignment.center, - spacing: 8, - runSpacing: 8, - children: actions, - ), - ) - ], - ), - // actions: actions, // ?? [cancelButton, confirmButton], - buttonPadding: EdgeInsets.zero, - ), - barrierDismissible: barrierDismissible, - ); - } - - Future bottomSheet( - Widget bottomsheet, { - Color backgroundColor, - double elevation, - bool persistent = true, - ShapeBorder shape, - Clip clipBehavior, - Color barrierColor, - bool ignoreSafeArea, - bool isScrollControlled = false, - bool useRootNavigator = false, - bool isDismissible = true, - bool enableDrag = true, - RouteSettings settings, - Duration enterBottomSheetDuration, - Duration exitBottomSheetDuration, - }) { - assert(bottomsheet != null); - assert(persistent != null); - assert(isScrollControlled != null); - assert(useRootNavigator != null); - assert(isDismissible != null); - assert(enableDrag != null); - - return Navigator.of(overlayContext, rootNavigator: useRootNavigator) - .push(GetModalBottomSheetRoute( - builder: (_) => bottomsheet, - isPersistent: persistent, - theme: Theme.of(key.currentContext, shadowThemeOnly: true), - isScrollControlled: isScrollControlled, - barrierLabel: - MaterialLocalizations.of(key.currentContext).modalBarrierDismissLabel, - backgroundColor: backgroundColor ?? Colors.transparent, - elevation: elevation, - shape: shape, - removeTop: ignoreSafeArea ?? true, - clipBehavior: clipBehavior, - isDismissible: isDismissible, - modalBarrierColor: barrierColor, - settings: settings, - enableDrag: enableDrag, - )); - } - - void rawSnackbar({ - String title, - String message, - Widget titleText, - Widget messageText, - Widget icon, - bool instantInit = true, - bool shouldIconPulse = true, - double maxWidth, - EdgeInsets margin = const EdgeInsets.all(0.0), - EdgeInsets padding = const EdgeInsets.all(16), - double borderRadius = 0.0, - Color borderColor, - double borderWidth = 1.0, - Color backgroundColor = const Color(0xFF303030), - Color leftBarIndicatorColor, - List boxShadows, - Gradient backgroundGradient, - FlatButton mainButton, - OnTap onTap, - Duration duration = const Duration(seconds: 3), - bool isDismissible = true, - SnackDismissDirection dismissDirection = SnackDismissDirection.VERTICAL, - bool showProgressIndicator = false, - AnimationController progressIndicatorController, - Color progressIndicatorBackgroundColor, - Animation progressIndicatorValueColor, - SnackPosition snackPosition = SnackPosition.BOTTOM, - SnackStyle snackStyle = SnackStyle.FLOATING, - Curve forwardAnimationCurve = Curves.easeOutCirc, - Curve reverseAnimationCurve = Curves.easeOutCirc, - Duration animationDuration = const Duration(seconds: 1), - SnackbarStatusCallback snackbarStatus, - double barBlur = 0.0, - double overlayBlur = 0.0, - Color overlayColor, - Form userInputForm, - }) async { - final getBar = GetBar( - snackbarStatus: snackbarStatus, - title: title, - message: message, - titleText: titleText, - messageText: messageText, - snackPosition: snackPosition, - borderRadius: borderRadius, - margin: margin, - duration: duration, - barBlur: barBlur, - backgroundColor: backgroundColor, - icon: icon, - shouldIconPulse: shouldIconPulse, - maxWidth: maxWidth, - padding: padding, - borderColor: borderColor, - borderWidth: borderWidth, - leftBarIndicatorColor: leftBarIndicatorColor, - boxShadows: boxShadows, - backgroundGradient: backgroundGradient, - mainButton: mainButton, - onTap: onTap, - isDismissible: isDismissible, - dismissDirection: dismissDirection, - showProgressIndicator: showProgressIndicator ?? false, - progressIndicatorController: progressIndicatorController, - progressIndicatorBackgroundColor: progressIndicatorBackgroundColor, - progressIndicatorValueColor: progressIndicatorValueColor, - snackStyle: snackStyle, - forwardAnimationCurve: forwardAnimationCurve, - reverseAnimationCurve: reverseAnimationCurve, - animationDuration: animationDuration, - overlayBlur: overlayBlur, - overlayColor: overlayColor, - userInputForm: userInputForm, - ); - - if (instantInit) { - getBar.show(); - } else { - SchedulerBinding.instance.addPostFrameCallback((_) { - getBar.show(); - }); - } - } - - Future showSnackbar(GetBar snackbar) { - return key?.currentState?.push(SnackRoute(snack: snackbar)); - } - - void snackbar( - String title, - String message, { - Color colorText, - Duration duration, - - /// with instantInit = false you can put snackbar on initState - bool instantInit = true, - SnackPosition snackPosition, - Widget titleText, - Widget messageText, - Widget icon, - bool shouldIconPulse, - double maxWidth, - EdgeInsets margin, - EdgeInsets padding, - double borderRadius, - Color borderColor, - double borderWidth, - Color backgroundColor, - Color leftBarIndicatorColor, - List boxShadows, - Gradient backgroundGradient, - FlatButton mainButton, - OnTap onTap, - bool isDismissible, - bool showProgressIndicator, - SnackDismissDirection dismissDirection, - AnimationController progressIndicatorController, - Color progressIndicatorBackgroundColor, - Animation progressIndicatorValueColor, - SnackStyle snackStyle, - Curve forwardAnimationCurve, - Curve reverseAnimationCurve, - Duration animationDuration, - double barBlur, - double overlayBlur, - SnackbarStatusCallback snackbarStatus, - Color overlayColor, - Form userInputForm, - }) async { - final getBar = GetBar( - snackbarStatus: snackbarStatus, - titleText: (title == null) - ? null - : titleText ?? - Text( - title, - style: TextStyle( - color: colorText ?? iconColor ?? Colors.black, - fontWeight: FontWeight.w800, - fontSize: 16, - ), - ), - messageText: messageText ?? - Text( - message, - style: TextStyle( - color: colorText ?? iconColor ?? Colors.black, - fontWeight: FontWeight.w300, - fontSize: 14, - ), - ), - snackPosition: snackPosition ?? SnackPosition.TOP, - borderRadius: borderRadius ?? 15, - margin: margin ?? EdgeInsets.symmetric(horizontal: 10), - duration: duration ?? Duration(seconds: 3), - barBlur: barBlur ?? 7.0, - backgroundColor: backgroundColor ?? Colors.grey.withOpacity(0.2), - icon: icon, - shouldIconPulse: shouldIconPulse ?? true, - maxWidth: maxWidth, - padding: padding ?? EdgeInsets.all(16), - borderColor: borderColor, - borderWidth: borderWidth, - leftBarIndicatorColor: leftBarIndicatorColor, - boxShadows: boxShadows, - backgroundGradient: backgroundGradient, - mainButton: mainButton, - onTap: onTap, - isDismissible: isDismissible ?? true, - dismissDirection: dismissDirection ?? SnackDismissDirection.VERTICAL, - showProgressIndicator: showProgressIndicator ?? false, - progressIndicatorController: progressIndicatorController, - progressIndicatorBackgroundColor: progressIndicatorBackgroundColor, - progressIndicatorValueColor: progressIndicatorValueColor, - snackStyle: snackStyle ?? SnackStyle.FLOATING, - forwardAnimationCurve: forwardAnimationCurve ?? Curves.easeOutCirc, - reverseAnimationCurve: reverseAnimationCurve ?? Curves.easeOutCirc, - animationDuration: animationDuration ?? Duration(seconds: 1), - overlayBlur: overlayBlur ?? 0.0, - overlayColor: overlayColor ?? Colors.transparent, - userInputForm: userInputForm); - - if (instantInit) { - showSnackbar(getBar); - } else { - routing.isSnackbar = true; - SchedulerBinding.instance.addPostFrameCallback((_) { - showSnackbar(getBar); - }); - } - } - - void addPages(List getPages) { - if (getPages != null) { - if (routeTree == null) { - routeTree = ParseRouteTree(); - } - - for (final element in getPages) { - routeTree.addRoute(element); - } - } - } - - void addPage(GetPage getPage) { - if (getPage != null) { - if (routeTree == null) routeTree = ParseRouteTree(); - routeTree.addRoute(getPage); - } - } - - /// change default config of Get - void config( - {bool enableLog, - LogWriterCallback logWriterCallback, - bool defaultPopGesture, - bool defaultOpaqueRoute, - Duration defaultDurationTransition, - bool defaultGlobalState, - Transition defaultTransition}) { - if (enableLog != null) { - Get.isLogEnable = enableLog; - } - if (logWriterCallback != null) { - Get.log = logWriterCallback; - } - if (defaultPopGesture != null) { - getxController.defaultPopGesture = defaultPopGesture; - } - if (defaultOpaqueRoute != null) { - getxController.defaultOpaqueRoute = defaultOpaqueRoute; - } - if (defaultTransition != null) { - getxController.defaultTransition = defaultTransition; - } - - if (defaultDurationTransition != null) { - getxController.defaultTransitionDuration = defaultDurationTransition; - } - } - - void updateLocale(Locale l) { - Get.locale = l; - forceAppUpdate(); - } - - void forceAppUpdate() { - void restart(Element element) { - element.markNeedsBuild(); - element.visitChildren(restart); - } - - restart(Get.context as Element); - } - - void appUpdate() => getxController.update(); - - void changeTheme(ThemeData theme) { - getxController.setTheme(theme); - } - - void changeThemeMode(ThemeMode themeMode) { - getxController.setThemeMode(themeMode); - } - - GlobalKey addKey(GlobalKey newKey) { - getxController.key = newKey; - return key; - } - - GlobalKey nestedKey(int key) { - keys.putIfAbsent(key, () => GlobalKey()); - return keys[key]; - } - - GlobalKey global(int k) { - GlobalKey _key; - if (k == null) { - _key = key; - } else { - if (!keys.containsKey(k)) { - throw 'Route id ($k) not found'; - } - _key = keys[k]; - } - - if (_key.currentContext == null) { - throw """You are trying to use contextless navigation without - a GetMaterialApp or Get.key. - If you are testing your app, you can use: - [Get.testMode = true], or if you are running your app on - a physical device or emulator, you must exchange your [MaterialApp] - for a [GetMaterialApp]. - """; - } - - return _key; - } - - @Deprecated(''' -Since version 2.8 it is possible to access the properties -[Get.arguments] and [Get.currentRoute] directly. -[routeSettings] is useless and should not be used.''') - RouteSettings get routeSettings => null; - - /// give current arguments - dynamic get arguments => routing.args; - - /// give name from current route - String get currentRoute => routing.current; - - /// give name from previous route - String get previousRoute => routing.previous; - - /// check if snackbar is open - bool get isSnackbarOpen => routing.isSnackbar; - - /// check if dialog is open - bool get isDialogOpen => routing.isDialog; - - /// check if bottomsheet is open - bool get isBottomSheetOpen => routing.isBottomSheet; - - /// check a raw current route - Route get rawRoute => routing.route; - - /// check if popGesture is enable - bool get isPopGestureEnable => defaultPopGesture; - - /// check if default opaque route is enable - bool get isOpaqueRouteDefault => defaultOpaqueRoute; - - /// give access to currentContext - BuildContext get context => key?.currentContext; - - /// give access to current Overlay Context - BuildContext get overlayContext => key?.currentState?.overlay?.context; - - /// give access to Theme.of(context) - ThemeData get theme { - ThemeData _theme; - if (context != null) { - _theme = Theme.of(context); - } - return _theme; - } - - /// give access to TextTheme.of(context) - TextTheme get textTheme => theme?.textTheme; - - /// give access to Mediaquery.of(context) - MediaQueryData get mediaQuery => MediaQuery.of(context); - - /// Check if dark mode theme is enable - bool get isDarkMode => (theme.brightness == Brightness.dark); - - /// Check if dark mode theme is enable on platform on android Q+ - bool get isPlatformDarkMode => - (mediaQuery.platformBrightness == Brightness.dark); - - /// give access to Theme.of(context).iconTheme.color - Color get iconColor => theme?.iconTheme?.color; - - /// give access to FocusScope.of(context) - FocusNode get focusScope => FocusManager.instance.primaryFocus; - - /// give access to Immutable MediaQuery.of(context).size.height - double get height => MediaQuery.of(context).size.height; - - /// give access to Immutable MediaQuery.of(context).size.width - double get width => MediaQuery.of(context).size.width; - - GlobalKey get key { - final _key = getxController?.key; - - return _key; - } - - Map> get keys => getxController?.keys; - - GetMaterialController get rootController => getxController; - - bool get defaultPopGesture => getxController.defaultPopGesture; - bool get defaultOpaqueRoute => getxController.defaultOpaqueRoute; - - Transition get defaultTransition => getxController.defaultTransition; - - Duration get defaultTransitionDuration { - return getxController.defaultTransitionDuration; - } - - Curve get defaultTransitionCurve => getxController.defaultTransitionCurve; - - Curve get defaultDialogTransitionCurve { - return getxController.defaultDialogTransitionCurve; - } - - Duration get defaultDialogTransitionDuration { - return getxController.defaultDialogTransitionDuration; - } - - Routing get routing => getxController.routing; - - Map get parameters => getxController.parameters; - set parameters(Map newParameters) => - getxController.parameters = newParameters; - - ParseRouteTree get routeTree => getxController.routeTree; - set routeTree(ParseRouteTree tree) => getxController.routeTree = tree; - - CustomTransition get customTransition => getxController.customTransition; - set customTransition(CustomTransition newTransition) => - getxController.customTransition = newTransition; - - bool get testMode => getxController.testMode; - set testMode(bool isTest) => getxController.testMode = isTest; - - static GetMaterialController getxController = GetMaterialController(); -} - -/// It replaces the Flutter Navigator, but needs no context. -/// You can to use navigator.push(YourRoute()) rather -/// Navigator.push(context, YourRoute()); -NavigatorState get navigator => GetNavigation(Get).key.currentState; diff --git a/packages/get_navigation/lib/src/root/parse_route.dart b/packages/get_navigation/lib/src/root/parse_route.dart deleted file mode 100644 index d71d660d5..000000000 --- a/packages/get_navigation/lib/src/root/parse_route.dart +++ /dev/null @@ -1,226 +0,0 @@ -import 'package:flutter/widgets.dart'; - -import '../routes/get_route.dart'; - -class ParseRouteTree { - final List<_ParseRouteTreeNode> _nodes = <_ParseRouteTreeNode>[]; - - // bool _hasDefaultRoute = false; - - void addRoute(GetPage route) { - var path = route.name; - - if (path == Navigator.defaultRouteName) { - // if (_hasDefaultRoute) { - // throw ("Default route was already defined"); - // } - var node = _ParseRouteTreeNode(path, _ParseRouteTreeNodeType.component); - node.routes = [route]; - _nodes.add(node); - // _hasDefaultRoute = true; - return; - } - if (path.startsWith("/")) { - path = path.substring(1); - } - var pathComponents = path.split('/'); - _ParseRouteTreeNode parent; - for (var i = 0; i < pathComponents.length; i++) { - var component = pathComponents[i]; - var node = _nodeForComponent(component, parent); - if (node == null) { - var type = _typeForComponent(component); - node = _ParseRouteTreeNode(component, type); - node.parent = parent; - if (parent == null) { - _nodes.add(node); - } else { - parent.nodes.add(node); - } - } - if (i == pathComponents.length - 1) { - if (node.routes == null) { - node.routes = [route]; - } else { - node.routes.add(route); - } - } - parent = node; - } - } - - _GetPageMatch matchRoute(String path) { - var usePath = path; - if (usePath.startsWith("/")) { - usePath = path.substring(1); - } - - // should take off url parameters first.. - final uri = Uri.tryParse(usePath); -// List components = usePath.split("/"); - var components = uri.pathSegments; - if (path == Navigator.defaultRouteName) { - components = ["/"]; - } - var nodeMatches = <_ParseRouteTreeNode, _ParseRouteTreeNodeMatch>{}; - var nodesToCheck = _nodes; - for (final checkComponent in components) { - final currentMatches = <_ParseRouteTreeNode, _ParseRouteTreeNodeMatch>{}; - final nextNodes = <_ParseRouteTreeNode>[]; - for (final node in nodesToCheck) { - var pathPart = checkComponent; - var queryMap = {}; - - if (checkComponent.contains("?") && !checkComponent.contains("=")) { - var splitParam = checkComponent.split("?"); - pathPart = splitParam[0]; - queryMap = {pathPart: splitParam[1]}; - } else if (checkComponent.contains("?")) { - var splitParam = checkComponent.split("?"); - var splitParam2 = splitParam[1].split("="); - if (!splitParam2[1].contains("&")) { - pathPart = splitParam[0]; - queryMap = {splitParam2[0]: splitParam2[1]}; - } else { - pathPart = splitParam[0]; - final second = splitParam[1]; - var other = second.split(RegExp(r"[&,=]")); - for (var i = 0; i < (other.length - 1); i++) { - var isOdd = (i % 2 == 0); - if (isOdd) { - queryMap.addAll({other[0 + i]: other[1 + i]}); - } - } - } - } - - final isMatch = (node.part == pathPart || node.isParameter()); - if (isMatch) { - final parentMatch = nodeMatches[node.parent]; - final match = _ParseRouteTreeNodeMatch.fromMatch(parentMatch, node); - - // TODO: find a way to clean this implementation. - match.parameters.addAll(uri.queryParameters); - - if (node.isParameter()) { - final paramKey = node.part.substring(1); - match.parameters[paramKey] = pathPart; - } - if (queryMap != null) { - match.parameters.addAll(queryMap); - } - - currentMatches[node] = match; - if (node.nodes != null) { - nextNodes.addAll(node.nodes); - } - } - } - nodeMatches = currentMatches; - nodesToCheck = nextNodes; - if (currentMatches.values.length == 0) { - return null; - } - } - var matches = nodeMatches.values.toList(); - if (matches.length > 0) { - var match = matches.first; - var nodeToUse = match.node; - - if (nodeToUse != null && - nodeToUse.routes != null && - nodeToUse.routes.length > 0) { - var routes = nodeToUse.routes; - var routeMatch = _GetPageMatch(routes[0]); - - routeMatch.parameters = match.parameters; - - return routeMatch; - } - } - return null; - } - - _ParseRouteTreeNode _nodeForComponent( - String component, - _ParseRouteTreeNode parent, - ) { - var nodes = _nodes; - if (parent != null) { - nodes = parent.nodes; - } - for (var node in nodes) { - if (node.part == component) { - return node; - } - } - return null; - } - - _ParseRouteTreeNodeType _typeForComponent(String component) { - var type = _ParseRouteTreeNodeType.component; - if (_isParameterComponent(component)) { - type = _ParseRouteTreeNodeType.parameter; - } - return type; - } - - bool _isParameterComponent(String component) { - return component.startsWith(":"); - } - - Map parseQueryString(String query) { - var search = RegExp('([^&=]+)=?([^&]*)'); - var params = {}; - if (query.startsWith('?')) query = query.substring(1); - decode(String s) => Uri.decodeComponent(s.replaceAll('+', ' ')); - - for (Match match in search.allMatches(query)) { - var key = decode(match.group(1)); - final value = decode(match.group(2)); - params[key] = value; - } - return params; - } -} - -class _ParseRouteTreeNodeMatch { - _ParseRouteTreeNodeMatch(this.node); - - _ParseRouteTreeNodeMatch.fromMatch( - _ParseRouteTreeNodeMatch match, this.node) { - parameters = {}; - if (match != null) { - parameters.addAll(match.parameters); - } - } - - _ParseRouteTreeNode node; - Map parameters = {}; -} - -class _ParseRouteTreeNode { - _ParseRouteTreeNode(this.part, this.type); - - String part; - _ParseRouteTreeNodeType type; - List routes = []; - List<_ParseRouteTreeNode> nodes = <_ParseRouteTreeNode>[]; - _ParseRouteTreeNode parent; - - bool isParameter() { - return type == _ParseRouteTreeNodeType.parameter; - } -} - -class _GetPageMatch { - _GetPageMatch(this.route); - - GetPage route; - Map parameters = {}; -} - -enum _ParseRouteTreeNodeType { - component, - parameter, -} diff --git a/packages/get_navigation/lib/src/root/root_controller.dart b/packages/get_navigation/lib/src/root/root_controller.dart deleted file mode 100644 index 7c0265ee9..000000000 --- a/packages/get_navigation/lib/src/root/root_controller.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get_state_manager/get_state_manager.dart'; -import 'package:get_utils/get_utils.dart'; -import '../routes/custom_transition.dart'; -import '../routes/observers/route_observer.dart'; -import '../routes/transitions_type.dart'; -import 'parse_route.dart'; - -class GetMaterialController extends GetxController { - bool testMode = false; - Key unikey; - ThemeData theme; - ThemeMode themeMode; - - bool defaultPopGesture = GetPlatform.isIOS; - bool defaultOpaqueRoute = true; - - Transition defaultTransition; - Duration defaultTransitionDuration = Duration(milliseconds: 300); - Curve defaultTransitionCurve = Curves.easeOutQuad; - - Curve defaultDialogTransitionCurve = Curves.easeOutQuad; - - Duration defaultDialogTransitionDuration = Duration(milliseconds: 300); - - final routing = Routing(); - - Map parameters = {}; - - ParseRouteTree routeTree; - - CustomTransition customTransition; - - GlobalKey key = GlobalKey(); - - Map> keys = {}; - - void setTheme(ThemeData value) { - theme = value; - update(); - } - - void setThemeMode(ThemeMode value) { - themeMode = value; - update(); - } - - void restartApp() { - unikey = UniqueKey(); - update(); - } -} diff --git a/packages/get_navigation/lib/src/root/root_widget.dart b/packages/get_navigation/lib/src/root/root_widget.dart deleted file mode 100644 index 100ea61a7..000000000 --- a/packages/get_navigation/lib/src/root/root_widget.dart +++ /dev/null @@ -1,300 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_state_manager/get_state_manager.dart'; -import 'package:get_utils/get_utils.dart'; -import '../../get_navigation.dart'; -import 'root_controller.dart'; - -class GetMaterialApp extends StatelessWidget { - const GetMaterialApp({ - Key key, - this.navigatorKey, - this.home, - this.routes = const {}, - this.initialRoute, - this.onGenerateRoute, - this.onGenerateInitialRoutes, - this.onUnknownRoute, - this.navigatorObservers = const [], - this.builder, - this.translationsKeys, - this.translations, - this.textDirection, - this.title = '', - this.onGenerateTitle, - this.color, - this.customTransition, - this.onInit, - this.onDispose, - this.theme, - this.darkTheme, - this.themeMode = ThemeMode.system, - this.locale, - this.fallbackLocale, - this.localizationsDelegates, - this.localeListResolutionCallback, - this.localeResolutionCallback, - this.supportedLocales = const [Locale('en', 'US')], - this.debugShowMaterialGrid = false, - this.showPerformanceOverlay = false, - this.checkerboardRasterCacheImages = false, - this.checkerboardOffscreenLayers = false, - this.showSemanticsDebugger = false, - this.debugShowCheckedModeBanner = true, - this.shortcuts, - this.smartManagement = SmartManagement.full, - this.initialBinding, - this.unknownRoute, - this.routingCallback, - this.defaultTransition, - // this.actions, - this.getPages, - this.opaqueRoute, - this.enableLog, - this.logWriterCallback, - this.popGesture, - this.transitionDuration, - this.defaultGlobalState, - }) : assert(routes != null), - assert(navigatorObservers != null), - assert(title != null), - assert(debugShowMaterialGrid != null), - assert(showPerformanceOverlay != null), - assert(checkerboardRasterCacheImages != null), - assert(checkerboardOffscreenLayers != null), - assert(showSemanticsDebugger != null), - assert(debugShowCheckedModeBanner != null), - super(key: key); - - final GlobalKey navigatorKey; - final Widget home; - final Map routes; - final String initialRoute; - final RouteFactory onGenerateRoute; - final InitialRouteListFactory onGenerateInitialRoutes; - final RouteFactory onUnknownRoute; - final List navigatorObservers; - final TransitionBuilder builder; - final String title; - final GenerateAppTitle onGenerateTitle; - final ThemeData theme; - final ThemeData darkTheme; - final ThemeMode themeMode; - final CustomTransition customTransition; - final Color color; - final Map> translationsKeys; - final Translations translations; - final TextDirection textDirection; - final Locale locale; - final Locale fallbackLocale; - final Iterable> localizationsDelegates; - final LocaleListResolutionCallback localeListResolutionCallback; - final LocaleResolutionCallback localeResolutionCallback; - final Iterable supportedLocales; - final bool showPerformanceOverlay; - final bool checkerboardRasterCacheImages; - final bool checkerboardOffscreenLayers; - final bool showSemanticsDebugger; - final bool debugShowCheckedModeBanner; - final Map shortcuts; - - // final Map actions; - final bool debugShowMaterialGrid; - final Function(Routing) routingCallback; - final Transition defaultTransition; - final bool opaqueRoute; - final VoidCallback onInit; - final VoidCallback onDispose; - final bool enableLog; - final LogWriterCallback logWriterCallback; - final bool popGesture; - final SmartManagement smartManagement; - final Bindings initialBinding; - final Duration transitionDuration; - final bool defaultGlobalState; - final List getPages; - final GetPage unknownRoute; - - Route generator(RouteSettings settings) { - final match = Get.routeTree.matchRoute(settings.name); - Get.parameters = match?.parameters; - - if (match?.route == null) { - return GetPageRoute( - page: unknownRoute.page, - parameter: unknownRoute.parameter, - settings: - RouteSettings(name: settings.name, arguments: settings.arguments), - curve: unknownRoute.curve, - opaque: unknownRoute.opaque, - customTransition: unknownRoute.customTransition, - binding: unknownRoute.binding, - bindings: unknownRoute.bindings, - transitionDuration: - (unknownRoute.transitionDuration ?? Get.defaultTransitionDuration), - transition: unknownRoute.transition, - popGesture: unknownRoute.popGesture, - fullscreenDialog: unknownRoute.fullscreenDialog, - ); - } - - return GetPageRoute( - page: match.route.page, - parameter: match.route.parameter, - settings: - RouteSettings(name: settings.name, arguments: settings.arguments), - curve: match.route.curve, - opaque: match.route.opaque, - customTransition: match.route.customTransition, - binding: match.route.binding, - bindings: match.route.bindings, - transitionDuration: - (match.route.transitionDuration ?? Get.defaultTransitionDuration), - transition: match.route.transition, - popGesture: match.route.popGesture, - fullscreenDialog: match.route.fullscreenDialog, - ); - } - - List> initialRoutesGenerate(String name) { - final match = Get.routeTree.matchRoute(name); - Get.parameters = match?.parameters; - - //Route can be nullable, just pass the unknown route - if (match?.route == null) { - return [ - GetPageRoute( - page: unknownRoute.page, - parameter: unknownRoute.parameter, - settings: RouteSettings(name: name, arguments: null), - curve: unknownRoute.curve, - opaque: unknownRoute.opaque, - customTransition: unknownRoute.customTransition, - binding: unknownRoute.binding, - bindings: unknownRoute.bindings, - transitionDuration: (unknownRoute.transitionDuration ?? - Get.defaultTransitionDuration), - transition: unknownRoute.transition, - popGesture: unknownRoute.popGesture, - fullscreenDialog: unknownRoute.fullscreenDialog, - ) - ]; - } - - return [ - GetPageRoute( - page: match.route.page, - parameter: match.route.parameter, - settings: RouteSettings(name: name, arguments: null), - curve: match.route.curve, - opaque: match.route.opaque, - binding: match.route.binding, - bindings: match.route.bindings, - transitionDuration: - (match.route.transitionDuration ?? Get.defaultTransitionDuration), - transition: match.route.transition, - popGesture: match.route.popGesture, - fullscreenDialog: match.route.fullscreenDialog, - ) - ]; - } - - @override - Widget build(BuildContext context) { - return GetBuilder( - init: Get.rootController, - dispose: (d) { - onDispose?.call(); - }, - initState: (i) { - if (locale != null) Get.locale = locale; - - if (fallbackLocale != null) Get.fallbackLocale = fallbackLocale; - - if (translations != null) { - Get.addTranslations(translations.keys); - } else if (translationsKeys != null) { - Get.addTranslations(translationsKeys); - } - - Get.customTransition = customTransition; - - initialBinding?.dependencies(); - Get.addPages(getPages); - Get.smartManagement = smartManagement; - onInit?.call(); - - Get.config( - enableLog: enableLog ?? Get.isLogEnable, - logWriterCallback: logWriterCallback, - defaultTransition: defaultTransition ?? Get.defaultTransition, - defaultOpaqueRoute: opaqueRoute ?? Get.isOpaqueRouteDefault, - defaultPopGesture: popGesture ?? Get.isPopGestureEnable, - defaultDurationTransition: - transitionDuration ?? Get.defaultTransitionDuration, - ); - }, - builder: (_) { - return MaterialApp( - key: _.unikey, - navigatorKey: - (navigatorKey == null ? Get.key : Get.addKey(navigatorKey)), - home: home, - routes: routes ?? const {}, - initialRoute: initialRoute, - onGenerateRoute: (getPages != null ? generator : onGenerateRoute), - onGenerateInitialRoutes: (getPages == null || home != null) - ? onGenerateInitialRoutes - : initialRoutesGenerate, - onUnknownRoute: onUnknownRoute, - navigatorObservers: (navigatorObservers == null - ? [GetObserver(routingCallback, Get.routing)] - : [GetObserver(routingCallback, Get.routing)] - ..addAll(navigatorObservers)), - builder: (context, child) { - return Directionality( - textDirection: textDirection ?? - (rtlLanguages.contains(Get.locale?.languageCode) - ? TextDirection.rtl - : TextDirection.ltr), - child: builder == null ? child : builder(context, child), - ); - }, - title: title ?? '', - onGenerateTitle: onGenerateTitle, - color: color, - theme: _.theme ?? theme ?? ThemeData.fallback(), - darkTheme: darkTheme, - themeMode: _.themeMode ?? themeMode ?? ThemeMode.system, - locale: Get.locale ?? locale, - localizationsDelegates: localizationsDelegates, - localeListResolutionCallback: localeListResolutionCallback, - localeResolutionCallback: localeResolutionCallback, - supportedLocales: - supportedLocales ?? const [Locale('en', 'US')], - debugShowMaterialGrid: debugShowMaterialGrid ?? false, - showPerformanceOverlay: showPerformanceOverlay ?? false, - checkerboardRasterCacheImages: - checkerboardRasterCacheImages ?? false, - checkerboardOffscreenLayers: checkerboardOffscreenLayers ?? false, - showSemanticsDebugger: showSemanticsDebugger ?? false, - debugShowCheckedModeBanner: debugShowCheckedModeBanner ?? true, - shortcuts: shortcuts, - // actions: actions, - ); - }); - } -} - -const List rtlLanguages = [ - 'ar', // Arabic - 'fa', // Farsi - 'he', // Hebrew - 'ps', // Pashto - 'ur', -]; - -abstract class Translations { - Map> get keys; -} diff --git a/packages/get_navigation/lib/src/routes/custom_transition.dart b/packages/get_navigation/lib/src/routes/custom_transition.dart deleted file mode 100644 index b3e7d855d..000000000 --- a/packages/get_navigation/lib/src/routes/custom_transition.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/widgets.dart'; - -// ignore: one_member_abstracts -abstract class CustomTransition { - Widget buildTransition( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child, - ); -} diff --git a/packages/get_navigation/lib/src/routes/default_route.dart b/packages/get_navigation/lib/src/routes/default_route.dart deleted file mode 100644 index 1e182ee17..000000000 --- a/packages/get_navigation/lib/src/routes/default_route.dart +++ /dev/null @@ -1,602 +0,0 @@ -import 'dart:math'; -import 'dart:ui' show lerpDouble; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_state_manager/get_state_manager.dart'; -import '../../get_navigation.dart'; -import 'custom_transition.dart'; -import 'default_transitions.dart'; -import 'transitions_type.dart'; - -class GetPageRoute extends PageRoute { - GetPageRoute({ - RouteSettings settings, - this.transitionDuration = const Duration(milliseconds: 300), - this.opaque = true, - this.parameter, - this.curve, - this.alignment, - this.transition, - this.popGesture, - this.customTransition, - this.barrierDismissible = false, - this.barrierColor, - this.binding, - this.bindings, - this.routeName, - this.page, - this.barrierLabel, - this.maintainState = true, - bool fullscreenDialog = false, - }) : assert(opaque != null), - assert(barrierDismissible != null), - assert(maintainState != null), - assert(fullscreenDialog != null), - super(settings: settings, fullscreenDialog: fullscreenDialog); - - @override - final Duration transitionDuration; - - final GetPageBuilder page; - - final String routeName; - - final CustomTransition customTransition; - - final Bindings binding; - - final Map parameter; - - final List bindings; - - @override - final bool opaque; - - final bool popGesture; - - @override - final bool barrierDismissible; - - final Transition transition; - - final Curve curve; - - final Alignment alignment; - - @override - final Color barrierColor; - - @override - final String barrierLabel; - - @override - final bool maintainState; - - @override - bool canTransitionTo(TransitionRoute nextRoute) { - // Don't perform outgoing animation if the next route is a - // fullscreen dialog. - return nextRoute is PageRoute && !nextRoute.fullscreenDialog; - } - - static bool _isPopGestureEnabled(PageRoute route) { - // ignore: lines_longer_than_80_chars - if (route.isFirst || - route.willHandlePopInternally || - route.hasScopedWillPopCallback || - route.fullscreenDialog || - route.animation.status != AnimationStatus.completed || - route.secondaryAnimation.status != AnimationStatus.dismissed || - isPopGestureInProgress(route)) return false; - - return true; - } - - static _CupertinoBackGestureController _startPopGesture( - PageRoute route) { - assert(_isPopGestureEnabled(route)); - - return _CupertinoBackGestureController( - navigator: route.navigator, - controller: route.controller, - ); - } - - @override - Widget buildPage( - BuildContext context, - Animation animation, - Animation secondaryAnimation, - ) { - Get.reference = settings.name ?? routeName; - binding?.dependencies(); - if (bindings != null) { - for (final binding in bindings) { - binding.dependencies(); - } - } - // final pageWidget = page(); - return page(); - } - - static bool isPopGestureInProgress(PageRoute route) { - return route.navigator.userGestureInProgress; - } - - bool get popGestureInProgress => isPopGestureInProgress(this); - - @override - Widget buildTransitions(BuildContext context, Animation animation, - Animation secondaryAnimation, Widget child) { - final finalCurve = curve ?? Get.defaultTransitionCurve; - final hasCurve = curve != null; - if (fullscreenDialog && transition == null) { - /// by default, if no curve is defined, use Cupertino transition in the - /// default way (no linearTransition)... otherwise take the curve passed. - return CupertinoFullscreenDialogTransition( - primaryRouteAnimation: hasCurve - ? CurvedAnimation(parent: animation, curve: finalCurve) - : animation, - secondaryRouteAnimation: secondaryAnimation, - child: child, - linearTransition: hasCurve); - } - if (customTransition != null) { - return customTransition.buildTransition( - context, - finalCurve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child, - ); - } - - /// Apply the curve by default... - final iosAnimation = animation; - animation = CurvedAnimation(parent: animation, curve: finalCurve); - - switch (transition ?? Get.defaultTransition) { - case Transition.leftToRight: - return SlideLeftTransition().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.downToUp: - return SlideDownTransition().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.upToDown: - return SlideTopTransition().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.noTransition: - return popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child; - - case Transition.rightToLeft: - return SlideRightTransition().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.zoom: - return ZoomInTransition().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.fadeIn: - return FadeInTransition().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.rightToLeftWithFade: - return RightToLeftFadeTransition().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.leftToRightWithFade: - return LeftToRightFadeTransition().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.cupertino: - return CupertinoPageTransitionsBuilder().buildTransitions( - this, - context, - iosAnimation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.size: - return SizeTransitions().buildTransitions( - context, - curve, - alignment, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.fade: - return FadeUpwardsPageTransitionsBuilder().buildTransitions( - this, - context, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.topLevel: - return ZoomPageTransitionsBuilder().buildTransitions( - this, - context, - animation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - case Transition.native: - return PageTransitionsTheme().buildTransitions( - this, - context, - iosAnimation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - - default: - if (Get.customTransition != null) { - return Get.customTransition.buildTransition( - context, curve, alignment, animation, secondaryAnimation, child); - } - - return PageTransitionsTheme().buildTransitions( - this, - context, - iosAnimation, - secondaryAnimation, - popGesture ?? Get.defaultPopGesture - ? _CupertinoBackGestureDetector( - enabledCallback: () => _isPopGestureEnabled(this), - onStartPopGesture: () => _startPopGesture(this), - child: child) - : child); - } - } - - @override - void dispose() { - if (Get.smartManagement != SmartManagement.onlyBuilder) { - WidgetsBinding.instance.addPostFrameCallback((_) => GetInstance() - .removeDependencyByRoute("${settings?.name ?? routeName}")); - } - super.dispose(); - } -} - -const double _kBackGestureWidth = 20.0; -const double _kMinFlingVelocity = 1.0; -const int _kMaxDroppedSwipePageForwardAnimationTime = 800; // Milliseconds. - -// The maximum time for a page to get reset to it's original position if the -// user releases a page mid swipe. -const int _kMaxPageBackAnimationTime = 300; - -class _CupertinoBackGestureDetector extends StatefulWidget { - const _CupertinoBackGestureDetector({ - Key key, - @required this.enabledCallback, - @required this.onStartPopGesture, - @required this.child, - }) : assert(enabledCallback != null), - assert(onStartPopGesture != null), - assert(child != null), - super(key: key); - - final Widget child; - - final ValueGetter enabledCallback; - - final ValueGetter<_CupertinoBackGestureController> onStartPopGesture; - - @override - _CupertinoBackGestureDetectorState createState() => - _CupertinoBackGestureDetectorState(); -} - -class _CupertinoBackGestureDetectorState - extends State<_CupertinoBackGestureDetector> { - _CupertinoBackGestureController _backGestureController; - - HorizontalDragGestureRecognizer _recognizer; - - @override - void initState() { - super.initState(); - _recognizer = HorizontalDragGestureRecognizer(debugOwner: this) - ..onStart = _handleDragStart - ..onUpdate = _handleDragUpdate - ..onEnd = _handleDragEnd - ..onCancel = _handleDragCancel; - } - - @override - void dispose() { - _recognizer.dispose(); - super.dispose(); - } - - void _handleDragStart(DragStartDetails details) { - assert(mounted); - assert(_backGestureController == null); - _backGestureController = widget.onStartPopGesture(); - } - - void _handleDragUpdate(DragUpdateDetails details) { - assert(mounted); - assert(_backGestureController != null); - _backGestureController.dragUpdate( - _convertToLogical(details.primaryDelta / context.size.width)); - } - - void _handleDragEnd(DragEndDetails details) { - assert(mounted); - assert(_backGestureController != null); - _backGestureController.dragEnd(_convertToLogical( - details.velocity.pixelsPerSecond.dx / context.size.width)); - _backGestureController = null; - } - - void _handleDragCancel() { - assert(mounted); - // This can be called even if start is not called, paired with - // the "down" event that we don't consider here. - _backGestureController?.dragEnd(0.0); - _backGestureController = null; - } - - void _handlePointerDown(PointerDownEvent event) { - if (widget.enabledCallback()) _recognizer.addPointer(event); - } - - double _convertToLogical(double value) { - switch (Directionality.of(context)) { - case TextDirection.rtl: - return -value; - case TextDirection.ltr: - return value; - } - // FIXME: shouldn't we return a default here? - // or perhaps throw error - // ignore: avoid_returning_null - return null; - } - - @override - Widget build(BuildContext context) { - assert(debugCheckHasDirectionality(context)); - // For devices with notches, the drag area needs to be larger on the side - // that has the notch. - var dragAreaWidth = Directionality.of(context) == TextDirection.ltr - ? MediaQuery.of(context).padding.left - : MediaQuery.of(context).padding.right; - dragAreaWidth = max(dragAreaWidth, _kBackGestureWidth); - return Stack( - fit: StackFit.passthrough, - children: [ - widget.child, - PositionedDirectional( - start: 0.0, - width: dragAreaWidth, - top: 0.0, - bottom: 0.0, - child: Listener( - onPointerDown: _handlePointerDown, - behavior: HitTestBehavior.translucent, - ), - ), - ], - ); - } -} - -class _CupertinoBackGestureController { - /// Creates a controller for an iOS-style back gesture. - /// - /// The [navigator] and [controller] arguments must not be null. - _CupertinoBackGestureController({ - @required this.navigator, - @required this.controller, - }) : assert(navigator != null), - assert(controller != null) { - navigator.didStartUserGesture(); - } - - final AnimationController controller; - final NavigatorState navigator; - - /// The drag gesture has changed by [fractionalDelta]. The total range of the - /// drag should be 0.0 to 1.0. - void dragUpdate(double delta) { - controller.value -= delta; - } - - /// The drag gesture has ended with a horizontal motion of - /// [fractionalVelocity] as a fraction of screen width per second. - void dragEnd(double velocity) { - // Fling in the appropriate direction. - // AnimationController.fling is guaranteed to - // take at least one frame. - // - // This curve has been determined through rigorously eyeballing native iOS - // animations. - const Curve animationCurve = Curves.fastLinearToSlowEaseIn; - bool animateForward; - - // If the user releases the page before mid screen with sufficient velocity, - // or after mid screen, we should animate the page out. Otherwise, the page - // should be animated back in. - if (velocity.abs() >= _kMinFlingVelocity) { - animateForward = velocity <= 0; - } else { - animateForward = controller.value > 0.5; - } - - if (animateForward) { - // The closer the panel is to dismissing, the shorter the animation is. - // We want to cap the animation time, but we want to use a linear curve - // to determine it. - final droppedPageForwardAnimationTime = min( - lerpDouble( - _kMaxDroppedSwipePageForwardAnimationTime, - 0, - controller.value, - ).floor(), - _kMaxPageBackAnimationTime, - ); - controller.animateTo(1.0, - duration: Duration(milliseconds: droppedPageForwardAnimationTime), - curve: animationCurve); - } else { - // This route is destined to pop at this point. Reuse navigator's pop. - navigator.pop(); - - // The popping may have finished inline if already at the target - // destination. - if (controller.isAnimating) { - // Otherwise, use a custom popping animation duration and curve. - final droppedPageBackAnimationTime = lerpDouble( - 0, - _kMaxDroppedSwipePageForwardAnimationTime, - controller.value, - ).floor(); - controller.animateBack( - 0.0, - duration: Duration(milliseconds: droppedPageBackAnimationTime), - curve: animationCurve, - ); - } - } - - if (controller.isAnimating) { - // Keep the userGestureInProgress in true state so we don't change the - // curve of the page transition mid-flight since CupertinoPageTransition - // depends on userGestureInProgress. - AnimationStatusListener animationStatusCallback; - animationStatusCallback = (status) { - navigator.didStopUserGesture(); - controller.removeStatusListener(animationStatusCallback); - }; - controller.addStatusListener(animationStatusCallback); - } else { - navigator.didStopUserGesture(); - } - } -} diff --git a/packages/get_navigation/lib/src/routes/default_transitions.dart b/packages/get_navigation/lib/src/routes/default_transitions.dart deleted file mode 100644 index 992c3914a..000000000 --- a/packages/get_navigation/lib/src/routes/default_transitions.dart +++ /dev/null @@ -1,187 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -class LeftToRightFadeTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return SlideTransition( - position: Tween( - begin: const Offset(-1.0, 0.0), - end: Offset.zero, - ).animate(animation), - child: FadeTransition( - opacity: animation, - child: SlideTransition( - position: Tween( - begin: Offset.zero, - end: const Offset(1.0, 0.0), - ).animate(secondaryAnimation), - child: child), - ), - ); - } -} - -class RightToLeftFadeTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return SlideTransition( - position: Tween( - begin: const Offset(1.0, 0.0), - end: Offset.zero, - ).animate(animation), - child: FadeTransition( - opacity: animation, - child: SlideTransition( - position: Tween( - begin: Offset.zero, - end: const Offset(-1.0, 0.0), - ).animate(secondaryAnimation), - child: child), - ), - ); - } -} - -class NoTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return child; - } -} - -class FadeInTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return FadeTransition(opacity: animation, child: child); - } -} - -class SlideDownTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return SlideTransition( - position: Tween( - begin: Offset(0.0, 1.0), - end: Offset.zero, - ).animate(animation), - child: child, - ); - } -} - -class SlideLeftTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return SlideTransition( - position: Tween( - begin: Offset(-1.0, 0.0), - end: Offset.zero, - ).animate(animation), - child: child, - ); - } -} - -class SlideRightTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return SlideTransition( - position: Tween( - begin: Offset(1.0, 0.0), - end: Offset.zero, - ).animate(animation), - child: child, - ); - } -} - -class SlideTopTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return SlideTransition( - position: Tween( - begin: Offset(0.0, -1.0), - end: Offset.zero, - ).animate(animation), - child: child, - ); - } -} - -class ZoomInTransition { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return ScaleTransition( - scale: animation, - child: child, - ); - } -} - -class SizeTransitions { - Widget buildTransitions( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return Align( - alignment: Alignment.center, - child: SizeTransition( - sizeFactor: CurvedAnimation( - parent: animation, - curve: curve, - ), - child: child, - ), - ); - } -} - diff --git a/packages/get_navigation/lib/src/routes/get_route.dart b/packages/get_navigation/lib/src/routes/get_route.dart deleted file mode 100644 index 95714fb54..000000000 --- a/packages/get_navigation/lib/src/routes/get_route.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:get_state_manager/get_state_manager.dart'; -import 'custom_transition.dart'; -import 'transitions_type.dart'; - -class GetPage { - final String name; - final GetPageBuilder page; - final bool popGesture; - final Map parameter; - final String title; - final Transition transition; - final Curve curve; - final Alignment alignment; - final bool maintainState; - final bool opaque; - final Bindings binding; - final List bindings; - final CustomTransition customTransition; - final Duration transitionDuration; - final bool fullscreenDialog; - final RouteSettings settings; - - const GetPage({ - @required this.name, - @required this.page, - this.title, - this.settings, - this.maintainState = true, - this.curve = Curves.linear, - this.alignment, - this.parameter, - this.opaque = true, - this.transitionDuration, - this.popGesture, - this.binding, - this.bindings, - this.transition, - this.customTransition, - this.fullscreenDialog = false, - }) : assert(page != null), - assert(name != null), - assert(maintainState != null), - assert(fullscreenDialog != null); -} diff --git a/packages/get_navigation/lib/src/routes/observers/route_observer.dart b/packages/get_navigation/lib/src/routes/observers/route_observer.dart deleted file mode 100644 index 91302999a..000000000 --- a/packages/get_navigation/lib/src/routes/observers/route_observer.dart +++ /dev/null @@ -1,207 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:get_core/get_core.dart'; -import '../../../get_navigation.dart'; -import '../../dialog/dialog_route.dart'; -import '../../snackbar/snack_route.dart'; -import '../default_route.dart'; - -class Routing { - String current; - String previous; - dynamic args; - String removed; - Route route; - bool isBack; - bool isSnackbar; - bool isBottomSheet; - bool isDialog; - - Routing({ - this.current = '', - this.previous = '', - this.args, - this.removed = '', - this.route, - this.isBack, - this.isSnackbar, - this.isBottomSheet, - this.isDialog, - }); - - void update(void fn(Routing value)) { - fn(this); - } -} - -/// Extracts the name of a route based on it's instance type -/// or null if not possible. -String _extractRouteName(Route route) { - if (route?.settings?.name != null) { - return route.settings.name; - } - - if (route is GetPageRoute) { - return route.routeName; - } - - if (route is GetDialogRoute) { - return route.name; - } - - if (route is GetModalBottomSheetRoute) { - return route.name; - } - - return null; -} - -/// This is basically a util for rules about 'what a route is' -class _RouteData { - final bool isGetPageRoute; - final bool isSnackbar; - final bool isBottomSheet; - final bool isDialog; - final String name; - - _RouteData({ - @required this.name, - @required this.isGetPageRoute, - @required this.isSnackbar, - @required this.isBottomSheet, - @required this.isDialog, - }); - - factory _RouteData.ofRoute(Route route) { - return _RouteData( - name: _extractRouteName(route), - isGetPageRoute: route is GetPageRoute, - isSnackbar: route is SnackRoute, - isDialog: route is GetDialogRoute, - isBottomSheet: route is GetModalBottomSheetRoute, - ); - } -} - -class GetObserver extends NavigatorObserver { - final Function(Routing) routing; - - GetObserver([this.routing, this._routeSend]); - - final Routing _routeSend; - - @override - void didPush(Route route, Route previousRoute) { - super.didPush(route, previousRoute); - final newRoute = _RouteData.ofRoute(route); - - if (newRoute.isSnackbar) { - Get.log("OPEN SNACKBAR ${newRoute.name}"); - } else if (newRoute.isBottomSheet || newRoute.isDialog) { - Get.log("OPEN ${newRoute.name}"); - } else if (newRoute.isGetPageRoute) { - Get.log("GOING TO ROUTE ${newRoute.name}"); - } - - Get.reference = newRoute.name; - _routeSend?.update((value) { - // Only PageRoute is allowed to change current value - if (route is PageRoute) { - value.current = newRoute.name ?? ''; - } - - value.args = route?.settings?.arguments; - value.route = route; - value.isBack = false; - value.removed = ''; - value.previous = _extractRouteName(previousRoute) ?? ''; - value.isSnackbar = newRoute.isSnackbar; - value.isBottomSheet = newRoute.isBottomSheet; - value.isDialog = newRoute.isDialog; - }); - - if (routing != null) { - routing(_routeSend); - } - } - - @override - void didPop(Route route, Route previousRoute) { - super.didPop(route, previousRoute); - final newRoute = _RouteData.ofRoute(route); - - if (newRoute.isSnackbar) { - Get.log("CLOSE SNACKBAR ${newRoute.name}"); - } else if (newRoute.isBottomSheet || newRoute.isDialog) { - Get.log("CLOSE ${newRoute.name}"); - } else if (newRoute.isGetPageRoute) { - Get.log("CLOSE TO ROUTE ${newRoute.name}"); - } - - Get.reference = newRoute.name; - // Here we use a 'inverse didPush set', meaning that we use - // previous route instead of 'route' because this is - // a 'inverse push' - _routeSend?.update((value) { - // Only PageRoute is allowed to change current value - if (previousRoute is PageRoute) { - value.current = _extractRouteName(previousRoute) ?? ''; - } - - value.args = route?.settings?.arguments; - value.route = previousRoute; - value.isBack = true; - value.removed = ''; - value.previous = newRoute.name ?? ''; - value.isSnackbar = false; - value.isBottomSheet = false; - value.isDialog = false; - }); - - routing?.call(_routeSend); - } - - @override - void didReplace({Route newRoute, Route oldRoute}) { - super.didReplace(newRoute: newRoute, oldRoute: oldRoute); - final newName = _extractRouteName(newRoute); - final oldName = _extractRouteName(oldRoute); - - Get.log("REPLACE ROUTE $oldName"); - Get.log("NEW ROUTE $newName"); - - Get.reference = newName; - _routeSend?.update((value) { - // Only PageRoute is allowed to change current value - if (newRoute is PageRoute) { - value.current = newName ?? ''; - } - - value.args = newRoute?.settings?.arguments; - value.route = newRoute; - value.isBack = false; - value.removed = ''; - value.previous = '$oldName'; - value.isSnackbar = false; - value.isBottomSheet = false; - value.isDialog = false; - }); - - routing?.call(_routeSend); - } - - @override - void didRemove(Route route, Route previousRoute) { - super.didRemove(route, previousRoute); - final routeName = _extractRouteName(route); - - Get.log("REMOVING ROUTE $routeName"); - _routeSend?.update((value) { - value.route = previousRoute; - value.isBack = false; - value.removed = routeName ?? ''; - value.previous = routeName ?? ''; - }); - - routing?.call(_routeSend); - } -} diff --git a/packages/get_navigation/lib/src/routes/transitions_component.dart b/packages/get_navigation/lib/src/routes/transitions_component.dart deleted file mode 100644 index bf735e5cb..000000000 --- a/packages/get_navigation/lib/src/routes/transitions_component.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/widgets.dart'; - -class TransitionComponent { - Widget buildChildWithTransition( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return child; - } -} diff --git a/packages/get_navigation/lib/src/routes/transitions_type.dart b/packages/get_navigation/lib/src/routes/transitions_type.dart deleted file mode 100644 index 47bee2413..000000000 --- a/packages/get_navigation/lib/src/routes/transitions_type.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:flutter/widgets.dart'; - -enum Transition { - fade, - fadeIn, - rightToLeft, - leftToRight, - upToDown, - downToUp, - rightToLeftWithFade, - leftToRightWithFade, - zoom, - topLevel, - noTransition, - cupertino, - cupertinoDialog, - size, - native -} - -typedef GetPageBuilder = Widget Function(); diff --git a/packages/get_navigation/lib/src/snackbar/snack.dart b/packages/get_navigation/lib/src/snackbar/snack.dart deleted file mode 100644 index e6d0d24f5..000000000 --- a/packages/get_navigation/lib/src/snackbar/snack.dart +++ /dev/null @@ -1,688 +0,0 @@ -import 'dart:async'; -import 'dart:ui'; -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:get_core/get_core.dart'; -import '../../get_navigation.dart'; - -typedef SnackbarStatusCallback = void Function(SnackbarStatus status); -typedef OnTap = void Function(GetBar snack); - -// ignore: must_be_immutable -class GetBar extends StatefulWidget { - GetBar({ - Key key, - this.title, - this.message, - this.titleText, - this.messageText, - this.icon, - this.shouldIconPulse = true, - this.maxWidth, - this.margin = const EdgeInsets.all(0.0), - this.padding = const EdgeInsets.all(16), - this.borderRadius = 0.0, - this.borderColor, - this.borderWidth = 1.0, - this.backgroundColor = const Color(0xFF303030), - this.leftBarIndicatorColor, - this.boxShadows, - this.backgroundGradient, - this.mainButton, - this.onTap, - this.duration, - this.isDismissible = true, - this.dismissDirection = SnackDismissDirection.VERTICAL, - this.showProgressIndicator = false, - this.progressIndicatorController, - this.progressIndicatorBackgroundColor, - this.progressIndicatorValueColor, - this.snackPosition = SnackPosition.BOTTOM, - this.snackStyle = SnackStyle.FLOATING, - this.forwardAnimationCurve = Curves.easeOutCirc, - this.reverseAnimationCurve = Curves.easeOutCirc, - this.animationDuration = const Duration(seconds: 1), - this.barBlur = 0.0, - this.overlayBlur = 0.0, - this.overlayColor = Colors.transparent, - this.userInputForm, - SnackbarStatusCallback snackbarStatus, - }) : super(key: key) { - this.snackbarStatus = snackbarStatus ?? (status) {}; - } - - /// A callback for you to listen to the different Snack status - SnackbarStatusCallback snackbarStatus; - - /// The title displayed to the user - final String title; - - /// The message displayed to the user. - final String message; - - /// Replaces [title]. Although this accepts a [Widget], it is meant - /// to receive [Text] or [RichText] - final Widget titleText; - - /// Replaces [message]. Although this accepts a [Widget], it is meant - /// to receive [Text] or [RichText] - final Widget messageText; - - /// Will be ignored if [backgroundGradient] is not null - final Color backgroundColor; - - /// If not null, shows a left vertical colored bar on notification. - /// It is not possible to use it with a [Form] and I do not recommend - /// using it with [LinearProgressIndicator] - final Color leftBarIndicatorColor; - - /// [boxShadows] The shadows generated by Snack. Leave it null - /// if you don't want a shadow. - /// You can use more than one if you feel the need. - /// Check (this example)[https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/material/shadows.dart] - final List boxShadows; - - /// Makes [backgroundColor] be ignored. - final Gradient backgroundGradient; - - /// You can use any widget here, but I recommend [Icon] or [Image] as - /// indication of what kind - /// of message you are displaying. Other widgets may break the layout - final Widget icon; - - /// An option to animate the icon (if present). Defaults to true. - final bool shouldIconPulse; - - /// A [FlatButton] widget if you need an action from the user. - final FlatButton mainButton; - - /// A callback that registers the user's click anywhere. - /// An alternative to [mainButton] - final OnTap onTap; - - /// How long until Snack will hide itself (be dismissed). - /// To make it indefinite, leave it null. - final Duration duration; - - /// True if you want to show a [LinearProgressIndicator]. - final bool showProgressIndicator; - - /// An optional [AnimationController] when you want to control the - /// progress of your [LinearProgressIndicator]. - final AnimationController progressIndicatorController; - - /// A [LinearProgressIndicator] configuration parameter. - final Color progressIndicatorBackgroundColor; - - /// A [LinearProgressIndicator] configuration parameter. - final Animation progressIndicatorValueColor; - - /// Determines if the user can swipe or click the overlay - /// (if [overlayBlur] > 0) to dismiss. - /// It is recommended that you set [duration] != null if this is false. - /// If the user swipes to dismiss or clicks the overlay, no value - /// will be returned. - final bool isDismissible; - - /// Used to limit Snack width (usually on large screens) - final double maxWidth; - - /// Adds a custom margin to Snack - final EdgeInsets margin; - - /// Adds a custom padding to Snack - /// The default follows material design guide line - final EdgeInsets padding; - - /// Adds a radius to all corners of Snack. Best combined with [margin]. - /// I do not recommend using it with [showProgressIndicator] - /// or [leftBarIndicatorColor]. - final double borderRadius; - - /// Adds a border to every side of Snack - /// I do not recommend using it with [showProgressIndicator] - /// or [leftBarIndicatorColor]. - final Color borderColor; - - /// Changes the width of the border if [borderColor] is specified - final double borderWidth; - - /// Snack can be based on [SnackPosition.TOP] or on [SnackPosition.BOTTOM] - /// of your screen. - /// [SnackPosition.BOTTOM] is the default. - final SnackPosition snackPosition; - - /// [SnackDismissDirection.VERTICAL] by default. - /// Can also be [SnackDismissDirection.HORIZONTAL] in which case both left - /// and right dismiss are allowed. - final SnackDismissDirection dismissDirection; - - /// Snack can be floating or be grounded to the edge of the screen. - /// If grounded, I do not recommend using [margin] or [borderRadius]. - /// [SnackStyle.FLOATING] is the default - /// If grounded, I do not recommend using a [backgroundColor] with - /// transparency or [barBlur] - final SnackStyle snackStyle; - - /// The [Curve] animation used when show() is called. - /// [Curves.easeOut] is default - final Curve forwardAnimationCurve; - - /// The [Curve] animation used when dismiss() is called. - /// [Curves.fastOutSlowIn] is default - final Curve reverseAnimationCurve; - - /// Use it to speed up or slow down the animation duration - final Duration animationDuration; - - /// Default is 0.0. If different than 0.0, blurs only Snack's background. - /// To take effect, make sure your [backgroundColor] has some opacity. - /// The greater the value, the greater the blur. - final double barBlur; - - /// Default is 0.0. If different than 0.0, creates a blurred - /// overlay that prevents the user from interacting with the screen. - /// The greater the value, the greater the blur. - final double overlayBlur; - - /// Default is [Colors.transparent]. Only takes effect if [overlayBlur] > 0.0. - /// Make sure you use a color with transparency here e.g. - /// Colors.grey[600].withOpacity(0.2). - final Color overlayColor; - - /// A [TextFormField] in case you want a simple user input. - /// Every other widget is ignored if this is not null. - final Form userInputForm; - - /// Show the snack. It's call [SnackbarStatus.OPENING] state - /// followed by [SnackbarStatus.OPEN] - Future show() async { - return Get.showSnackbar(this); - } - - @override - State createState() { - return _GetBarState(); - } -} - -class _GetBarState extends State - with TickerProviderStateMixin { - SnackbarStatus currentStatus; - - AnimationController _fadeController; - Animation _fadeAnimation; - - final Widget _emptyWidget = SizedBox(width: 0.0, height: 0.0); - final double _initialOpacity = 1.0; - final double _finalOpacity = 0.4; - - final Duration _pulseAnimationDuration = Duration(seconds: 1); - - bool _isTitlePresent; - double _messageTopMargin; - - FocusScopeNode _focusNode; - FocusAttachment _focusAttachment; - - @override - void initState() { - super.initState(); - - assert( - ((widget.userInputForm != null || - ((widget.message != null && widget.message.isNotEmpty) || - widget.messageText != null))), - """ -A message is mandatory if you are not using userInputForm. -Set either a message or messageText"""); - - _isTitlePresent = (widget.title != null || widget.titleText != null); - _messageTopMargin = _isTitlePresent ? 6.0 : widget.padding.top; - - _configureLeftBarFuture(); - _configureProgressIndicatorAnimation(); - - if (widget.icon != null && widget.shouldIconPulse) { - _configurePulseAnimation(); - _fadeController?.forward(); - } - - _focusNode = FocusScopeNode(); - _focusAttachment = _focusNode.attach(context); - } - - @override - void dispose() { - _fadeController?.dispose(); - - widget.progressIndicatorController?.removeListener(_progressListener); - widget.progressIndicatorController?.dispose(); - - _focusAttachment.detach(); - _focusNode.dispose(); - super.dispose(); - } - - final Completer _boxHeightCompleter = Completer(); - - void _configureLeftBarFuture() { - SchedulerBinding.instance.addPostFrameCallback( - (_) { - final keyContext = backgroundBoxKey.currentContext; - - if (keyContext != null) { - final box = keyContext.findRenderObject() as RenderBox; - _boxHeightCompleter.complete(box.size); - } - }, - ); - } - - void _configurePulseAnimation() { - _fadeController = - AnimationController(vsync: this, duration: _pulseAnimationDuration); - _fadeAnimation = Tween(begin: _initialOpacity, end: _finalOpacity).animate( - CurvedAnimation( - parent: _fadeController, - curve: Curves.linear, - ), - ); - - _fadeController.addStatusListener((status) { - if (status == AnimationStatus.completed) { - _fadeController.reverse(); - } - if (status == AnimationStatus.dismissed) { - _fadeController.forward(); - } - }); - - _fadeController.forward(); - } - - VoidCallback _progressListener; - - void _configureProgressIndicatorAnimation() { - if (widget.showProgressIndicator && - widget.progressIndicatorController != null) { - _progressListener = () { - setState(() {}); - }; - widget.progressIndicatorController.addListener(_progressListener); - - _progressAnimation = CurvedAnimation( - curve: Curves.linear, parent: widget.progressIndicatorController); - } - } - - @override - Widget build(BuildContext context) { - return Align( - heightFactor: 1.0, - child: Material( - color: widget.snackStyle == SnackStyle.FLOATING - ? Colors.transparent - : widget.backgroundColor, - child: SafeArea( - minimum: widget.snackPosition == SnackPosition.BOTTOM - ? EdgeInsets.only( - // bottom: (GetUtils.isGreaterThan( - // MediaQuery.of(context).viewInsets.bottom, - // MediaQuery.of(context).padding.bottom) - // ? MediaQuery.of(context).viewInsets.bottom - // : MediaQuery.of(context).padding.bottom)) - bottom: MediaQuery.of(context).viewInsets.bottom) - : EdgeInsets.only(top: MediaQuery.of(context).padding.top), - bottom: widget.snackPosition == SnackPosition.BOTTOM, - top: widget.snackPosition == SnackPosition.TOP, - left: false, - right: false, - child: _getSnack(), - ), - ), - ); - } - - Widget _getSnack() { - Widget snack; - - if (widget.userInputForm != null) { - snack = _generateInputSnack(); - } else { - snack = _generateSnack(); - } - - return Stack( - children: [ - FutureBuilder( - future: _boxHeightCompleter.future, - builder: (context, snapshot) { - if (snapshot.hasData) { - return ClipRRect( - borderRadius: BorderRadius.circular(widget.borderRadius), - child: BackdropFilter( - filter: ImageFilter.blur( - sigmaX: widget.barBlur, sigmaY: widget.barBlur), - child: Container( - height: snapshot.data.height, - width: snapshot.data.width, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(widget.borderRadius), - ), - ), - ), - ); - } else { - return _emptyWidget; - } - }, - ), - snack, - ], - ); - } - - Widget _generateInputSnack() { - return Container( - key: backgroundBoxKey, - constraints: widget.maxWidth != null - ? BoxConstraints(maxWidth: widget.maxWidth) - : null, - decoration: BoxDecoration( - color: widget.backgroundColor, - gradient: widget.backgroundGradient, - boxShadow: widget.boxShadows, - borderRadius: BorderRadius.circular(widget.borderRadius), - border: widget.borderColor != null - ? Border.all(color: widget.borderColor, width: widget.borderWidth) - : null, - ), - child: Padding( - padding: const EdgeInsets.only( - left: 8.0, right: 8.0, bottom: 8.0, top: 16.0), - child: FocusScope( - child: widget.userInputForm, - node: _focusNode, - autofocus: true, - ), - ), - ); - } - - CurvedAnimation _progressAnimation; - GlobalKey backgroundBoxKey = GlobalKey(); - - Widget _generateSnack() { - return Container( - key: backgroundBoxKey, - constraints: widget.maxWidth != null - ? BoxConstraints(maxWidth: widget.maxWidth) - : null, - decoration: BoxDecoration( - color: widget.backgroundColor, - gradient: widget.backgroundGradient, - boxShadow: widget.boxShadows, - borderRadius: BorderRadius.circular(widget.borderRadius), - border: widget.borderColor != null - ? Border.all(color: widget.borderColor, width: widget.borderWidth) - : null, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - widget.showProgressIndicator - ? LinearProgressIndicator( - value: widget.progressIndicatorController != null - ? _progressAnimation.value - : null, - backgroundColor: widget.progressIndicatorBackgroundColor, - valueColor: widget.progressIndicatorValueColor, - ) - : _emptyWidget, - Row( - mainAxisSize: MainAxisSize.max, - children: _getAppropriateRowLayout(), - ), - ], - ), - ); - } - - List _getAppropriateRowLayout() { - double buttonRightPadding; - var iconPadding = 0.0; - if (widget.padding.right - 12 < 0) { - buttonRightPadding = 4; - } else { - buttonRightPadding = widget.padding.right - 12; - } - - if (widget.padding.left > 16.0) { - iconPadding = widget.padding.left; - } - - if (widget.icon == null && widget.mainButton == null) { - return [ - _buildLeftBarIndicator(), - Expanded( - flex: 1, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - (_isTitlePresent) - ? Padding( - padding: EdgeInsets.only( - top: widget.padding.top, - left: widget.padding.left, - right: widget.padding.right, - ), - child: _getTitleText(), - ) - : _emptyWidget, - Padding( - padding: EdgeInsets.only( - top: _messageTopMargin, - left: widget.padding.left, - right: widget.padding.right, - bottom: widget.padding.bottom, - ), - child: widget.messageText ?? _getDefaultNotificationText(), - ), - ], - ), - ), - ]; - } else if (widget.icon != null && widget.mainButton == null) { - return [ - _buildLeftBarIndicator(), - ConstrainedBox( - constraints: BoxConstraints.tightFor(width: 42.0 + iconPadding), - child: _getIcon(), - ), - Expanded( - flex: 1, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - (_isTitlePresent) - ? Padding( - padding: EdgeInsets.only( - top: widget.padding.top, - left: 4.0, - right: widget.padding.left, - ), - child: _getTitleText(), - ) - : _emptyWidget, - Padding( - padding: EdgeInsets.only( - top: _messageTopMargin, - left: 4.0, - right: widget.padding.right, - bottom: widget.padding.bottom, - ), - child: widget.messageText ?? _getDefaultNotificationText(), - ), - ], - ), - ), - ]; - } else if (widget.icon == null && widget.mainButton != null) { - return [ - _buildLeftBarIndicator(), - Expanded( - flex: 1, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - (_isTitlePresent) - ? Padding( - padding: EdgeInsets.only( - top: widget.padding.top, - left: widget.padding.left, - right: widget.padding.right, - ), - child: _getTitleText(), - ) - : _emptyWidget, - Padding( - padding: EdgeInsets.only( - top: _messageTopMargin, - left: widget.padding.left, - right: 8.0, - bottom: widget.padding.bottom, - ), - child: widget.messageText ?? _getDefaultNotificationText(), - ), - ], - ), - ), - Padding( - padding: EdgeInsets.only(right: buttonRightPadding), - child: _getMainActionButton(), - ), - ]; - } else { - return [ - _buildLeftBarIndicator(), - ConstrainedBox( - constraints: BoxConstraints.tightFor(width: 42.0 + iconPadding), - child: _getIcon(), - ), - Expanded( - flex: 1, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - (_isTitlePresent) - ? Padding( - padding: EdgeInsets.only( - top: widget.padding.top, - left: 4.0, - right: 8.0, - ), - child: _getTitleText(), - ) - : _emptyWidget, - Padding( - padding: EdgeInsets.only( - top: _messageTopMargin, - left: 4.0, - right: 8.0, - bottom: widget.padding.bottom, - ), - child: widget.messageText ?? _getDefaultNotificationText(), - ), - ], - ), - ), - Padding( - padding: EdgeInsets.only(right: buttonRightPadding), - child: _getMainActionButton(), - ) ?? - _emptyWidget, - ]; - } - } - - Widget _buildLeftBarIndicator() { - if (widget.leftBarIndicatorColor != null) { - return FutureBuilder( - future: _boxHeightCompleter.future, - builder: (buildContext, snapshot) { - if (snapshot.hasData) { - return Container( - color: widget.leftBarIndicatorColor, - width: 5.0, - height: snapshot.data.height, - ); - } else { - return _emptyWidget; - } - }, - ); - } else { - return _emptyWidget; - } - } - - Widget _getIcon() { - if (widget.icon != null && widget.icon is Icon && widget.shouldIconPulse) { - return FadeTransition( - opacity: _fadeAnimation, - child: widget.icon, - ); - } else if (widget.icon != null) { - return widget.icon; - } else { - return _emptyWidget; - } - } - - Widget _getTitleText() { - return widget.titleText ?? - Text( - widget.title ?? "", - style: TextStyle( - fontSize: 16.0, color: Colors.white, fontWeight: FontWeight.bold), - ); - } - - Text _getDefaultNotificationText() { - return Text( - widget.message ?? "", - style: TextStyle(fontSize: 14.0, color: Colors.white), - ); - } - - FlatButton _getMainActionButton() { - return widget.mainButton; - } -} - -/// Indicates if snack is going to start at the [TOP] or at the [BOTTOM] -enum SnackPosition { TOP, BOTTOM } - -/// Indicates if snack will be attached to the edge of the screen or not -enum SnackStyle { FLOATING, GROUNDED } - -/// Indicates the direction in which it is possible to dismiss -/// If vertical, dismiss up will be allowed if [SnackPosition.TOP] -/// If vertical, dismiss down will be allowed if [SnackPosition.BOTTOM] -enum SnackDismissDirection { HORIZONTAL, VERTICAL } - -/// Indicates Status of snackbar -/// [SnackbarStatus.OPEN] Snack is fully open, [SnackbarStatus.CLOSED] Snackbar -/// has closed, -/// [SnackbarStatus.OPENING] Starts with the opening animation and ends -/// with the full -/// snackbar display, [SnackbarStatus.CLOSING] Starts with the closing animation -/// and ends -/// with the full snackbar dispose -enum SnackbarStatus { OPEN, CLOSED, OPENING, CLOSING } diff --git a/packages/get_navigation/lib/src/snackbar/snack_route.dart b/packages/get_navigation/lib/src/snackbar/snack_route.dart deleted file mode 100644 index a50bd8288..000000000 --- a/packages/get_navigation/lib/src/snackbar/snack_route.dart +++ /dev/null @@ -1,394 +0,0 @@ -import 'dart:async'; -import 'dart:ui'; -import 'package:flutter/widgets.dart'; -import '../../get_navigation.dart'; -import 'snack.dart'; - -class SnackRoute extends OverlayRoute { - Animation _filterBlurAnimation; - Animation _filterColorAnimation; - - SnackRoute({ - @required this.snack, - RouteSettings settings, - }) : super(settings: settings) { - _builder = Builder(builder: (innerContext) { - return GestureDetector( - child: snack, - onTap: snack.onTap != null ? () => snack.onTap(snack) : null, - ); - }); - - _configureAlignment(snack.snackPosition); - _snackbarStatus = snack.snackbarStatus; - } - - _configureAlignment(SnackPosition snackPosition) { - switch (snack.snackPosition) { - case SnackPosition.TOP: - { - _initialAlignment = Alignment(-1.0, -2.0); - _endAlignment = Alignment(-1.0, -1.0); - break; - } - case SnackPosition.BOTTOM: - { - _initialAlignment = Alignment(-1.0, 2.0); - _endAlignment = Alignment(-1.0, 1.0); - break; - } - } - } - - GetBar snack; - Builder _builder; - - final Completer _transitionCompleter = Completer(); - - SnackbarStatusCallback _snackbarStatus; - Alignment _initialAlignment; - Alignment _endAlignment; - bool _wasDismissedBySwipe = false; - - Timer _timer; - - bool get opaque => false; - - @override - Iterable createOverlayEntries() { - var overlays = []; - - if (snack.overlayBlur > 0.0) { - overlays.add( - OverlayEntry( - builder: (context) { - return GestureDetector( - onTap: snack.isDismissible ? Get.back : null, - child: AnimatedBuilder( - animation: _filterBlurAnimation, - builder: (context, child) { - return BackdropFilter( - filter: ImageFilter.blur( - sigmaX: _filterBlurAnimation.value, - sigmaY: _filterBlurAnimation.value), - child: Container( - constraints: BoxConstraints.expand(), - color: _filterColorAnimation.value, - ), - ); - }, - ), - ); - }, - maintainState: false, - opaque: opaque, - ), - ); - } - - overlays.add( - OverlayEntry( - builder: (context) { - final Widget annotatedChild = Semantics( - child: AlignTransition( - alignment: _animation, - child: snack.isDismissible - ? _getDismissibleSnack(_builder) - : _getSnack(), - ), - focused: false, - container: true, - explicitChildNodes: true, - ); - return annotatedChild; - }, - maintainState: false, - opaque: opaque, - ), - ); - - return overlays; - } - - String dismissibleKeyGen = ""; - - Widget _getDismissibleSnack(Widget child) { - return Dismissible( - direction: _getDismissDirection(), - resizeDuration: null, - confirmDismiss: (_) { - if (currentStatus == SnackbarStatus.OPENING || - currentStatus == SnackbarStatus.CLOSING) { - return Future.value(false); - } - return Future.value(true); - }, - key: Key(dismissibleKeyGen), - onDismissed: (_) { - dismissibleKeyGen += "1"; - _cancelTimer(); - _wasDismissedBySwipe = true; - - if (isCurrent) { - navigator.pop(); - } else { - navigator.removeRoute(this); - } - }, - child: _getSnack(), - ); - } - - Widget _getSnack() { - return Container( - margin: snack.margin, - child: _builder, - ); - } - - DismissDirection _getDismissDirection() { - if (snack.dismissDirection == SnackDismissDirection.HORIZONTAL) { - return DismissDirection.horizontal; - } else { - if (snack.snackPosition == SnackPosition.TOP) { - return DismissDirection.up; - } - return DismissDirection.down; - } - } - - @override - bool get finishedWhenPopped => - _controller.status == AnimationStatus.dismissed; - - /// The animation that drives the route's transition and the previous route's - /// forward transition. - Animation _animation; - - /// The animation controller that the route uses to drive the transitions. - /// - /// The animation itself is exposed by the [animation] property. - AnimationController _controller; - - /// Called to create the animation controller that will drive the transitions - /// to this route from the previous one, and back to the previous route - /// from this one. - AnimationController createAnimationController() { - assert(!_transitionCompleter.isCompleted, - 'Cannot reuse a $runtimeType after disposing it.'); - assert(snack.animationDuration != null && - snack.animationDuration >= Duration.zero); - return AnimationController( - duration: snack.animationDuration, - debugLabel: debugLabel, - vsync: navigator, - ); - } - - /// Called to create the animation that exposes the current progress of - /// the transition controlled by the animation controller created by - /// [createAnimationController()]. - Animation createAnimation() { - assert(!_transitionCompleter.isCompleted, - 'Cannot reuse a $runtimeType after disposing it.'); - assert(_controller != null); - return AlignmentTween(begin: _initialAlignment, end: _endAlignment).animate( - CurvedAnimation( - parent: _controller, - curve: snack.forwardAnimationCurve, - reverseCurve: snack.reverseAnimationCurve, - ), - ); - } - - Animation createBlurFilterAnimation() { - return Tween(begin: 0.0, end: snack.overlayBlur).animate( - CurvedAnimation( - parent: _controller, - curve: Interval( - 0.0, - 0.35, - curve: Curves.easeInOutCirc, - ), - ), - ); - } - - Animation createColorFilterAnimation() { - return ColorTween(begin: Color(0x00000000), end: snack.overlayColor) - .animate( - CurvedAnimation( - parent: _controller, - curve: Interval( - 0.0, - 0.35, - curve: Curves.easeInOutCirc, - ), - ), - ); - } - - T _result; - SnackbarStatus currentStatus; - - void _handleStatusChanged(AnimationStatus status) { - switch (status) { - case AnimationStatus.completed: - currentStatus = SnackbarStatus.OPEN; - _snackbarStatus(currentStatus); - if (overlayEntries.isNotEmpty) overlayEntries.first.opaque = opaque; - - break; - case AnimationStatus.forward: - currentStatus = SnackbarStatus.OPENING; - _snackbarStatus(currentStatus); - break; - case AnimationStatus.reverse: - currentStatus = SnackbarStatus.CLOSING; - _snackbarStatus(currentStatus); - if (overlayEntries.isNotEmpty) overlayEntries.first.opaque = false; - break; - case AnimationStatus.dismissed: - assert(!overlayEntries.first.opaque); - // We might still be the current route if a subclass is controlling the - // the transition and hits the dismissed status. For example, the iOS - // back gesture drives this animation to the dismissed status before - // popping the navigator. - currentStatus = SnackbarStatus.CLOSED; - _snackbarStatus(currentStatus); - - if (!isCurrent) { - navigator.finalizeRoute(this); - assert(overlayEntries.isEmpty); - } - break; - } - changedInternalState(); - } - - @override - void install() { - assert(!_transitionCompleter.isCompleted, - 'Cannot install a $runtimeType after disposing it.'); - _controller = createAnimationController(); - assert(_controller != null, - '$runtimeType.createAnimationController() returned null.'); - _filterBlurAnimation = createBlurFilterAnimation(); - _filterColorAnimation = createColorFilterAnimation(); - _animation = createAnimation(); - assert(_animation != null, '$runtimeType.createAnimation() returned null.'); - super.install(); - } - - @override - TickerFuture didPush() { - super.didPush(); - assert( - _controller != null, - // ignore: lines_longer_than_80_chars - '$runtimeType.didPush called before calling install() or after calling dispose().', - ); - assert( - !_transitionCompleter.isCompleted, - 'Cannot reuse a $runtimeType after disposing it.', - ); - _animation.addStatusListener(_handleStatusChanged); - _configureTimer(); - return _controller.forward(); - } - - @override - void didReplace(Route oldRoute) { - assert( - _controller != null, - // ignore: lines_longer_than_80_chars - '$runtimeType.didReplace called before calling install() or after calling dispose().', - ); - assert( - !_transitionCompleter.isCompleted, - 'Cannot reuse a $runtimeType after disposing it.', - ); - - if (oldRoute is SnackRoute) { - _controller.value = oldRoute._controller.value; - } - _animation.addStatusListener(_handleStatusChanged); - super.didReplace(oldRoute); - } - - @override - bool didPop(T result) { - assert( - _controller != null, - // ignore: lines_longer_than_80_chars - '$runtimeType.didPop called before calling install() or after calling dispose().', - ); - assert( - !_transitionCompleter.isCompleted, - 'Cannot reuse a $runtimeType after disposing it.', - ); - - _result = result; - _cancelTimer(); - - if (_wasDismissedBySwipe) { - Timer(Duration(milliseconds: 200), () { - _controller.reset(); - }); - - _wasDismissedBySwipe = false; - } else { - _controller.reverse(); - } - - return super.didPop(result); - } - - void _configureTimer() { - if (snack.duration != null) { - if (_timer != null && _timer.isActive) { - _timer.cancel(); - } - _timer = Timer(snack.duration, () { - if (isCurrent) { - navigator.pop(); - } else if (isActive) { - navigator.removeRoute(this); - } - }); - } else { - if (_timer != null) { - _timer.cancel(); - } - } - } - - void _cancelTimer() { - if (_timer != null && _timer.isActive) { - _timer.cancel(); - } - } - - /// Whether this route can perform a transition to the given route. - /// Subclasses can override this method to restrict the set of routes they - /// need to coordinate transitions with. - bool canTransitionTo(SnackRoute nextRoute) => true; - - /// Whether this route can perform a transition from the given route. - /// - /// Subclasses can override this method to restrict the set of routes they - /// need to coordinate transitions with. - bool canTransitionFrom(SnackRoute previousRoute) => true; - - @override - void dispose() { - assert(!_transitionCompleter.isCompleted, - 'Cannot dispose a $runtimeType twice.'); - _controller?.dispose(); - _transitionCompleter.complete(_result); - super.dispose(); - } - - /// A short description of this route useful for debugging. - String get debugLabel => '$runtimeType'; -} diff --git a/packages/get_navigation/pubspec.yaml b/packages/get_navigation/pubspec.yaml deleted file mode 100644 index 2a309cdac..000000000 --- a/packages/get_navigation/pubspec.yaml +++ /dev/null @@ -1,56 +0,0 @@ -name: get_navigation -description: Open Screens, bottomsheets, dialogs, e snackbars with no context using GetX™ framework. -version: 3.13.0 -homepage: https://github.com/jonataslaw/getx - -environment: - sdk: ">=2.7.0 <3.0.0" - flutter: ">=1.17.0 <2.0.0" - -dependencies: - flutter: - sdk: flutter - get_state_manager: ">=3.13.0 <4.0.0" - get_core: ">=3.13.0 <4.0.0" - get_utils: ">=3.13.0 <4.0.0" - -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: - - # 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 diff --git a/packages/get_navigation/test/bottomsheet_test.dart b/packages/get_navigation/test/bottomsheet_test.dart deleted file mode 100644 index f97f63a29..000000000 --- a/packages/get_navigation/test/bottomsheet_test.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_navigation/get_navigation.dart'; -import 'utils/wrapper.dart'; - -void main() { - testWidgets("Get.bottomSheet smoke test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.bottomSheet(Container( - child: Wrap( - children: [ - ListTile( - leading: Icon(Icons.music_note), - title: Text('Music'), - onTap: () => {}), - ], - ), - )); - - await tester.pumpAndSettle(); - - expect(find.byIcon(Icons.music_note), findsOneWidget); - }); - - testWidgets("Get.bottomSheet close test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.bottomSheet(Container( - child: Wrap( - children: [ - ListTile( - leading: Icon(Icons.music_note), - title: Text('Music'), - onTap: () => {}), - ], - ), - )); - - expect(Get.isBottomSheetOpen, true); - - Get.back(); - expect(Get.isBottomSheetOpen, false); - - expect(() => Get.bottomSheet(Container(), isScrollControlled: null), - throwsAssertionError); - - expect(() => Get.bottomSheet(Container(), isDismissible: null), - throwsAssertionError); - - expect(() => Get.bottomSheet(Container(), enableDrag: null), - throwsAssertionError); - - await tester.pumpAndSettle(); - }); - - testWidgets( - "GetMaterialApp with debugShowMaterialGrid null", - (tester) async { - expect( - () => GetMaterialApp( - debugShowMaterialGrid: null, - ), - throwsAssertionError, - ); - }, - ); -} diff --git a/packages/get_navigation/test/dialog_test.dart b/packages/get_navigation/test/dialog_test.dart deleted file mode 100644 index e9b39703f..000000000 --- a/packages/get_navigation/test/dialog_test.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_navigation/get_navigation.dart'; -import 'utils/wrapper.dart'; - -void main() { - testWidgets("Get.defaultDialog smoke test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.defaultDialog( - onConfirm: () => print("Ok"), - middleText: "Dialog made in 3 lines of code"); - - await tester.pumpAndSettle(); - - expect(find.text("Ok"), findsOneWidget); - }); - - testWidgets("Get.dialog smoke test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.dialog(YourDialogWidget()); - - await tester.pumpAndSettle(); - - expect(find.byType(YourDialogWidget), findsOneWidget); - }); - - testWidgets("Get.dialog close test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.dialog(YourDialogWidget()); - expect(Get.isDialogOpen, true); - Get.back(); - expect(Get.isDialogOpen, false); - await tester.pumpAndSettle(); - }); -} - -class YourDialogWidget extends StatelessWidget { - const YourDialogWidget({Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container(); - } -} diff --git a/packages/get_navigation/test/get_main_test.dart b/packages/get_navigation/test/get_main_test.dart deleted file mode 100644 index 1f1e60535..000000000 --- a/packages/get_navigation/test/get_main_test.dart +++ /dev/null @@ -1,471 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_navigation/get_navigation.dart'; - -import 'utils/wrapper.dart'; - -class SizeTransitions extends CustomTransition { - @override - Widget buildTransition( - BuildContext context, - Curve curve, - Alignment alignment, - Animation animation, - Animation secondaryAnimation, - Widget child) { - return Align( - alignment: Alignment.center, - child: SizeTransition( - sizeFactor: CurvedAnimation( - parent: animation, - curve: curve, - ), - child: child, - ), - ); - } -} - -void main() { - testWidgets("Get.to smoke test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.to(SecondScreen()); - - await tester.pump(Duration.zero); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - }); - testWidgets("Get.toNamed smoke test", (tester) async { - await tester.pumpWidget( - GetMaterialApp( - initialRoute: '/', - getPages: [ - GetPage( - page: () => FirstScreen(), - name: '/', - customTransition: SizeTransitions()), - GetPage(page: () => SecondScreen(), name: '/second'), - GetPage(page: () => ThirdScreen(), name: '/third'), - ], - ), - ); - - Get.toNamed('/second'); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - }); - - testWidgets("Get.off smoke test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - Get.off(SecondScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - }); - - testWidgets("Get.offNamed smoke test", (tester) async { - await tester.pumpWidget( - GetMaterialApp( - initialRoute: '/', - getPages: [ - GetPage(name: '/', page: () => Container()), - GetPage(name: '/first', page: () => FirstScreen()), - GetPage(name: '/second', page: () => SecondScreen()), - GetPage(name: '/third', page: () => ThirdScreen()), - ], - ), - ); - - Get.toNamed('/first'); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - Get.offNamed('/second'); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - }); - - testWidgets("Get.offAll smoke test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - Get.to(SecondScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - - Get.offAll(ThirdScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(ThirdScreen), findsOneWidget); - }); - - testWidgets("Get.offAllNamed smoke test", (tester) async { - await tester.pumpWidget( - WrapperNamed( - initialRoute: '/', - namedRoutes: [ - GetPage(page: () => Container(), name: '/'), - GetPage(page: () => FirstScreen(), name: '/first'), - GetPage(page: () => SecondScreen(), name: '/second'), - GetPage(page: () => ThirdScreen(), name: '/third'), - ], - ), - ); - - Get.toNamed('/first'); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - Get.toNamed('/second'); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - - Get.offAllNamed('/third'); - - await tester.pumpAndSettle(); - - expect(find.byType(ThirdScreen), findsOneWidget); - }); - - testWidgets("Get.offAndToNamed smoke test", (tester) async { - await tester.pumpWidget( - WrapperNamed( - initialRoute: '/', - namedRoutes: [ - GetPage(page: () => Container(), name: '/'), - GetPage(page: () => FirstScreen(), name: '/first'), - GetPage(page: () => SecondScreen(), name: '/second'), - GetPage(page: () => ThirdScreen(), name: '/third'), - ], - ), - ); - - Get.toNamed('/first'); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - Get.offAndToNamed('/second'); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - }); - - testWidgets("Get.offUntil smoke test", (tester) async { - await tester.pumpWidget( - Wrapper( - child: Container(), - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - Get.offUntil( - MaterialPageRoute(builder: (context) => SecondScreen()), - ModalRoute.withName('/'), - ); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - }); - - testWidgets("Get.offNamedUntil smoke test", (tester) async { - await tester.pumpWidget( - WrapperNamed( - initialRoute: '/', - namedRoutes: [ - GetPage( - page: () => Container(), - name: '/', - popGesture: true, - transition: Transition.cupertino), - GetPage( - page: () => FirstScreen(), - name: '/first', - transition: Transition.size), - GetPage( - page: () => SecondScreen(), name: '/second', transition: null), - GetPage(page: () => ThirdScreen(), name: '/third'), - ], - ), - ); - - Get.toNamed('/first'); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - Get.offNamedUntil('/first', ModalRoute.withName('/')); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - }); - - testWidgets("Get.back smoke test", (tester) async { - await tester.pumpWidget( - Wrapper(child: Container()), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - Get.to(SecondScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(SecondScreen), findsOneWidget); - - Get.back(); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - }); - - testWidgets("Get.defaultTransition smoke test", (tester) async { - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.fadeIn, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.downToUp, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.fade, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.leftToRight, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.leftToRightWithFade, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.rightToLeft, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.rightToLeftWithFade, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.cupertino, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - - await tester.pumpWidget( - Wrapper( - child: Container(), - defaultTransition: Transition.size, - ), - ); - - Get.to(FirstScreen()); - - await tester.pumpAndSettle(); - - expect(find.byType(FirstScreen), findsOneWidget); - }); - - testWidgets("Get.snackbar test", (tester) async { - await tester.pumpWidget( - GetMaterialApp( - popGesture: true, - home: RaisedButton( - child: Text('Open Snackbar'), - onPressed: () { - Get.snackbar('title', "message", duration: Duration(seconds: 1)); - }, - ), - ), - ); - - expect(Get.isSnackbarOpen, false); - await tester.tap(find.text('Open Snackbar')); - - expect(Get.isSnackbarOpen, true); - await tester.pump(const Duration(seconds: 1)); - }); - - testWidgets("Get.rawSnackbar test", (tester) async { - await tester.pumpWidget( - Wrapper( - child: RaisedButton( - child: Text('Open Snackbar'), - onPressed: () { - Get.rawSnackbar( - title: 'title', - message: "message", - onTap: (_) { - print('snackbar tapped'); - }, - duration: Duration(seconds: 1), - shouldIconPulse: true, - icon: Icon(Icons.alarm), - showProgressIndicator: true, - barBlur: null, - isDismissible: true, - leftBarIndicatorColor: Colors.amber, - overlayBlur: 1.0, - ); - }, - ), - ), - ); - - expect(Get.isSnackbarOpen, false); - await tester.tap(find.text('Open Snackbar')); - - expect(Get.isSnackbarOpen, true); - await tester.pump(const Duration(seconds: 1)); - }); -} - -class FirstScreen extends StatelessWidget { - const FirstScreen({Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container(child: Text('FirstScreen')); - } -} - -class SecondScreen extends StatelessWidget { - const SecondScreen({Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container(); - } -} - -class ThirdScreen extends StatelessWidget { - const ThirdScreen({Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container(); - } -} diff --git a/packages/get_navigation/test/root_widget_test.dart b/packages/get_navigation/test/root_widget_test.dart deleted file mode 100644 index 841453ea2..000000000 --- a/packages/get_navigation/test/root_widget_test.dart +++ /dev/null @@ -1,102 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_navigation/get_navigation.dart'; - -void main() { - testWidgets( - "GetMaterialApp with routes null", - (tester) async { - expect( - () => GetMaterialApp( - routes: null, - ), - throwsAssertionError); - }, - ); - - testWidgets( - "GetMaterialApp with navigatorObservers null", - (tester) async { - expect( - () => GetMaterialApp( - navigatorObservers: null, - ), - throwsAssertionError); - }, - ); - testWidgets( - "GetMaterialApp with title null", - (tester) async { - expect( - () => GetMaterialApp( - title: null, - ), - throwsAssertionError); - }, - ); - testWidgets( - "GetMaterialApp with debugShowMaterialGrid null", - (test) async { - expect( - () => GetMaterialApp( - debugShowMaterialGrid: null, - ), - throwsAssertionError, - ); - }, - ); - testWidgets( - "GetMaterialApp with showPerformanceOverlay null", - (test) async { - expect( - () => GetMaterialApp( - showPerformanceOverlay: null, - ), - throwsAssertionError, - ); - }, - ); - testWidgets( - "GetMaterialApp with showSemanticsDebugger null", - (test) async { - expect( - () => GetMaterialApp( - showSemanticsDebugger: null, - ), - throwsAssertionError, - ); - }, - ); - testWidgets( - "GetMaterialApp with debugShowCheckedModeBanner null", - (tester) async { - expect( - () => GetMaterialApp( - debugShowCheckedModeBanner: null, - ), - throwsAssertionError); - }, - ); - - testWidgets( - "GetMaterialApp with checkerboardRasterCacheImages null", - (tester) async { - expect( - () => GetMaterialApp( - checkerboardRasterCacheImages: null, - ), - throwsAssertionError); - }, - ); - - testWidgets( - "GetMaterialApp with checkerboardOffscreenLayers null", - (tester) async { - expect( - () => GetMaterialApp( - checkerboardOffscreenLayers: null, - ), - throwsAssertionError, - ); - }, - ); -} diff --git a/packages/get_navigation/test/routes_test.dart b/packages/get_navigation/test/routes_test.dart deleted file mode 100644 index 7f1d390e2..000000000 --- a/packages/get_navigation/test/routes_test.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_navigation/get_navigation.dart'; - -void main() { - testWidgets( - 'GetPage page null', - (tester) async { - expect(() => GetPage(page: null, name: null), throwsAssertionError); - }, - ); - - testWidgets( - "GetPage maintainState null", - (tester) async { - expect( - () => GetPage(page: () => Scaffold(), maintainState: null, name: '/'), - throwsAssertionError, - ); - }, - ); - - testWidgets( - "GetPage name null", - (tester) async { - expect( - () => GetPage(page: () => Scaffold(), maintainState: null, name: null), - throwsAssertionError, - ); - }, - ); - - testWidgets( - "GetPage fullscreenDialog null", - (tester) async { - expect( - () => - GetPage(page: () => Scaffold(), fullscreenDialog: null, name: '/'), - throwsAssertionError, - ); - }, - ); -} diff --git a/packages/get_navigation/test/utils/wrapper.dart b/packages/get_navigation/test/utils/wrapper.dart deleted file mode 100644 index 814669ce7..000000000 --- a/packages/get_navigation/test/utils/wrapper.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get_navigation/get_navigation.dart'; - -class Wrapper extends StatelessWidget { - final Widget child; - final List namedRoutes; - final String initialRoute; - final Transition defaultTransition; - - const Wrapper({ - Key key, - this.child, - this.namedRoutes, - this.initialRoute, - this.defaultTransition, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return GetMaterialApp( - defaultTransition: defaultTransition, - initialRoute: initialRoute, - getPages: namedRoutes, - home: Scaffold( - body: child, - ), - ); - } -} - -class WrapperNamed extends StatelessWidget { - final Widget child; - final List namedRoutes; - final String initialRoute; - final Transition defaultTransition; - - const WrapperNamed({ - Key key, - this.child, - this.namedRoutes, - this.initialRoute, - this.defaultTransition, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return GetMaterialApp( - defaultTransition: defaultTransition, - initialRoute: initialRoute, - getPages: namedRoutes, - ); - } -} diff --git a/packages/get_rx/.gitignore b/packages/get_rx/.gitignore deleted file mode 100644 index 1985397a2..000000000 --- a/packages/get_rx/.gitignore +++ /dev/null @@ -1,74 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 diff --git a/packages/get_rx/.metadata b/packages/get_rx/.metadata deleted file mode 100644 index 3207f67d3..000000000 --- a/packages/get_rx/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: a27c242b0eea731317cfec5bbdd9d35452ab3ecb - channel: dev - -project_type: package diff --git a/packages/get_rx/CHANGELOG.md b/packages/get_rx/CHANGELOG.md deleted file mode 100644 index 412e3893d..000000000 --- a/packages/get_rx/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -## [3.13.0] -* Bump to Get 3.13.0 - -## [3.12.0] -* Bump to Get 3.12.0 - -## [3.10.2] -- Initial release diff --git a/packages/get_rx/LICENSE b/packages/get_rx/LICENSE deleted file mode 100644 index 2fb920baf..000000000 --- a/packages/get_rx/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jonny Borges - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/get_rx/README.md b/packages/get_rx/README.md deleted file mode 100644 index 8946892a3..000000000 --- a/packages/get_rx/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# get_rx - -A new Flutter package project. - -## Getting Started - -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/packages/get_rx/analysis_options.yaml b/packages/get_rx/analysis_options.yaml deleted file mode 100644 index 38018b421..000000000 --- a/packages/get_rx/analysis_options.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# Include option is buggy: -# https://github.com/flutter/flutter/issues/62591 -# In case the include issue gets fixed, lines below INCLUDE_FIX -# can be removed - -# include: package:effective_dart/analysis_options.1.2.0.yaml -analyzer: - strong-mode: - implicit-casts: false -linter: - rules: - await_only_futures: true - # This one is desirable, but that's a lot of work for now - public_member_api_docs: false - # Desirable, but would be breaking changes: - avoid_positional_boolean_parameters: false - constant_identifier_names: false - include_file_not_found: false - - # INCLUDE_FIX (copy of effective dart 1.2.0) - # STYLE - camel_case_types: true - camel_case_extensions: true - library_names: true - file_names: true - library_prefixes: true - non_constant_identifier_names: true - directives_ordering: true - lines_longer_than_80_chars: true # avoid - curly_braces_in_flow_control_structures: true - - # DOCUMENTATION - slash_for_doc_comments: true - package_api_docs: true # prefer - #- comment_references # Unused because https://github.com/dart-lang/sdk/issues/36974 - - # USAGE - implementation_imports: true - avoid_relative_lib_imports: true # prefer - prefer_relative_imports: true # prefer - prefer_adjacent_string_concatenation: true - prefer_interpolation_to_compose_strings: true # prefer - unnecessary_brace_in_string_interps: true # avoid - prefer_collection_literals: true - avoid_function_literals_in_foreach_calls: true # avoid - prefer_iterable_whereType: true - prefer_function_declarations_over_variables: true - unnecessary_lambdas: true - prefer_equal_for_default_values: true - avoid_init_to_null: true - unnecessary_getters_setters: true - #- unnecessary_getters # prefer # Disabled pending fix: https://github.com/dart-lang/linter/issues/23 - #- prefer_expression_function_bodies # consider - unnecessary_this: true - prefer_initializing_formals: true - type_init_formals: true - empty_constructor_bodies: true - unnecessary_new: true - unnecessary_const: true - avoid_catches_without_on_clauses: true # avoid - avoid_catching_errors: true - use_rethrow_when_possible: true - - # DESIGN - use_to_and_as_if_applicable: true # prefer - one_member_abstracts: true # avoid - avoid_classes_with_only_static_members: true # avoid - prefer_mixin: true - prefer_final_fields: true # prefer - use_setters_to_change_properties: true - avoid_setters_without_getters: true - avoid_returning_null: true # avoid - avoid_returning_this: true # avoid - type_annotate_public_apis: true # prefer - #- prefer_typing_uninitialized_variables # consider - omit_local_variable_types: true # avoid - avoid_types_on_closure_parameters: true # avoid - avoid_return_types_on_setters: true # avoid - prefer_generic_function_type_aliases: true - avoid_private_typedef_functions: true # prefer - #- use_function_type_syntax_for_parameters # consider - hash_and_equals: true - avoid_equals_and_hash_code_on_mutable_classes: true # avoid - avoid_null_checks_in_equality_operators: true - diff --git a/packages/get_rx/coverage/lcov.info b/packages/get_rx/coverage/lcov.info deleted file mode 100644 index 878415a93..000000000 --- a/packages/get_rx/coverage/lcov.info +++ /dev/null @@ -1,677 +0,0 @@ -SF:lib/src/rx_core/rx_num.dart -DA:8,0 -DA:23,0 -DA:26,0 -DA:35,0 -DA:38,0 -DA:46,0 -DA:49,0 -DA:52,0 -DA:55,0 -DA:58,0 -DA:61,0 -DA:66,0 -DA:70,0 -DA:76,0 -DA:79,0 -DA:97,0 -DA:105,0 -DA:110,0 -DA:115,0 -DA:121,0 -DA:139,0 -DA:152,0 -DA:165,0 -DA:180,0 -DA:190,0 -DA:191,0 -DA:194,0 -DA:201,0 -DA:225,0 -DA:226,0 -DA:246,0 -DA:247,0 -DA:265,0 -DA:266,0 -DA:270,0 -DA:271,0 -DA:272,0 -DA:276,0 -DA:277,0 -DA:278,0 -DA:283,0 -DA:284,0 -DA:288,0 -DA:289,0 -DA:294,0 -DA:295,0 -DA:300,0 -DA:302,0 -DA:305,0 -DA:311,0 -DA:314,0 -DA:317,0 -DA:324,0 -DA:332,0 -DA:337,0 -DA:342,0 -DA:348,0 -DA:362,0 -DA:371,0 -DA:380,0 -DA:391,0 -DA:395,1 -DA:396,1 -DA:400,0 -DA:401,0 -DA:406,0 -DA:407,0 -DA:419,0 -DA:429,0 -DA:439,0 -DA:447,0 -DA:459,0 -DA:468,0 -DA:474,0 -DA:482,0 -DA:495,0 -DA:498,0 -DA:501,0 -DA:523,0 -DA:545,0 -DA:575,0 -DA:581,0 -DA:586,0 -DA:592,0 -DA:595,0 -DA:598,0 -DA:601,0 -DA:604,0 -DA:607,0 -DA:610,0 -DA:613,0 -DA:616,0 -LF:92 -LH:2 -end_of_record -SF:lib/src/rx_core/rx_impl.dart -DA:18,0 -DA:36,0 -DA:38,0 -DA:40,0 -DA:61,0 -DA:62,0 -DA:85,0 -DA:86,0 -DA:87,0 -DA:100,0 -DA:101,0 -DA:105,0 -DA:107,0 -DA:108,0 -DA:111,0 -DA:115,0 -DA:119,0 -DA:120,0 -DA:124,0 -DA:126,0 -DA:129,0 -DA:130,0 -DA:131,0 -DA:132,0 -DA:137,0 -DA:138,0 -DA:141,0 -DA:142,0 -DA:150,1 -DA:151,2 -DA:152,1 -DA:153,1 -DA:154,3 -DA:158,1 -DA:160,0 -DA:162,1 -DA:165,0 -DA:167,0 -DA:169,0 -DA:175,0 -DA:176,0 -DA:179,0 -DA:184,0 -DA:185,0 -DA:188,0 -DA:190,0 -DA:192,0 -DA:199,0 -DA:200,0 -DA:204,0 -DA:205,0 -DA:211,0 -DA:212,0 -DA:215,0 -DA:223,0 -DA:224,0 -DA:229,0 -DA:230,0 -DA:235,0 -DA:240,2 -DA:245,0 -DA:250,0 -DA:255,0 -LF:63 -LH:8 -end_of_record -SF:lib/src/rx_core/rx_interface.dart -DA:9,0 -DA:24,0 -LF:2 -LH:0 -end_of_record -SF:lib/src/rx_iterables/rx_list.dart -DA:12,0 -DA:13,0 -DA:18,0 -DA:19,0 -DA:21,0 -DA:22,0 -DA:24,0 -DA:25,0 -DA:28,0 -DA:29,0 -DA:36,0 -DA:37,0 -DA:38,0 -DA:41,0 -DA:42,0 -DA:47,0 -DA:48,0 -DA:49,0 -DA:53,0 -DA:54,0 -DA:57,0 -DA:58,0 -DA:59,0 -DA:62,0 -DA:64,0 -DA:65,0 -DA:69,0 -DA:70,0 -DA:74,0 -DA:75,0 -DA:79,0 -DA:80,0 -DA:81,0 -DA:85,0 -DA:86,0 -DA:87,0 -DA:90,0 -DA:92,0 -DA:93,0 -DA:96,0 -DA:98,0 -DA:99,0 -DA:102,0 -DA:103,0 -DA:110,0 -DA:112,0 -DA:114,0 -DA:119,0 -DA:121,0 -DA:122,0 -DA:126,0 -DA:128,0 -DA:129,0 -DA:133,0 -DA:135,0 -DA:136,0 -DA:139,0 -DA:141,0 -DA:142,0 -DA:145,0 -DA:147,0 -DA:148,0 -DA:151,0 -DA:153,0 -DA:154,0 -DA:157,0 -DA:159,0 -DA:160,0 -DA:162,0 -DA:163,0 -DA:167,0 -DA:168,0 -DA:169,0 -DA:172,0 -DA:173,0 -DA:174,0 -DA:178,0 -DA:179,0 -DA:180,0 -DA:183,0 -DA:186,0 -DA:188,0 -DA:191,0 -DA:193,0 -DA:194,0 -DA:197,0 -DA:200,0 -DA:201,0 -DA:202,0 -DA:203,0 -DA:206,0 -DA:208,0 -DA:214,0 -DA:220,0 -DA:221,0 -DA:224,0 -DA:225,0 -DA:227,0 -DA:228,0 -DA:230,0 -DA:232,0 -DA:235,0 -DA:237,0 -DA:240,0 -DA:242,0 -DA:245,0 -DA:247,0 -DA:250,0 -DA:252,0 -DA:255,0 -DA:257,0 -DA:260,0 -DA:262,0 -DA:265,0 -DA:267,0 -DA:268,0 -DA:271,0 -DA:273,0 -DA:276,0 -DA:278,0 -DA:281,0 -DA:283,0 -DA:286,0 -DA:288,0 -DA:291,0 -DA:293,0 -DA:296,0 -DA:298,0 -DA:301,0 -DA:303,0 -DA:306,0 -DA:308,0 -DA:311,0 -DA:313,0 -DA:316,0 -DA:318,0 -DA:321,0 -DA:323,0 -DA:326,0 -DA:328,0 -DA:329,0 -DA:332,0 -DA:334,0 -DA:337,0 -DA:339,0 -DA:342,0 -DA:344,0 -DA:345,0 -DA:348,0 -DA:350,0 -DA:351,0 -DA:354,0 -DA:355,0 -DA:357,0 -DA:359,0 -DA:360,0 -DA:363,0 -DA:365,0 -DA:366,0 -DA:369,0 -DA:371,0 -DA:372,0 -DA:375,0 -DA:376,0 -DA:378,0 -DA:380,0 -DA:383,0 -DA:385,0 -DA:388,0 -DA:390,0 -DA:393,0 -DA:395,0 -DA:398,0 -DA:400,0 -DA:403,0 -DA:405,0 -DA:408,0 -DA:410,0 -DA:413,0 -DA:415,0 -DA:418,0 -DA:420,0 -DA:423,0 -DA:425,0 -DA:428,0 -DA:430,0 -DA:431,0 -DA:434,0 -DA:436,0 -DA:437,0 -DA:442,0 -DA:444,0 -DA:446,0 -LF:193 -LH:0 -end_of_record -SF:lib/src/rx_iterables/rx_map.dart -DA:10,0 -DA:11,0 -DA:20,0 -DA:23,0 -DA:25,0 -DA:28,0 -DA:29,0 -DA:32,0 -DA:34,0 -DA:35,0 -DA:38,0 -DA:40,0 -DA:41,0 -DA:43,0 -DA:44,0 -DA:47,0 -DA:49,0 -DA:52,0 -DA:53,0 -DA:57,0 -DA:58,0 -DA:59,0 -DA:60,0 -DA:63,0 -DA:65,0 -DA:67,0 -DA:73,0 -DA:74,0 -DA:77,0 -DA:78,0 -DA:79,0 -DA:82,0 -DA:83,0 -DA:84,0 -DA:85,0 -DA:86,0 -DA:90,0 -DA:91,0 -DA:92,0 -DA:95,0 -DA:97,0 -DA:100,0 -DA:102,0 -DA:103,0 -DA:106,0 -DA:108,0 -DA:109,0 -DA:112,0 -DA:114,0 -DA:115,0 -DA:118,0 -DA:120,0 -DA:121,0 -DA:124,0 -DA:125,0 -DA:127,0 -DA:128,0 -DA:130,0 -DA:131,0 -DA:133,0 -DA:134,0 -DA:136,0 -DA:138,0 -DA:141,0 -DA:142,0 -DA:144,0 -DA:145,0 -DA:147,0 -DA:148,0 -DA:150,0 -DA:151,0 -DA:153,0 -DA:155,0 -DA:157,0 -DA:159,0 -DA:160,0 -DA:164,0 -DA:166,0 -DA:167,0 -DA:171,0 -DA:173,0 -DA:174,0 -DA:177,0 -DA:178,0 -DA:180,0 -DA:181,0 -DA:183,0 -DA:185,0 -DA:186,0 -DA:190,0 -DA:192,0 -DA:193,0 -DA:198,0 -DA:200,0 -DA:202,0 -LF:95 -LH:0 -end_of_record -SF:lib/src/rx_iterables/rx_set.dart -DA:10,0 -DA:11,0 -DA:16,0 -DA:17,0 -DA:19,0 -DA:20,0 -DA:22,0 -DA:23,0 -DA:26,0 -DA:27,0 -DA:33,0 -DA:34,0 -DA:35,0 -DA:39,0 -DA:40,0 -DA:41,0 -DA:44,0 -DA:45,0 -DA:50,0 -DA:51,0 -DA:52,0 -DA:56,0 -DA:58,0 -DA:59,0 -DA:63,0 -DA:65,0 -DA:66,0 -DA:70,0 -DA:71,0 -DA:75,0 -DA:76,0 -DA:79,0 -DA:86,0 -DA:87,0 -DA:89,0 -DA:94,0 -DA:95,0 -DA:96,0 -DA:99,0 -DA:100,0 -DA:101,0 -DA:104,0 -DA:105,0 -DA:106,0 -DA:108,0 -DA:109,0 -DA:113,0 -DA:114,0 -DA:115,0 -DA:118,0 -DA:119,0 -DA:120,0 -DA:124,0 -DA:125,0 -DA:126,0 -DA:129,0 -DA:132,0 -DA:134,0 -DA:137,0 -DA:139,0 -DA:140,0 -DA:143,0 -DA:144,0 -DA:148,0 -DA:149,0 -DA:150,0 -DA:151,0 -DA:154,0 -DA:156,0 -DA:158,0 -DA:164,0 -DA:165,0 -DA:168,0 -DA:169,0 -DA:171,0 -DA:172,0 -DA:174,0 -DA:176,0 -DA:179,0 -DA:181,0 -DA:184,0 -DA:186,0 -DA:189,0 -DA:191,0 -DA:194,0 -DA:196,0 -DA:199,0 -DA:201,0 -DA:204,0 -DA:206,0 -DA:209,0 -DA:211,0 -DA:214,0 -DA:216,0 -DA:219,0 -DA:221,0 -DA:224,0 -DA:226,0 -DA:229,0 -DA:231,0 -DA:234,0 -DA:236,0 -DA:239,0 -DA:241,0 -DA:244,0 -DA:245,0 -DA:247,0 -DA:249,0 -DA:252,0 -DA:254,0 -DA:257,0 -DA:259,0 -DA:262,0 -DA:264,0 -DA:267,0 -DA:269,0 -DA:272,0 -DA:274,0 -DA:277,0 -DA:279,0 -DA:282,0 -DA:284,0 -DA:287,0 -DA:289,0 -DA:292,0 -DA:294,0 -DA:297,0 -DA:299,0 -DA:302,0 -DA:304,0 -DA:307,0 -DA:309,0 -DA:312,0 -DA:314,0 -DA:315,0 -DA:318,0 -DA:320,0 -DA:321,0 -DA:324,0 -DA:326,0 -DA:327,0 -DA:330,0 -DA:332,0 -DA:337,0 -DA:339,0 -DA:341,0 -LF:146 -LH:0 -end_of_record -SF:lib/src/rx_workers/rx_workers.dart -DA:7,1 -DA:9,1 -DA:10,0 -DA:44,1 -DA:46,4 -DA:47,2 -DA:49,2 -DA:56,0 -DA:58,0 -DA:59,0 -DA:60,0 -DA:61,0 -DA:63,0 -DA:66,0 -DA:67,0 -DA:68,0 -DA:70,0 -DA:73,0 -DA:97,1 -DA:101,4 -DA:102,1 -DA:103,1 -DA:104,1 -DA:105,1 -DA:106,1 -DA:108,2 -DA:129,1 -DA:133,4 -DA:134,1 -DA:136,2 -DA:138,1 -DA:140,2 -DA:162,1 -DA:165,1 -DA:166,4 -DA:167,2 -DA:168,1 -DA:171,2 -DA:175,1 -DA:185,1 -DA:187,6 -DA:190,0 -DA:191,0 -DA:192,0 -DA:195,0 -DA:196,0 -DA:197,0 -DA:200,0 -LF:48 -LH:29 -end_of_record -SF:lib/src/rx_workers/utils/debouncer.dart -DA:15,1 -DA:17,1 -DA:18,2 -DA:19,3 -DA:23,0 -DA:26,0 -LF:6 -LH:4 -end_of_record diff --git a/packages/get_rx/example/main.dart b/packages/get_rx/example/main.dart deleted file mode 100644 index 76b49fa26..000000000 --- a/packages/get_rx/example/main.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:get_rx/get_rx.dart'; - -void main() { - var count = 0.obs; - ever(count, print); - count++; - count++; - count++; - count++; - count++; - count++; -} diff --git a/packages/get_rx/lib/get_rx.dart b/packages/get_rx/lib/get_rx.dart deleted file mode 100644 index 70fd95ae5..000000000 --- a/packages/get_rx/lib/get_rx.dart +++ /dev/null @@ -1,8 +0,0 @@ -library get_rx; - -export 'src/rx_core/rx_impl.dart'; -export 'src/rx_core/rx_interface.dart'; -export 'src/rx_iterables/rx_list.dart'; -export 'src/rx_iterables/rx_map.dart'; -export 'src/rx_iterables/rx_set.dart'; -export 'src/rx_workers/rx_workers.dart'; diff --git a/packages/get_rx/lib/src/rx_core/rx_impl.dart b/packages/get_rx/lib/src/rx_core/rx_impl.dart deleted file mode 100644 index 6c1e66e72..000000000 --- a/packages/get_rx/lib/src/rx_core/rx_impl.dart +++ /dev/null @@ -1,330 +0,0 @@ -import 'dart:async'; -import 'dart:collection'; -import 'package:meta/meta.dart'; - -import '../rx_core/rx_interface.dart'; -part 'rx_num.dart'; - -/// global object that registers against `GetX` and `Obx`, and allows the -/// reactivity -/// of those `Widgets` and Rx values. -RxInterface getObs; - -/// Base Rx class that manages all the stream logic for any Type. -abstract class _RxImpl implements RxInterface { - _RxImpl(T initial) { - _value = initial; - } - StreamController subject = StreamController.broadcast(); - final _subscriptions = HashMap, StreamSubscription>(); - - T _value; - - bool get canUpdate => _subscriptions.isNotEmpty; - - /// Makes this Rx looks like a function so you can update a new - /// value using [rx(someOtherValue)]. Practical to assign the Rx directly - /// to some Widget that has a signature ::onChange( value ) - /// - /// Example: - /// ``` - /// final myText = 'GetX rocks!'.obs; - /// - /// // in your Constructor, just to check it works :P - /// ever( myText, print ) ; - /// - /// // in your build(BuildContext) { - /// TextField( - /// onChanged: myText, - /// ), - ///``` - T call([T v]) { - if (v != null) { - value = v; - } - return value; - } - - /// Makes a direct update of [value] adding it to the Stream - /// useful when you make use of Rx for custom Types to referesh your UI. - /// - /// Sample: - /// ``` - /// class Person { - /// String name, last; - /// int age; - /// Person({this.name, this.last, this.age}); - /// @override - /// String toString() => '$name $last, $age years old'; - /// } - /// - /// final person = Person(name: 'John', last: 'Doe', age: 18).obs; - /// person.value.name = 'Roi'; - /// person.refresh(); - /// print( person ); - /// ``` - void refresh() { - subject.add(value); - } - - /// Uses a callback to update [value] internally, similar to [refresh], - /// but provides the current value as the argument. - /// Makes sense for custom Rx types (like Models). - /// - /// Sample: - /// ``` - /// class Person { - /// String name, last; - /// int age; - /// Person({this.name, this.last, this.age}); - /// @override - /// String toString() => '$name $last, $age years old'; - /// } - /// - /// final person = Person(name: 'John', last: 'Doe', age: 18).obs; - /// person.update((person) { - /// person.name = 'Roi'; - /// }); - /// print( person ); - /// ``` - void update(void fn(T val)) { - fn(_value); - subject.add(_value); - } - - /// updates the value to [null] and adds it to the Stream. - /// Even with null-safety coming, is still an important feature to support, as - /// [call()] doesn't accept [null] values. For instance, - /// [InputDecoration.errorText] has to be null to not show the "error state". - /// - /// Sample: - /// ``` - /// final inputError = ''.obs..nil(); - /// print('${inputError.runtimeType}: $inputError'); // outputs > RxString: null - /// ``` - void nil() { - subject.add(_value = null); - } - - /// Same as `toString()` but using a getter. - String get string => value.toString(); - - @override - String toString() => value.toString(); - - /// Returns the json representation of `value`. - dynamic toJson() => value; - - /// This equality override works for _RxImpl instances and the internal - /// values. - @override - // ignore: avoid_equals_and_hash_code_on_mutable_classes - bool operator ==(dynamic o) { - // Todo, find a common implementation for the hashCode of different Types. - if (o is T) return value == o; - if (o is RxInterface) return value == o.value; - return false; - } - - @override - // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => _value.hashCode; - - /// Closes the subscriptions for this Rx, releasing the resources. - void close() { - _subscriptions.forEach((observable, subscription) => subscription.cancel()); - _subscriptions.clear(); - subject.close(); - } - - /// This is an internal method. - /// Subscribe to changes on the inner stream. - void addListener(Stream rxGetx) { - if (_subscriptions.containsKey(rxGetx)) { - return; - } - _subscriptions[rxGetx] = rxGetx.listen((data) { - subject.add(data); - }); - } - - bool firstRebuild = true; - - /// Updates the [value] and adds it to the stream, updating the observer - /// Widget, only if it's different from the previous value. - set value(T val) { - if (_value == val && !firstRebuild) return; - firstRebuild = false; - _value = val; - subject.add(_value); - } - - /// Returns the current [value] - T get value { - if (getObs != null) { - getObs.addListener(subject.stream); - } - return _value; - } - - Stream get stream => subject.stream; - - StreamSubscription listen(void Function(T) onData, - {Function onError, void Function() onDone, bool cancelOnError}) => - stream.listen(onData, onError: onError, onDone: onDone); - - /// Binds an existing [Stream] to this Rx to keep the values in sync. - /// You can bind multiple sources to update the value. - /// Closing the subscription will happen automatically when the observer - /// Widget ([GetX] or [Obx]) gets unmounted from the Widget tree. - void bindStream(Stream stream) { - _subscriptions[stream] = stream.listen((va) => value = va); - } - - Stream map(R mapper(T data)) => stream.map(mapper); -} - -/// Rx class for `bool` Type. -class RxBool extends _RxImpl { - RxBool([bool initial]) : super(initial); - - bool operator &(bool other) => other && value; - - bool operator |(bool other) => other || value; - - bool operator ^(bool other) => !other == value; - - /// Toggles the bool [value] between false and true. - /// A shortcut for `flag.value = !flag.value;` - /// FIXME: why return this? fluent interface is not - /// not really a dart thing since we have '..' operator - // ignore: avoid_returning_this - RxBool toggle() { - subject.add(_value = !_value); - return this; - } - - String toString() { - return value ? "true" : "false"; - } -} - -/// Rx class for `String` Type. -class RxString extends _RxImpl { - RxString([String initial]) : super(initial); - - String operator +(String val) => _value + val; -} - -/// Foundation class used for custom `Types` outside the common native Dart -/// types. -/// For example, any custom "Model" class, like User().obs will use `Rx` as -/// wrapper. -class Rx extends _RxImpl { - Rx([T initial]) : super(initial); - - // TODO: Look for a way to throw the Exception with proper details when the - // value [T] doesn't implement toJson(). - @override - dynamic toJson() => (value as dynamic)?.toJson(); -} - -enum RxStatus { loading, error, success } - -/// It's Experimental class, the Api can be change -abstract class RxState extends _RxImpl { - RxState(T initial) : super(initial) { - _fillEmptyStatus(); - } - - RxStatus _status; - - bool get isNullOrEmpty { - if (_value == null) return true; - dynamic val = _value; - var result = false; - if (val is Iterable) { - result = val.isEmpty; - } else if (val is String) { - result = val.isEmpty; - } else if (val is Map) { - result = val.isEmpty; - } - return result; - } - - void _fillEmptyStatus() { - _status = isNullOrEmpty ? RxStatus.loading : RxStatus.success; - } - - RxStatus get status { - return _status; - } - - bool get isLoading => _status == RxStatus.loading; - bool get hasError => _status == RxStatus.error; - bool get hasData => _status == RxStatus.success; - - @protected - void refresh() { - subject.add(_value); - } - - @protected - void update(void fn(T val)) { - fn(_value); - subject.add(_value); - } - - @protected - T call([T v]) { - if (v != null) value = v; - return value; - } - - @protected - set value(T val) { - if (_value == val && !firstRebuild) return; - firstRebuild = false; - _value = val; - subject.add(_value); - } - - @protected - void change(T newState, {RxStatus status}) { - if (status != null) { - _status = status; - } - if (newState != _value) { - value = newState; - } - } - - @override - dynamic toJson() => (value as dynamic)?.toJson(); -} - -extension StringExtension on String { - /// Returns a `RxString` with [this] `String` as initial value. - RxString get obs => RxString(this); -} - -extension IntExtension on int { - /// Returns a `RxInt` with [this] `int` as initial value. - RxInt get obs => RxInt(this); -} - -extension DoubleExtension on double { - /// Returns a `RxDouble` with [this] `double` as initial value. - RxDouble get obs => RxDouble(this); -} - -extension BoolExtension on bool { - /// Returns a `RxBool` with [this] `bool` as initial value. - RxBool get obs => RxBool(this); -} - -extension RxT on T { - /// Returns a `Rx` instace with [this] `T` as initial value. - Rx get obs => Rx(this); -} diff --git a/packages/get_rx/lib/src/rx_core/rx_interface.dart b/packages/get_rx/lib/src/rx_core/rx_interface.dart deleted file mode 100644 index 1625bc187..000000000 --- a/packages/get_rx/lib/src/rx_core/rx_interface.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:async'; -import '../rx_typedefs/rx_typedefs.dart'; - -/// This class is the foundation for all reactive (Rx) classes that makes Get -/// so powerful. -/// This interface is the contract that [_RxImpl]<[T]> uses in all it's -/// subclass. -abstract class RxInterface { - RxInterface([T initial]); - - StreamController subject; - - /// Adds a listener to stream - void addListener(Stream rxGetx); - - bool get canUpdate; - - set value(T val); - - T get value; - - /// Closes the stream - // FIXME: shouldn't we expose the returned future? - void close() => subject?.close(); - - /// Calls [callback] with current value, when the value changes. - StreamSubscription listen(ValueCallback callback); -} diff --git a/packages/get_rx/lib/src/rx_core/rx_num.dart b/packages/get_rx/lib/src/rx_core/rx_num.dart deleted file mode 100644 index dd1855638..000000000 --- a/packages/get_rx/lib/src/rx_core/rx_num.dart +++ /dev/null @@ -1,617 +0,0 @@ -part of 'rx_impl.dart'; - -/// Base Rx class for all num Rx's. -abstract class _BaseRxNum extends _RxImpl { - _BaseRxNum(T initial) : super(initial); - - /// Addition operator. */ - - /// Multiplication operator. - num operator *(num other) => value * other; - - /// Euclidean modulo operator. - /// - /// Returns the remainder of the Euclidean division. The Euclidean division of - /// two integers `a` and `b` yields two integers `q` and `r` such that - /// `a == b * q + r` and `0 <= r < b.abs()`. - /// - /// The Euclidean division is only defined for integers, but can be easily - /// extended to work with doubles. In that case `r` may have a non-integer - /// value, but it still verifies `0 <= r < |b|`. - /// - /// The sign of the returned value `r` is always positive. - /// - /// See [remainder] for the remainder of the truncating division. - num operator %(num other) => value % other; - - /// Division operator. - double operator /(num other) => value / other; - - /// Truncating division operator. - /// - /// If either operand is a [double] then the result of the truncating division - /// `a ~/ b` is equivalent to `(a / b).truncate().toInt()`. - /// - /// If both operands are [int]s then `a ~/ b` performs the truncating - /// integer division. - int operator ~/(num other) => value ~/ other; - - /// Negate operator. - num operator -() => -value; - - /// Returns the remainder of the truncating division of `this` by [other]. - /// - /// The result `r` of this operation satisfies: - /// `this == (this ~/ other) * other + r`. - /// As a consequence the remainder `r` has the same sign as the divider - /// `this`. - num remainder(num other) => value.remainder(other); - - /// Relational less than operator. - bool operator <(num other) => value < other; - - /// Relational less than or equal operator. - bool operator <=(num other) => value <= other; - - /// Relational greater than operator. - bool operator >(num other) => value > other; - - /// Relational greater than or equal operator. - bool operator >=(num other) => value >= other; - - /// True if the number is the double Not-a-Number value; otherwise, false. - bool get isNaN => value.isNaN; - - /// True if the number is negative; otherwise, false. - /// - /// Negative numbers are those less than zero, and the double `-0.0`. - bool get isNegative => value.isNegative; - - /// True if the number is positive infinity or negative infinity; otherwise, - /// false. - bool get isInfinite => value.isInfinite; - - /// True if the number is finite; otherwise, false. - /// - /// The only non-finite numbers are NaN, positive infinity, and - /// negative infinity. - bool get isFinite => value.isFinite; - - /// Returns the absolute value of this [num]. - num abs() => value.abs(); - - /// Returns minus one, zero or plus one depending on the sign and - /// numerical value of the number. - /// - /// Returns minus one if the number is less than zero, - /// plus one if the number is greater than zero, - /// and zero if the number is equal to zero. - /// - /// Returns NaN if the number is the double NaN value. - /// - /// Returns a number of the same type as this number. - /// For doubles, `-0.0.sign == -0.0`. - /// The result satisfies: - /// - /// n == n.sign * n.abs() - /// - /// for all numbers `n` (except NaN, because NaN isn't `==` to itself). - num get sign => value.sign; - - /// Returns the integer closest to `this`. - /// - /// Rounds away from zero when there is no closest integer: - /// `(3.5).round() == 4` and `(-3.5).round() == -4`. - /// - /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. - int round() => value.round(); - - /// Returns the greatest integer no greater than `this`. - /// - /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. - int floor() => value.floor(); - - /// Returns the least integer no smaller than `this`. - /// - /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. - int ceil() => value.ceil(); - - /// Returns the integer obtained by discarding any fractional - /// digits from `this`. - /// - /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. - int truncate() => value.truncate(); - - /// Returns the double integer value closest to `this`. - /// - /// Rounds away from zero when there is no closest integer: - /// `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`. - /// - /// If this is already an integer valued double, including `-0.0`, or it is a - /// non-finite double value, the value is returned unmodified. - /// - /// For the purpose of rounding, `-0.0` is considered to be below `0.0`, - /// and `-0.0` is therefore considered closer to negative numbers than `0.0`. - /// This means that for a value, `d` in the range `-0.5 < d < 0.0`, - /// the result is `-0.0`. - /// - /// The result is always a double. - /// If this is a numerically large integer, the result may be an infinite - /// double. - double roundToDouble() => value.roundToDouble(); - - /// Returns the greatest double integer value no greater than `this`. - /// - /// If this is already an integer valued double, including `-0.0`, or it is a - /// non-finite double value, the value is returned unmodified. - /// - /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. - /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`. - /// - /// The result is always a double. - /// If this is a numerically large integer, the result may be an infinite - /// double. - double floorToDouble() => value.floorToDouble(); - - /// Returns the least double integer value no smaller than `this`. - /// - /// If this is already an integer valued double, including `-0.0`, or it is a - /// non-finite double value, the value is returned unmodified. - /// - /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. - /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`. - /// - /// The result is always a double. - /// If this is a numerically large integer, the result may be an infinite - /// double. - double ceilToDouble() => value.ceilToDouble(); - - /// Returns the double integer value obtained by discarding any fractional - /// digits from the double value of `this`. - /// - /// If this is already an integer valued double, including `-0.0`, or it is a - /// non-finite double value, the value is returned unmodified. - /// - /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. - /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and - /// in the range `0.0 < d < 1.0` it will return 0.0. - /// - /// The result is always a double. - /// If this is a numerically large integer, the result may be an infinite - /// double. - double truncateToDouble() => value.truncateToDouble(); - - /// Returns this [num] clamped to be in the range [lowerLimit]-[upperLimit]. - /// - /// The comparison is done using [compareTo] and therefore takes `-0.0` into - /// account. This also implies that [double.nan] is treated as the maximal - /// double value. - /// - /// The arguments [lowerLimit] and [upperLimit] must form a valid range where - /// `lowerLimit.compareTo(upperLimit) <= 0`. - num clamp(num lowerLimit, num upperLimit) => - value.clamp(lowerLimit, upperLimit); - - /// Truncates this [num] to an integer and returns the result as an [int]. */ - int toInt() => value.toInt(); - - /// Return this [num] as a [double]. - /// - /// If the number is not representable as a [double], an - /// approximation is returned. For numerically large integers, the - /// approximation may be infinite. - double toDouble() => value.toDouble(); - - /// Returns a decimal-point string-representation of `this`. - /// - /// Converts `this` to a [double] before computing the string representation. - /// - /// If the absolute value of `this` is greater or equal to `10^21` then this - /// methods returns an exponential representation computed by - /// `this.toStringAsExponential()`. Otherwise the result - /// is the closest string representation with exactly [fractionDigits] digits - /// after the decimal point. If [fractionDigits] equals 0 then the decimal - /// point is omitted. - /// - /// The parameter [fractionDigits] must be an integer satisfying: - /// `0 <= fractionDigits <= 20`. - /// - /// Examples: - /// - /// 1.toStringAsFixed(3); // 1.000 - /// (4321.12345678).toStringAsFixed(3); // 4321.123 - /// (4321.12345678).toStringAsFixed(5); // 4321.12346 - /// 123456789012345.toStringAsFixed(3); // 123456789012345.000 - /// 10000000000000000.toStringAsFixed(4); // 10000000000000000.0000 - /// 5.25.toStringAsFixed(0); // 5 - String toStringAsFixed(int fractionDigits) => - value.toStringAsFixed(fractionDigits); - - /// Returns an exponential string-representation of `this`. - /// - /// Converts `this` to a [double] before computing the string representation. - /// - /// If [fractionDigits] is given then it must be an integer satisfying: - /// `0 <= fractionDigits <= 20`. In this case the string contains exactly - /// [fractionDigits] after the decimal point. Otherwise, without the - /// parameter, the returned string uses the shortest number of digits that - /// accurately represent [this]. - /// - /// If [fractionDigits] equals 0 then the decimal point is omitted. - /// Examples: - /// - /// 1.toStringAsExponential(); // 1e+0 - /// 1.toStringAsExponential(3); // 1.000e+0 - /// 123456.toStringAsExponential(); // 1.23456e+5 - /// 123456.toStringAsExponential(3); // 1.235e+5 - /// 123.toStringAsExponential(0); // 1e+2 - String toStringAsExponential([int fractionDigits]) => - value.toStringAsExponential(fractionDigits); - - /// Converts `this` to a double and returns a string representation with - /// exactly [precision] significant digits. - /// - /// The parameter [precision] must be an integer satisfying: - /// `1 <= precision <= 21`. - /// - /// Examples: - /// - /// 1.toStringAsPrecision(2); // 1.0 - /// 1e15.toStringAsPrecision(3); // 1.00e+15 - /// 1234567.toStringAsPrecision(3); // 1.23e+6 - /// 1234567.toStringAsPrecision(9); // 1234567.00 - /// 12345678901234567890.toStringAsPrecision(20); // 12345678901234567168 - /// 12345678901234567890.toStringAsPrecision(14); // 1.2345678901235e+19 - /// 0.00000012345.toStringAsPrecision(15); // 1.23450000000000e-7 - /// 0.0000012345.toStringAsPrecision(15); // 0.00000123450000000000 - String toStringAsPrecision(int precision) => - value.toStringAsPrecision(precision); -} - -class RxNum extends _BaseRxNum { - RxNum(num initial) : super(initial); - - num operator +(num other) { - value += other; - return value; - } - - /// Subtraction operator. - num operator -(num other) { - value -= other; - return value; - } -} - -class RxDouble extends _BaseRxNum { - RxDouble([double initial]) : super(initial); - - /// Addition operator. - RxDouble operator +(num other) { - value += other; - return this; - } - - /// Subtraction operator. - RxDouble operator -(num other) { - value -= other; - return this; - } - - /// Multiplication operator. - double operator *(num other) => value * other; - - double operator %(num other) => value % other; - - /// Division operator. - double operator /(num other) => value / other; - - /// Truncating division operator. - /// - /// The result of the truncating division `a ~/ b` is equivalent to - /// `(a / b).truncate()`. - int operator ~/(num other) => value ~/ other; - - /// Negate operator. */ - double operator -() => -value; - - /// Returns the absolute value of this [double]. - double abs() => value.abs(); - - /// Returns the sign of the double's numerical value. - /// - /// Returns -1.0 if the value is less than zero, - /// +1.0 if the value is greater than zero, - /// and the value itself if it is -0.0, 0.0 or NaN. - double get sign => value.sign; - - /// Returns the integer closest to `this`. - /// - /// Rounds away from zero when there is no closest integer: - /// `(3.5).round() == 4` and `(-3.5).round() == -4`. - /// - /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. - int round() => value.round(); - - /// Returns the greatest integer no greater than `this`. - /// - /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. - int floor() => value.floor(); - - /// Returns the least integer no smaller than `this`. - /// - /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. - int ceil() => value.ceil(); - - /// Returns the integer obtained by discarding any fractional - /// digits from `this`. - /// - /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. - int truncate() => value.truncate(); - - /// Returns the integer double value closest to `this`. - /// - /// Rounds away from zero when there is no closest integer: - /// `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`. - /// - /// If this is already an integer valued double, including `-0.0`, or it is - /// not a finite value, the value is returned unmodified. - /// - /// For the purpose of rounding, `-0.0` is considered to be below `0.0`, - /// and `-0.0` is therefore considered closer to negative numbers than `0.0`. - /// This means that for a value, `d` in the range `-0.5 < d < 0.0`, - /// the result is `-0.0`. - double roundToDouble() => value.roundToDouble(); - - /// Returns the greatest integer double value no greater than `this`. - /// - /// If this is already an integer valued double, including `-0.0`, or it is - /// not a finite value, the value is returned unmodified. - /// - /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. - /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`. - double floorToDouble() => value.floorToDouble(); - - /// Returns the least integer double value no smaller than `this`. - /// - /// If this is already an integer valued double, including `-0.0`, or it is - /// not a finite value, the value is returned unmodified. - /// - /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. - /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`. - double ceilToDouble() => value.ceilToDouble(); - - /// Returns the integer double value obtained by discarding any fractional - /// digits from `this`. - /// - /// If this is already an integer valued double, including `-0.0`, or it is - /// not a finite value, the value is returned unmodified. - /// - /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. - /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and - /// in the range `0.0 < d < 1.0` it will return 0.0. - double truncateToDouble() => value.truncateToDouble(); -} - -class RxInt extends _BaseRxNum { - RxInt([int initial]) : super(initial); - - /// Addition operator. - RxInt operator +(int other) { - value += other; - return this; - } - - /// Subtraction operator. - RxInt operator -(int other) { - value -= other; - return this; - } - - /// Bit-wise and operator. - /// - /// Treating both `this` and [other] as sufficiently large two's component - /// integers, the result is a number with only the bits set that are set in - /// both `this` and [other] - /// - /// If both operands are negative, the result is negative, otherwise - /// the result is non-negative. - int operator &(int other) => value & other; - - /// Bit-wise or operator. - /// - /// Treating both `this` and [other] as sufficiently large two's component - /// integers, the result is a number with the bits set that are set in either - /// of `this` and [other] - /// - /// If both operands are non-negative, the result is non-negative, - /// otherwise the result is negative. - int operator |(int other) => value | other; - - /// Bit-wise exclusive-or operator. - /// - /// Treating both `this` and [other] as sufficiently large two's component - /// integers, the result is a number with the bits set that are set in one, - /// but not both, of `this` and [other] - /// - /// If the operands have the same sign, the result is non-negative, - /// otherwise the result is negative. - int operator ^(int other) => value ^ other; - - /// The bit-wise negate operator. - /// - /// Treating `this` as a sufficiently large two's component integer, - /// the result is a number with the opposite bits set. - /// - /// This maps any integer `x` to `-x - 1`. - int operator ~() => ~value; - - /// Shift the bits of this integer to the left by [shiftAmount]. - /// - /// Shifting to the left makes the number larger, effectively multiplying - /// the number by `pow(2, shiftIndex)`. - /// - /// There is no limit on the size of the result. It may be relevant to - /// limit intermediate values by using the "and" operator with a suitable - /// mask. - /// - /// It is an error if [shiftAmount] is negative. - int operator <<(int shiftAmount) => value << shiftAmount; - - /// Shift the bits of this integer to the right by [shiftAmount]. - /// - /// Shifting to the right makes the number smaller and drops the least - /// significant bits, effectively doing an integer division by - ///`pow(2, shiftIndex)`. - /// - /// It is an error if [shiftAmount] is negative. - int operator >>(int shiftAmount) => value >> shiftAmount; - - /// Returns this integer to the power of [exponent] modulo [modulus]. - /// - /// The [exponent] must be non-negative and [modulus] must be - /// positive. - int modPow(int exponent, int modulus) => value.modPow(exponent, modulus); - - /// Returns the modular multiplicative inverse of this integer - /// modulo [modulus]. - /// - /// The [modulus] must be positive. - /// - /// It is an error if no modular inverse exists. - int modInverse(int modulus) => value.modInverse(modulus); - - /// Returns the greatest common divisor of this integer and [other]. - /// - /// If either number is non-zero, the result is the numerically greatest - /// integer dividing both `this` and `other`. - /// - /// The greatest common divisor is independent of the order, - /// so `x.gcd(y)` is always the same as `y.gcd(x)`. - /// - /// For any integer `x`, `x.gcd(x)` is `x.abs()`. - /// - /// If both `this` and `other` is zero, the result is also zero. - int gcd(int other) => value.gcd(other); - - /// Returns true if and only if this integer is even. - bool get isEven => value.isEven; - - /// Returns true if and only if this integer is odd. - bool get isOdd => value.isOdd; - - /// Returns the minimum number of bits required to store this integer. - /// - /// The number of bits excludes the sign bit, which gives the natural length - /// for non-negative (unsigned) values. Negative values are complemented to - /// return the bit position of the first bit that differs from the sign bit. - /// - /// To find the number of bits needed to store the value as a signed value, - /// add one, i.e. use `x.bitLength + 1`. - /// ``` - /// x.bitLength == (-x-1).bitLength - /// - /// 3.bitLength == 2; // 00000011 - /// 2.bitLength == 2; // 00000010 - /// 1.bitLength == 1; // 00000001 - /// 0.bitLength == 0; // 00000000 - /// (-1).bitLength == 0; // 11111111 - /// (-2).bitLength == 1; // 11111110 - /// (-3).bitLength == 2; // 11111101 - /// (-4).bitLength == 2; // 11111100 - /// ``` - int get bitLength => value.bitLength; - - /// Returns the least significant [width] bits of this integer as a - /// non-negative number (i.e. unsigned representation). The returned value - /// has zeros in all bit positions higher than [width]. - /// ``` - /// (-1).toUnsigned(5) == 31 // 11111111 -> 00011111 - /// ``` - /// This operation can be used to simulate arithmetic from low level - /// languages. - /// For example, to increment an 8 bit quantity: - /// ``` - /// q = (q + 1).toUnsigned(8); - /// ``` - /// `q` will count from `0` up to `255` and then wrap around to `0`. - /// - /// If the input fits in [width] bits without truncation, the result is the - /// same as the input. The minimum width needed to avoid truncation of `x` is - /// given by `x.bitLength`, i.e. - /// ``` - /// x == x.toUnsigned(x.bitLength); - /// ``` - int toUnsigned(int width) => value.toUnsigned(width); - - /// Returns the least significant [width] bits of this integer, extending the - /// highest retained bit to the sign. This is the same as truncating the - /// value to fit in [width] bits using an signed 2-s complement - /// representation. - /// The returned value has the same bit value in all positions higher than - /// [width]. - /// - /// ``` - /// V--sign bit-V - /// 16.toSigned(5) == -16 // 00010000 -> 11110000 - /// 239.toSigned(5) == 15 // 11101111 -> 00001111 - /// ^ ^ - /// ``` - /// This operation can be used to simulate arithmetic from low level - /// languages. - /// For example, to increment an 8 bit signed quantity: - /// ``` - /// q = (q + 1).toSigned(8); - /// ``` - /// `q` will count from `0` up to `127`, wrap to `-128` and count back up to - /// `127`. - /// - /// If the input value fits in [width] bits without truncation, the result is - /// the same as the input. The minimum width needed to avoid truncation - /// of `x` is `x.bitLength + 1`, i.e. - /// ``` - /// x == x.toSigned(x.bitLength + 1); - /// ``` - int toSigned(int width) => value.toSigned(width); - - /// Return the negative value of this integer. - /// - /// The result of negating an integer always has the opposite sign, except - /// for zero, which is its own negation. - int operator -() => -value; - - /// Returns the absolute value of this integer. - /// - /// For any integer `x`, the result is the same as `x < 0 ? -x : x`. - int abs() => value.abs(); - - /// Returns the sign of this integer. - /// - /// Returns 0 for zero, -1 for values less than zero and - /// +1 for values greater than zero. - int get sign => value.sign; - - /// Returns `this`. - int round() => value.round(); - - /// Returns `this`. - int floor() => value.floor(); - - /// Returns `this`. - int ceil() => value.ceil(); - - /// Returns `this`. - int truncate() => value.truncate(); - - /// Returns `this.toDouble()`. - double roundToDouble() => value.roundToDouble(); - - /// Returns `this.toDouble()`. - double floorToDouble() => value.floorToDouble(); - - /// Returns `this.toDouble()`. - double ceilToDouble() => value.ceilToDouble(); - - /// Returns `this.toDouble()`. - double truncateToDouble() => value.truncateToDouble(); -} diff --git a/packages/get_rx/lib/src/rx_iterables/rx_list.dart b/packages/get_rx/lib/src/rx_iterables/rx_list.dart deleted file mode 100644 index f9563cf94..000000000 --- a/packages/get_rx/lib/src/rx_iterables/rx_list.dart +++ /dev/null @@ -1,449 +0,0 @@ -import 'dart:async'; -import 'dart:collection'; -import 'dart:math'; -import 'package:meta/meta.dart'; - -import '../rx_core/rx_impl.dart'; -import '../rx_core/rx_interface.dart'; -import '../rx_typedefs/rx_typedefs.dart'; - -/// Create a list similar to `List` -class RxList implements List, RxInterface> { - RxList([List initial]) { - if (initial != null) _list = initial; - } - - List _list = []; - - @override - Iterator get iterator => value.iterator; - - @override - bool get isEmpty => value.isEmpty; - - bool get canUpdate { - return _subscriptions.length > 0; - } - - @override - bool get isNotEmpty => value.isNotEmpty; - - @override - StreamController> subject = StreamController.broadcast(); - - final _subscriptions = HashMap>, StreamSubscription>(); - - void operator []=(int index, E val) { - _list[index] = val; - refresh(); - } - - void refresh() { - subject.add(_list); - } - - /// Special override to push() element(s) in a reactive way - /// inside the List, - RxList operator +(Iterable val) { - addAll(val); - refresh(); - return this; - } - - E operator [](int index) { - return value[index]; - } - - void add(E item) { - _list.add(item); - refresh(); - } - - @override - void addAll(Iterable item) { - _list.addAll(item); - refresh(); - } - - /// Add [item] to [List] only if [item] is not null. - void addNonNull(E item) { - if (item != null) add(item); - } - - /// Add [Iterable] to [List] only if [Iterable] is not null. - void addAllNonNull(Iterable item) { - if (item != null) addAll(item); - } - - /// Add [item] to [List] only if [condition] is true. - void addIf(dynamic condition, E item) { - if (condition is Condition) condition = condition(); - if (condition is bool && condition) add(item); - } - - /// Adds [Iterable] to [List] only if [condition] is true. - void addAllIf(dynamic condition, Iterable items) { - if (condition is Condition) condition = condition(); - if (condition is bool && condition) addAll(items); - } - - @override - void insert(int index, E item) { - _list.insert(index, item); - refresh(); - } - - @override - void insertAll(int index, Iterable iterable) { - _list.insertAll(index, iterable); - refresh(); - } - - @override - int get length => value.length; - - /// Removes an item from the list. - /// - /// This is O(N) in the number of items in the list. - /// - /// Returns whether the item was present in the list. - @override - bool remove(Object item) { - final hasRemoved = _list.remove(item); - if (hasRemoved) { - refresh(); - } - return hasRemoved; - } - - @override - E removeAt(int index) { - final item = _list.removeAt(index); - refresh(); - return item; - } - - @override - E removeLast() { - final item = _list.removeLast(); - refresh(); - return item; - } - - @override - void removeRange(int start, int end) { - _list.removeRange(start, end); - refresh(); - } - - @override - void removeWhere(bool Function(E) test) { - _list.removeWhere(test); - refresh(); - } - - @override - void clear() { - _list.clear(); - refresh(); - } - - @override - void sort([int compare(E a, E b)]) { - _list.sort(compare); - refresh(); - } - - @override - void close() { - _subscriptions.forEach((observable, subscription) { - subscription.cancel(); - }); - _subscriptions.clear(); - subject.close(); - } - - /// Replaces all existing items of this list with [item] - void assign(E item) { - clear(); - add(item); - } - - void update(void fn(Iterable value)) { - fn(value); - refresh(); - } - - /// Replaces all existing items of this list with [items] - void assignAll(Iterable items) { - clear(); - addAll(items); - } - - @protected - List get value { - if (getObs != null) { - getObs.addListener(subject.stream); - } - return _list; - } - - String get string => value.toString(); - - void addListener(Stream> rxGetX) { - if (_subscriptions.containsKey(rxGetX)) { - return; - } - _subscriptions[rxGetX] = rxGetX.listen(subject.add); - } - - set value(List val) { - if (_list == val) return; - _list = val; - refresh(); - } - - Stream> get stream => subject.stream; - - StreamSubscription> listen( - void Function(List) onData, { - Function onError, - void Function() onDone, - bool cancelOnError, - }) => - stream.listen(onData, onError: onError, onDone: onDone); - - /// Binds an existing [Stream] to this [RxList]. - /// You can bind multiple sources to update the value. - /// Closing the subscription will happen automatically when the observer - /// Widget ([GetX] or [Obx]) gets unmounted from the Widget tree. - void bindStream(Stream> stream) { - _subscriptions[stream] = stream.listen((va) => value = va); - } - - @override - E get first => value.first; - - @override - E get last => value.last; - - @override - bool any(bool Function(E) test) { - return value.any(test); - } - - @override - Map asMap() { - return value.asMap(); - } - - @override - List cast() { - return value.cast(); - } - - @override - bool contains(Object element) { - return value.contains(element); - } - - @override - E elementAt(int index) { - return value.elementAt(index); - } - - @override - bool every(bool Function(E) test) { - return value.every(test); - } - - @override - Iterable expand(Iterable Function(E) f) { - return value.expand(f); - } - - @override - void fillRange(int start, int end, [E fillValue]) { - _list.fillRange(start, end, fillValue); - refresh(); - } - - @override - E firstWhere(bool Function(E) test, {E Function() orElse}) { - return value.firstWhere(test, orElse: orElse); - } - - @override - T fold(T initialValue, T Function(T, E) combine) { - return value.fold(initialValue, combine); - } - - @override - Iterable followedBy(Iterable other) { - return value.followedBy(other); - } - - @override - void forEach(void Function(E) f) { - value.forEach(f); - } - - @override - Iterable getRange(int start, int end) { - return value.getRange(start, end); - } - - @override - int indexOf(E element, [int start = 0]) { - return value.indexOf(element, start); - } - - @override - int indexWhere(bool Function(E) test, [int start = 0]) { - return value.indexWhere(test, start); - } - - @override - String join([String separator = ""]) { - return value.join(separator); - } - - @override - int lastIndexOf(E element, [int start]) { - return value.lastIndexOf(element, start); - } - - @override - int lastIndexWhere(bool Function(E) test, [int start]) { - return value.lastIndexWhere(test, start); - } - - @override - E lastWhere(bool Function(E) test, {E Function() orElse}) { - return value.lastWhere(test, orElse: orElse); - } - - @override - set length(int newLength) { - _list.length = newLength; - refresh(); - } - - @override - Iterable map(T Function(E) f) { - return value.map(f); - } - - @override - E reduce(E Function(E, E) combine) { - return value.reduce(combine); - } - - @override - void replaceRange(int start, int end, Iterable replacement) { - _list.replaceRange(start, end, replacement); - refresh(); - } - - @override - void retainWhere(bool Function(E) test) { - _list.retainWhere(test); - refresh(); - } - - @override - Iterable get reversed => value.reversed; - - @override - void setAll(int index, Iterable iterable) { - _list.setAll(index, iterable); - refresh(); - } - - @override - void setRange(int start, int end, Iterable iterable, [int skipCount = 0]) { - _list.setRange(start, end, iterable, skipCount); - refresh(); - } - - @override - void shuffle([Random random]) { - _list.shuffle(random); - refresh(); - } - - @override - E get single => value.single; - - @override - E singleWhere(bool Function(E) test, {E Function() orElse}) { - return value.singleWhere(test, orElse: orElse); - } - - @override - Iterable skip(int count) { - return value.skip(count); - } - - @override - Iterable skipWhile(bool Function(E) test) { - return value.skipWhile(test); - } - - @override - List sublist(int start, [int end]) { - return value.sublist(start, end); - } - - @override - Iterable take(int count) { - return value.take(count); - } - - @override - Iterable takeWhile(bool Function(E) test) { - return value.takeWhile(test); - } - - @override - List toList({bool growable = true}) { - return value.toList(growable: growable); - } - - @override - Set toSet() { - return value.toSet(); - } - - @override - Iterable where(bool Function(E) test) { - return value.where(test); - } - - @override - Iterable whereType() { - return value.whereType(); - } - - @override - set first(E value) { - _list.first = value; - refresh(); - } - - @override - set last(E value) { - _list.last = value; - refresh(); - } -} - -extension ListExtension on List { - RxList get obs { - if (this != null) { - return RxList([])..addAllNonNull(this); - } else { - return RxList(null); - } - } -} diff --git a/packages/get_rx/lib/src/rx_iterables/rx_map.dart b/packages/get_rx/lib/src/rx_iterables/rx_map.dart deleted file mode 100644 index c9b9c26df..000000000 --- a/packages/get_rx/lib/src/rx_iterables/rx_map.dart +++ /dev/null @@ -1,205 +0,0 @@ -import 'dart:async'; -import 'dart:collection'; -import 'package:meta/meta.dart'; - -import '../rx_core/rx_impl.dart'; -import '../rx_core/rx_interface.dart'; -import '../rx_typedefs/rx_typedefs.dart'; - -class RxMap implements RxInterface>, Map { - RxMap([Map initial]) { - if (initial != null) _value = initial; - } - - @override - StreamController> subject = StreamController>.broadcast(); - final _subscriptions = HashMap>, StreamSubscription>(); - - Map _value; - - @protected - Map get value { - if (getObs != null) { - getObs.addListener(subject.stream); - } - return _value; - } - - void refresh() { - subject.add(_value); - } - - String get string => value.toString(); - - bool get canUpdate { - return _subscriptions.length > 0; - } - - @override - void close() { - _subscriptions.forEach((observable, subscription) { - subscription.cancel(); - }); - _subscriptions.clear(); - subject.close(); - } - - @override - void addListener(Stream> rxGetX) { - if (_subscriptions.containsKey(rxGetX)) { - return; - } - _subscriptions[rxGetX] = rxGetX.listen((data) { - subject.add(data); - }); - } - - set value(Map val) { - if (_value == val) return; - _value = val; - refresh(); - } - - Stream> get stream => subject.stream; - - StreamSubscription> listen(void Function(Map) onData, - {Function onError, void Function() onDone, bool cancelOnError}) => - stream.listen(onData, onError: onError, onDone: onDone); - - /// Binds an existing [Stream] to this [RxMap]. - /// You can bind multiple sources to update the value. - /// Closing the subscription will happen automatically when the observer - /// Widget ([GetX] or [Obx]) gets unmounted from the Widget tree. - void bindStream(Stream> stream) { - _subscriptions[stream] = stream.listen((va) => value = va); - } - - void add(K key, V value) { - _value[key] = value; - refresh(); - } - - void addIf(dynamic condition, K key, V value) { - if (condition is Condition) condition = condition(); - if (condition is bool && condition) { - _value[key] = value; - refresh(); - } - } - - void addAllIf(dynamic condition, Map values) { - if (condition is Condition) condition = condition(); - if (condition is bool && condition) addAll(values); - } - - @override - V operator [](Object key) { - return value[key]; - } - - @override - void operator []=(K key, V value) { - _value[key] = value; - refresh(); - } - - @override - void addAll(Map other) { - _value.addAll(other); - refresh(); - } - - @override - void addEntries(Iterable> entries) { - _value.addEntries(entries); - refresh(); - } - - @override - void clear() { - _value.clear(); - refresh(); - } - - @override - Map cast() => value.cast(); - - @override - bool containsKey(Object key) => value.containsKey(key); - - @override - bool containsValue(Object value) => _value.containsValue(value); - - @override - Iterable> get entries => value.entries; - - @override - void forEach(void Function(K, V) f) { - value.forEach(f); - } - - @override - bool get isEmpty => value.isEmpty; - - @override - bool get isNotEmpty => value.isNotEmpty; - - @override - Iterable get keys => value.keys; - - @override - int get length => value.length; - - @override - Map map(MapEntry Function(K, V) transform) => - value.map(transform); - - @override - V putIfAbsent(K key, V Function() ifAbsent) { - final val = _value.putIfAbsent(key, ifAbsent); - refresh(); - return val; - } - - @override - V remove(Object key) { - final val = _value.remove(key); - refresh(); - return val; - } - - @override - void removeWhere(bool Function(K, V) test) { - _value.removeWhere(test); - refresh(); - } - - @override - Iterable get values => value.values; - - @override - String toString() => _value.toString(); - - @override - V update(K key, V Function(V) update, {V Function() ifAbsent}) { - final val = _value.update(key, update, ifAbsent: ifAbsent); - refresh(); - return val; - } - - @override - void updateAll(V Function(K, V) update) { - _value.updateAll(update); - refresh(); - } -} - -extension MapExtension on Map { - RxMap get obs { - if (this != null) { - return RxMap({})..addAll(this); - } else { - return RxMap(null); - } - } -} diff --git a/packages/get_rx/lib/src/rx_iterables/rx_set.dart b/packages/get_rx/lib/src/rx_iterables/rx_set.dart deleted file mode 100644 index d621d6686..000000000 --- a/packages/get_rx/lib/src/rx_iterables/rx_set.dart +++ /dev/null @@ -1,344 +0,0 @@ -import 'dart:async'; -import 'dart:collection'; -import 'package:meta/meta.dart'; - -import '../rx_core/rx_impl.dart'; -import '../rx_core/rx_interface.dart'; -import '../rx_typedefs/rx_typedefs.dart'; - -class RxSet implements Set, RxInterface> { - RxSet([Set initial]) { - if (initial != null) _set = initial; - } - - Set _set = {}; - - @override - Iterator get iterator => value.iterator; - - @override - bool get isEmpty => value.isEmpty; - - bool get canUpdate { - return _subscriptions.length > 0; - } - - @override - bool get isNotEmpty => value.isNotEmpty; - - StreamController> subject = StreamController>.broadcast(); - final _subscriptions = HashMap>, StreamSubscription>(); - - /// Adds [item] only if [condition] resolves to true. - void addIf(dynamic condition, E item) { - if (condition is Condition) condition = condition(); - if (condition is bool && condition) add(item); - } - - /// Adds all [items] only if [condition] resolves to true. - void addAllIf(dynamic condition, Iterable items) { - if (condition is Condition) condition = condition(); - if (condition is bool && condition) addAll(items); - } - - void refresh() { - subject.add(_set); - } - - /// Special override to push() element(s) in a reactive way - /// inside the List, - RxSet operator +(Set val) { - addAll(val); - refresh(); - return this; - } - - @override - bool add(E value) { - final val = _set.add(value); - refresh(); - return val; - } - - @override - void addAll(Iterable item) { - _set.addAll(item); - refresh(); - } - - /// Adds only if [item] is not null. - void addNonNull(E item) { - if (item != null) add(item); - } - - /// Adds only if [item] is not null. - void addAllNonNull(Iterable item) { - if (item != null) addAll(item); - } - - int get length => value.length; - - /// Removes an item from the list. - /// - /// This is O(N) in the number of items in the list. - /// - /// Returns whether the item was present in the list. - bool remove(Object item) { - var hasRemoved = _set.remove(item); - if (hasRemoved) { - refresh(); - } - return hasRemoved; - } - - void removeWhere(bool Function(E) test) { - _set.removeWhere(test); - refresh(); - } - - void clear() { - _set.clear(); - refresh(); - } - - void close() { - _subscriptions.forEach((observable, subscription) { - subscription.cancel(); - }); - _subscriptions.clear(); - subject.close(); - } - - /// Replaces all existing items of this list with [item] - void assign(E item) { - clear(); - add(item); - } - - void update(void fn(Iterable value)) { - fn(value); - refresh(); - } - - /// Replaces all existing items of this list with [items] - void assignAll(Iterable items) { - clear(); - addAll(items); - } - - @protected - Set get value { - if (getObs != null) { - getObs.addListener(subject.stream); - } - return _set; - } - - String get string => value.toString(); - - void addListener(Stream> rxGetX) { - if (_subscriptions.containsKey(rxGetX)) { - return; - } - _subscriptions[rxGetX] = rxGetX.listen((data) { - subject.add(data); - }); - } - - set value(Set val) { - if (_set == val) return; - _set = val; - refresh(); - } - - Stream> get stream => subject.stream; - - StreamSubscription> listen(void Function(Set) onData, - {Function onError, void Function() onDone, bool cancelOnError}) => - stream.listen(onData, onError: onError, onDone: onDone); - - /// Binds an existing [Stream] to this [RxSet]. - /// You can bind multiple sources to update the value. - /// Closing the subscription will happen automatically when the observer - /// Widget ([GetX] or [Obx]) gets unmounted from the Widget tree. - void bindStream(Stream> stream) { - _subscriptions[stream] = stream.listen((va) => value = va); - } - - @override - E get first => value.first; - - @override - E get last => value.last; - - @override - bool any(bool Function(E) test) { - return value.any(test); - } - - @override - Set cast() { - return value.cast(); - } - - @override - bool contains(Object element) { - return value.contains(element); - } - - @override - E elementAt(int index) { - return value.elementAt(index); - } - - @override - bool every(bool Function(E) test) { - return value.every(test); - } - - @override - Iterable expand(Iterable Function(E) f) { - return value.expand(f); - } - - @override - E firstWhere(bool Function(E) test, {E Function() orElse}) { - return value.firstWhere(test, orElse: orElse); - } - - @override - T fold(T initialValue, T Function(T, E) combine) { - return value.fold(initialValue, combine); - } - - @override - Iterable followedBy(Iterable other) { - return value.followedBy(other); - } - - @override - void forEach(void Function(E) f) { - value.forEach(f); - } - - @override - String join([String separator = ""]) { - return value.join(separator); - } - - @override - E lastWhere(bool Function(E) test, {E Function() orElse}) { - return value.lastWhere(test, orElse: orElse); - } - - @override - Iterable map(T Function(E) f) { - return value.map(f); - } - - @override - E reduce(E Function(E, E) combine) { - return value.reduce(combine); - } - - @override - E get single => value.single; - - @override - E singleWhere(bool Function(E) test, {E Function() orElse}) { - return value.singleWhere(test, orElse: orElse); - } - - @override - Iterable skip(int count) { - return value.skip(count); - } - - @override - Iterable skipWhile(bool Function(E) test) { - return value.skipWhile(test); - } - - @override - Iterable take(int count) { - return value.take(count); - } - - @override - Iterable takeWhile(bool Function(E) test) { - return value.takeWhile(test); - } - - @override - List toList({bool growable = true}) { - return value.toList(growable: growable); - } - - @override - Set toSet() { - return value.toSet(); - } - - @override - Iterable where(bool Function(E) test) { - return value.where(test); - } - - @override - Iterable whereType() { - return value.whereType(); - } - - @override - bool containsAll(Iterable other) { - return value.containsAll(other); - } - - @override - Set difference(Set other) { - return value.difference(other); - } - - @override - Set intersection(Set other) { - return value.intersection(other); - } - - @override - E lookup(Object object) { - return value.lookup(object); - } - - @override - void removeAll(Iterable elements) { - _set.removeAll(elements); - refresh(); - } - - @override - void retainAll(Iterable elements) { - _set.retainAll(elements); - refresh(); - } - - @override - void retainWhere(bool Function(E) E) { - _set.retainWhere(E); - refresh(); - } - - @override - Set union(Set other) { - return value.union(other); - } -} - -extension SetExtension on Set { - RxSet get obs { - if (this != null) { - return RxSet({})..addAllNonNull(this); - } else { - return RxSet(null); - } - } -} diff --git a/packages/get_rx/lib/src/rx_typedefs/rx_typedefs.dart b/packages/get_rx/lib/src/rx_typedefs/rx_typedefs.dart deleted file mode 100644 index dd1bb714e..000000000 --- a/packages/get_rx/lib/src/rx_typedefs/rx_typedefs.dart +++ /dev/null @@ -1,2 +0,0 @@ -typedef Condition = bool Function(); -typedef ValueCallback = Function(T v); diff --git a/packages/get_rx/lib/src/rx_workers/rx_workers.dart b/packages/get_rx/lib/src/rx_workers/rx_workers.dart deleted file mode 100644 index f316a2505..000000000 --- a/packages/get_rx/lib/src/rx_workers/rx_workers.dart +++ /dev/null @@ -1,201 +0,0 @@ -import 'dart:async'; -import 'package:get_core/get_core.dart'; - -import '../rx_core/rx_interface.dart'; -import 'utils/debouncer.dart'; - -bool _conditional(dynamic condition) { - if (condition == null) return true; - if (condition is bool) return condition; - if (condition is bool Function()) return condition(); - return true; -} - -/// -/// Called every time [listener] changes. As long as the [condition] -/// returns true. -/// -/// Sample: -/// Every time increment() is called, ever() will process the [condition] -/// (can be a [bool] expression or a [bool Function()]), and only call -/// the callback when [condition] is true. -/// In our case, only when count is bigger to 5. In order to "dispose" -/// this Worker -/// that will run forever, we made a [worker] variable. So, when the count value -/// reaches 10, the worker gets disposed, and releases any memory resources. -/// -/// ``` -/// // imagine some counter widget... -/// -/// class _CountController extends GetxController { -/// final count = 0.obs; -/// Worker worker; -/// -/// void onInit() { -/// worker = ever(count, (value) { -/// print('counter changed to: $value'); -/// if (value == 10) worker.dispose(); -/// }, condition: () => count > 5); -/// } -/// -/// void increment() => count + 1; -/// } -/// ``` -Worker ever(RxInterface listener, Function(T) callback, - {dynamic condition = true}) { - StreamSubscription sub = listener.subject.stream.listen((event) { - if (_conditional(condition)) callback(event); - }); - return Worker(sub.cancel, '[ever]'); -} - -/// Similar to [ever], but takes a list of [listeners], the condition -/// for the [callback] is common to all [listeners], -/// and the [callback] is executed to each one of them. The [Worker] is -/// common to all, so [worker.dispose()] will cancel all streams. -Worker everAll(List listeners, Function(dynamic) callback, - {dynamic condition = true}) { - final evers = []; - for (var i in listeners) { - final sub = i.subject.stream.listen((event) { - if (_conditional(condition)) callback(event); - }); - evers.add(sub); - } - - Future cancel() { - for (var i in evers) { - i.cancel(); - } - return Future.value(() {}); - } - - return Worker(cancel, '[everAll]'); -} - -/// [once()] will execute only 1 time when [condition] is met and cancel -/// the subscription to the [listener] stream right after that. -/// [condition] defines when [callback] is called, and -/// can be a [bool] or a [bool Function()]. -/// -/// Sample: -/// ``` -/// class _CountController extends GetxController { -/// final count = 0.obs; -/// Worker worker; -/// -/// @override -/// Future onInit() async { -/// worker = once(count, (value) { -/// print("counter reached $value before 3 seconds."); -/// }, condition: () => count() > 2); -/// 3.delay(worker.dispose); -/// } -/// void increment() => count + 1; -/// } -///``` -Worker once(RxInterface listener, Function(T) callback, - {dynamic condition}) { - Worker ref; - StreamSubscription sub; - sub = listener.subject.stream.listen((event) { - if (!_conditional(condition)) return; - ref._disposed = true; - ref._log('called'); - sub?.cancel(); - callback(event); - }); - ref = Worker(sub.cancel, '[once]'); - return ref; -} - -/// Ignore all changes in [listener] during [time] (1 sec by default) or until -/// [condition] is met (can be a [bool] expression or a [bool Function()]), -/// It brings the 1st "value" since the period of time, so -/// if you click a counter button 3 times in 1 sec, it will show you "1" -/// (after 1 sec of the first press) -/// click counter 3 times in 1 sec, it will show you "4" (after 1 sec) -/// click counter 2 times in 1 sec, it will show you "7" (after 1 sec). -/// -/// Sample: -/// // wait 1 sec each time an event starts, only if counter is lower than 20. -/// worker = interval( -/// count, -/// (value) => print(value), -/// time: 1.seconds, -/// condition: () => count < 20, -/// ); -/// ``` -Worker interval(RxInterface listener, Function(T) callback, - {Duration time = const Duration(seconds: 1), dynamic condition = true}) { - var debounceActive = false; - time ??= const Duration(seconds: 1); - StreamSubscription sub = listener.subject.stream.listen((event) async { - if (debounceActive || !_conditional(condition)) return; - debounceActive = true; - await Future.delayed(time); - debounceActive = false; - callback(event); - }); - return Worker(sub.cancel, '[interval]'); -} - -/// [debounce] is similar to [interval], but sends the last value. -/// Useful for Anti DDos, every time the user stops typing for 1 second, -/// for instance. -/// When [listener] emits the last "value", when [time] hits, -/// it calls [callback] with the last "value" emitted. -/// -/// Sample: -/// -/// ``` -/// worker = debounce( -/// count, -/// (value) { -/// print(value); -/// if( value > 20 ) worker.dispose(); -/// }, -/// time: 1.seconds, -/// ); -/// } -/// ``` -Worker debounce(RxInterface listener, Function(T) callback, - {Duration time}) { - final _debouncer = - Debouncer(delay: time ?? const Duration(milliseconds: 800)); - StreamSubscription sub = listener.subject.stream.listen((event) { - _debouncer(() { - callback(event); - }); - }); - return Worker(sub.cancel, '[debounce]'); -} - -class Worker { - Worker(this.worker, this.type); - - /// subscription.cancel() callback - final Future Function() worker; - - /// type of worker (debounce, interval, ever).. - final String type; - bool _disposed = false; - - //final bool _verbose = true; - void _log(String msg) { - // if (!_verbose) return; - Get.log('$runtimeType $type $msg'); - } - - void dispose() { - if (_disposed) { - _log('already disposed'); - return; - } - _disposed = true; - worker(); - _log('disposed'); - } - - void call() => dispose(); -} diff --git a/packages/get_rx/lib/src/rx_workers/utils/debouncer.dart b/packages/get_rx/lib/src/rx_workers/utils/debouncer.dart deleted file mode 100644 index a304fe092..000000000 --- a/packages/get_rx/lib/src/rx_workers/utils/debouncer.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'dart:async'; - -/// This "function" class is the implementation of [debouncer()] Worker. -/// It calls the function passed after specified [delay] parameter. -/// Example: -/// ``` -/// final delayed = Debouncer( delay: Duration( seconds: 1 )) ; -/// print( 'the next function will be called after 1 sec' ); -/// delayed( () => print( 'called after 1 sec' )); -/// ``` -class Debouncer { - final Duration delay; - Timer _timer; - - Debouncer({this.delay}); - - void call(void Function() action) { - _timer?.cancel(); - _timer = Timer(delay, action); - } - - /// Notifies if the delayed call is active. - bool get isRunning => _timer?.isActive ?? false; - - /// Cancel the current delayed call. - void cancel() => _timer?.cancel(); -} diff --git a/packages/get_rx/pubspec.yaml b/packages/get_rx/pubspec.yaml deleted file mode 100644 index bd6fdae92..000000000 --- a/packages/get_rx/pubspec.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: get_rx -description: A set of powerful tools to provide reactive programming for the GetX™ framework. -version: 3.13.0 -homepage: https://github.com/jonataslaw/getx - -environment: - sdk: ">=2.7.0 <3.0.0" - - -dependencies: - get_core: ">=3.13.0 <4.0.0" - get_instance: ">=3.13.0 <4.0.0" - meta: ">=1.1.0 <2.0.0" - - -dev_dependencies: - test: ">=1.0.0 <2.0.0" - test_coverage: ">=0.4.3 <1.0.0" - diff --git a/packages/get_rx/test/rx_workers_test.dart b/packages/get_rx/test/rx_workers_test.dart deleted file mode 100644 index ab5d1e25d..000000000 --- a/packages/get_rx/test/rx_workers_test.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'package:get_rx/get_rx.dart'; -import 'package:test/test.dart'; - -void main() { - test('once', () async { - final count = 0.obs; - var result = -1; - once(count, (_) { - result = _ as int; - }); - count.value++; - await Future.delayed(Duration.zero); - expect(1, result); - count.value++; - await Future.delayed(Duration.zero); - expect(1, result); - count.value++; - await Future.delayed(Duration.zero); - expect(1, result); - }); - - test('ever', () async { - final count = 0.obs; - var result = -1; - ever(count, (_) { - result = _ as int; - }); - count.value++; - await Future.delayed(Duration.zero); - expect(1, result); - count.value++; - await Future.delayed(Duration.zero); - expect(2, result); - count.value++; - await Future.delayed(Duration.zero); - expect(3, result); - }); - - test('debounce', () async { - final count = 0.obs; - var result = -1; - debounce(count, (_) { - // print(_); - result = _ as int; - }, time: Duration(milliseconds: 100)); - - count.value++; - count.value++; - count.value++; - count.value++; - await Future.delayed(Duration.zero); - expect(-1, result); - await Future.delayed(Duration(milliseconds: 100)); - expect(4, result); - }); - - test('interval', () async { - final count = 0.obs; - var result = -1; - interval(count, (_) { - // print(_); - result = _ as int; - }, time: Duration(milliseconds: 100)); - - count.value++; - await Future.delayed(Duration.zero); - await Future.delayed(Duration(milliseconds: 100)); - expect(1, result); - count.value++; - count.value++; - count.value++; - await Future.delayed(Duration.zero); - await Future.delayed(Duration(milliseconds: 100)); - expect(2, result); - count.value++; - await Future.delayed(Duration.zero); - await Future.delayed(Duration(milliseconds: 100)); - expect(5, result); - }); -} diff --git a/packages/get_state_manager/.gitignore b/packages/get_state_manager/.gitignore deleted file mode 100644 index 1985397a2..000000000 --- a/packages/get_state_manager/.gitignore +++ /dev/null @@ -1,74 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 diff --git a/packages/get_state_manager/.metadata b/packages/get_state_manager/.metadata deleted file mode 100644 index 3207f67d3..000000000 --- a/packages/get_state_manager/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: a27c242b0eea731317cfec5bbdd9d35452ab3ecb - channel: dev - -project_type: package diff --git a/packages/get_state_manager/CHANGELOG.md b/packages/get_state_manager/CHANGELOG.md deleted file mode 100644 index c895ba06f..000000000 --- a/packages/get_state_manager/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -## [3.13.0] -* Bump to Get 3.13.0 - -## [3.12.0] -* Bump to Get 3.12.0 - -## [3.10.2] - -- initial release diff --git a/packages/get_state_manager/LICENSE b/packages/get_state_manager/LICENSE deleted file mode 100644 index 2fb920baf..000000000 --- a/packages/get_state_manager/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jonny Borges - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/get_state_manager/README.md b/packages/get_state_manager/README.md deleted file mode 100644 index 6c6cf562a..000000000 --- a/packages/get_state_manager/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# get_state_manager - -A new Flutter package project. - -## Getting Started - -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/packages/get_state_manager/analysis_options.yaml b/packages/get_state_manager/analysis_options.yaml deleted file mode 100644 index 38018b421..000000000 --- a/packages/get_state_manager/analysis_options.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# Include option is buggy: -# https://github.com/flutter/flutter/issues/62591 -# In case the include issue gets fixed, lines below INCLUDE_FIX -# can be removed - -# include: package:effective_dart/analysis_options.1.2.0.yaml -analyzer: - strong-mode: - implicit-casts: false -linter: - rules: - await_only_futures: true - # This one is desirable, but that's a lot of work for now - public_member_api_docs: false - # Desirable, but would be breaking changes: - avoid_positional_boolean_parameters: false - constant_identifier_names: false - include_file_not_found: false - - # INCLUDE_FIX (copy of effective dart 1.2.0) - # STYLE - camel_case_types: true - camel_case_extensions: true - library_names: true - file_names: true - library_prefixes: true - non_constant_identifier_names: true - directives_ordering: true - lines_longer_than_80_chars: true # avoid - curly_braces_in_flow_control_structures: true - - # DOCUMENTATION - slash_for_doc_comments: true - package_api_docs: true # prefer - #- comment_references # Unused because https://github.com/dart-lang/sdk/issues/36974 - - # USAGE - implementation_imports: true - avoid_relative_lib_imports: true # prefer - prefer_relative_imports: true # prefer - prefer_adjacent_string_concatenation: true - prefer_interpolation_to_compose_strings: true # prefer - unnecessary_brace_in_string_interps: true # avoid - prefer_collection_literals: true - avoid_function_literals_in_foreach_calls: true # avoid - prefer_iterable_whereType: true - prefer_function_declarations_over_variables: true - unnecessary_lambdas: true - prefer_equal_for_default_values: true - avoid_init_to_null: true - unnecessary_getters_setters: true - #- unnecessary_getters # prefer # Disabled pending fix: https://github.com/dart-lang/linter/issues/23 - #- prefer_expression_function_bodies # consider - unnecessary_this: true - prefer_initializing_formals: true - type_init_formals: true - empty_constructor_bodies: true - unnecessary_new: true - unnecessary_const: true - avoid_catches_without_on_clauses: true # avoid - avoid_catching_errors: true - use_rethrow_when_possible: true - - # DESIGN - use_to_and_as_if_applicable: true # prefer - one_member_abstracts: true # avoid - avoid_classes_with_only_static_members: true # avoid - prefer_mixin: true - prefer_final_fields: true # prefer - use_setters_to_change_properties: true - avoid_setters_without_getters: true - avoid_returning_null: true # avoid - avoid_returning_this: true # avoid - type_annotate_public_apis: true # prefer - #- prefer_typing_uninitialized_variables # consider - omit_local_variable_types: true # avoid - avoid_types_on_closure_parameters: true # avoid - avoid_return_types_on_setters: true # avoid - prefer_generic_function_type_aliases: true - avoid_private_typedef_functions: true # prefer - #- use_function_type_syntax_for_parameters # consider - hash_and_equals: true - avoid_equals_and_hash_code_on_mutable_classes: true # avoid - avoid_null_checks_in_equality_operators: true - diff --git a/packages/get_state_manager/lib/get_state_manager.dart b/packages/get_state_manager/lib/get_state_manager.dart deleted file mode 100644 index 24df24f23..000000000 --- a/packages/get_state_manager/lib/get_state_manager.dart +++ /dev/null @@ -1,13 +0,0 @@ -library get_state_manager; - -export 'package:get_instance/get_instance.dart'; -export 'package:get_rx/get_rx.dart'; -export 'src/rx_flutter/rx_disposable.dart'; -export 'src/rx_flutter/rx_getx_widget.dart'; -export 'src/rx_flutter/rx_obx_widget.dart'; -export 'src/rx_flutter/rx_ticket_provider_mixin.dart'; -export 'src/simple/get_state.dart'; -export 'src/simple/get_view.dart'; -export 'src/simple/immutable_state.dart'; -export 'src/simple/mixin_state.dart'; -export 'src/simple/simple_builder.dart'; diff --git a/packages/get_state_manager/lib/src/rx_flutter/rx_disposable.dart b/packages/get_state_manager/lib/src/rx_flutter/rx_disposable.dart deleted file mode 100644 index fc833b6df..000000000 --- a/packages/get_state_manager/lib/src/rx_flutter/rx_disposable.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/scheduler.dart'; -import 'package:get_instance/get_instance.dart'; - -/// Unlike GetxController, which serves to control events on each of its pages, -/// GetxService is not automatically disposed (nor can be removed with -/// Get.delete()). -/// It is ideal for situations where, once started, that service will -/// remain in memory, such as Auth control for example. Only way to remove -/// it is Get.reset(). -abstract class GetxService extends DisposableInterface with GetxServiceMixin {} - -abstract class DisposableInterface extends GetLifeCycle { - bool _initialized = false; - - /// Checks whether the controller has already been initialized. - bool get initialized => _initialized; - - DisposableInterface() { - onStart.callback = _onStart; - } - - // Internal callback that starts the cycle of this controller. - void _onStart() { - onInit(); - _initialized = true; - SchedulerBinding.instance?.addPostFrameCallback((_) => onReady()); - } - - /// Called immediately after the widget is allocated in memory. - /// You might use this to initialize something for the controller. - @override - void onInit() {} - - /// Called 1 frame after onInit(). It is the perfect place to enter - /// navigation events, like snackbar, dialogs, or a new route, or - /// async request. - @override - void onReady() {} - - /// Called before [onDelete] method. [onClose] might be used to - /// dispose resources used by the controller. Like closing events, - /// or streams before the controller is destroyed. - /// Or dispose objects that can potentially create some memory leaks, - /// like TextEditingControllers, AnimationControllers. - /// Might be useful as well to persist some data on disk. - @override - void onClose() {} -} diff --git a/packages/get_state_manager/lib/src/rx_flutter/rx_getx_widget.dart b/packages/get_state_manager/lib/src/rx_flutter/rx_getx_widget.dart deleted file mode 100644 index a9cf97159..000000000 --- a/packages/get_state_manager/lib/src/rx_flutter/rx_getx_widget.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/widgets.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_instance/get_instance.dart'; -import 'package:get_rx/get_rx.dart'; -import '../../get_state_manager.dart'; - -typedef GetXControllerBuilder = Widget Function( - T controller); - -class GetX extends StatefulWidget { - final GetXControllerBuilder builder; - final bool global; - - // final Stream Function(T) stream; - // final StreamController Function(T) streamController; - final bool autoRemove; - final bool assignId; - final void Function(State state) initState, dispose, didChangeDependencies; - final void Function(GetX oldWidget, State state) didUpdateWidget; - final T init; - final String tag; - - const GetX({ - this.tag, - this.builder, - this.global = true, - this.autoRemove = true, - this.initState, - this.assignId = false, - // this.stream, - this.dispose, - this.didChangeDependencies, - this.didUpdateWidget, - this.init, - // this.streamController - }); - - GetImplXState createState() => GetImplXState(); -} - -class GetImplXState extends State> { - RxInterface _observer; - T controller; - bool isCreator = false; - StreamSubscription subs; - - @override - void initState() { - _observer = Rx(); - var isPrepared = GetInstance().isPrepared(tag: widget.tag); - var isRegistered = GetInstance().isRegistered(tag: widget.tag); - - if (widget.global) { - if (isPrepared) { - if (Get.smartManagement != SmartManagement.keepFactory) { - isCreator = true; - } - controller = GetInstance().find(tag: widget.tag); - } else if (isRegistered) { - controller = GetInstance().find(tag: widget.tag); - isCreator = false; - } else { - controller = widget.init; - isCreator = true; - GetInstance().put(controller, tag: widget.tag); - } - } else { - controller = widget.init; - isCreator = true; - controller?.onStart(); - } - if (widget.initState != null) widget.initState(this); - if (widget.global && Get.smartManagement == SmartManagement.onlyBuilder) { - controller?.onStart(); - } - subs = _observer.subject.stream.listen((data) => setState(() {})); - super.initState(); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - if (widget.didChangeDependencies != null) { - widget.didChangeDependencies(this); - } - } - - @override - void didUpdateWidget(GetX oldWidget) { - super.didUpdateWidget(oldWidget as GetX); - if (widget.didUpdateWidget != null) widget.didUpdateWidget(oldWidget, this); - } - - @override - void dispose() { - if (widget.dispose != null) widget.dispose(this); - if (isCreator || widget.assignId) { - if (widget.autoRemove && GetInstance().isRegistered(tag: widget.tag)) { - GetInstance().delete(tag: widget.tag); - } - } - subs.cancel(); - _observer.close(); - controller = null; - isCreator = null; - super.dispose(); - } - - Widget get notifyChildren { - final observer = getObs; - getObs = _observer; - final result = widget.builder(controller); - if (!_observer.canUpdate) { - throw """ - [Get] the improper use of a GetX has been detected. - You should only use GetX or Obx for the specific widget that will be updated. - If you are seeing this error, you probably did not insert any observable variables into GetX/Obx - or insert them outside the scope that GetX considers suitable for an update - (example: GetX => HeavyWidget => variableObservable). - If you need to update a parent widget and a child widget, wrap each one in an Obx/GetX. - """; - } - getObs = observer; - return result; - } - - @override - Widget build(BuildContext context) => notifyChildren; -} diff --git a/packages/get_state_manager/lib/src/rx_flutter/rx_obx_widget.dart b/packages/get_state_manager/lib/src/rx_flutter/rx_obx_widget.dart deleted file mode 100644 index 62d29db12..000000000 --- a/packages/get_state_manager/lib/src/rx_flutter/rx_obx_widget.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'dart:async'; -import 'package:flutter/widgets.dart'; -import 'package:get_rx/get_rx.dart'; - -typedef WidgetCallback = Widget Function(); - -/// The simplest reactive widget in GetX. -/// -/// Just pass your Rx variable in the root scope of the callback to have it -/// automatically registered for changes. -/// -/// final _name = "GetX".obs; -/// Obx(() => Text( _name.value )),... ; -class Obx extends StatefulWidget { - final WidgetCallback builder; - - const Obx(this.builder); - - _ObxState createState() => _ObxState(); -} - -class _ObxState extends State { - RxInterface _observer; - StreamSubscription subs; - - _ObxState() { - _observer = Rx(); - } - - @override - void initState() { - subs = _observer.subject.stream.listen((data) => setState(() {})); - super.initState(); - } - - @override - void dispose() { - subs.cancel(); - _observer.close(); - super.dispose(); - } - - Widget get notifyChilds { - final observer = getObs; - getObs = _observer; - final result = widget.builder(); - if (!_observer.canUpdate) { - throw """ - [Get] the improper use of a GetX has been detected. - You should only use GetX or Obx for the specific widget that will be updated. - If you are seeing this error, you probably did not insert any observable variables into GetX/Obx - or insert them outside the scope that GetX considers suitable for an update - (example: GetX => HeavyWidget => variableObservable). - If you need to update a parent widget and a child widget, wrap each one in an Obx/GetX. - """; - } - getObs = observer; - return result; - } - - @override - Widget build(BuildContext context) => notifyChilds; -} - -/// Similar to Obx, but manages a local state. -/// Pass the initial data in constructor. -/// Useful for simple local states, like toggles, visibility, themes, -/// button states, etc. -/// Sample: -/// ObxValue((data) => Switch( -/// value: data.value, -/// onChanged: (flag) => data.value = flag, -/// ), -/// false.obs, -/// ), - -// TODO: change T to a proper Rx interface, that includes the accessor -// for ::value -class ObxValue extends StatefulWidget { - final Widget Function(T) builder; - final T data; - - const ObxValue(this.builder, this.data, {Key key}) : super(key: key); - - _ObxValueState createState() => _ObxValueState(); -} - -class _ObxValueState extends State { - RxInterface _observer; - StreamSubscription subs; - - _ObxValueState() { - _observer = Rx(); - } - - @override - void initState() { - subs = _observer.subject.stream.listen((data) => setState(() {})); - super.initState(); - } - - @override - void dispose() { - subs.cancel(); - _observer.close(); - super.dispose(); - } - - Widget get notifyChilds { - final observer = getObs; - getObs = _observer; - // observable is implicity taken from the constructor. - final result = widget.builder(widget.data); - getObs = observer; - return result; - } - - @override - Widget build(BuildContext context) => notifyChilds; -} diff --git a/packages/get_state_manager/lib/src/rx_flutter/rx_ticket_provider_mixin.dart b/packages/get_state_manager/lib/src/rx_flutter/rx_ticket_provider_mixin.dart deleted file mode 100644 index 4795afff9..000000000 --- a/packages/get_state_manager/lib/src/rx_flutter/rx_ticket_provider_mixin.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/scheduler.dart'; -import '../../get_state_manager.dart'; - -/// Used like [SingleTickerProviderMixin] but only with Get Controllers. -/// Simplifies AnimationController creation inside GetxController. -/// -/// Example: -///``` -///class SplashController extends GetxController with -/// SingleGetTickerProviderMixin { -/// AnimationController _ac; -/// -/// @override -/// void onInit() { -/// final dur = const Duration(seconds: 2); -/// _ac = AnimationController.unbounded(duration: dur, vsync: this); -/// _ac.repeat(); -/// _ac.addListener(() => print("Animation Controller value: ${_ac.value}")); -/// } -/// ... -/// ``` -mixin SingleGetTickerProviderMixin on DisposableInterface - implements TickerProvider { - Ticker createTicker(TickerCallback onTick) => Ticker(onTick); -} diff --git a/packages/get_state_manager/lib/src/simple/get_state.dart b/packages/get_state_manager/lib/src/simple/get_state.dart deleted file mode 100644 index 208baa98c..000000000 --- a/packages/get_state_manager/lib/src/simple/get_state.dart +++ /dev/null @@ -1,305 +0,0 @@ -import 'dart:collection'; -import 'package:flutter/material.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_instance/get_instance.dart'; -import '../../get_state_manager.dart'; - -import 'simple_builder.dart'; - -// Changed to VoidCallback. -//typedef Disposer = void Function(); - -// replacing StateSetter, return if the Widget is mounted for extra validation. -// if it brings overhead the extra call, -typedef GetStateUpdate = void Function(); -//typedef GetStateUpdate = void Function(VoidCallback fn); - -/// Complies with [GetStateUpdater] -/// -/// This mixin's function represents a [GetStateUpdater], and might be used -/// by [GetBuilder()], [SimpleBuilder()] (or similar) to comply -/// with [GetStateUpdate] signature. REPLACING the [StateSetter]. -/// Avoids the potential (but extremely unlikely) issue of having -/// the Widget in a dispose() state, and abstracts the -/// API from the ugly fn((){}). -mixin GetStateUpdaterMixin on State { - // To avoid the creation of an anonym function to be GC later. - // ignore: prefer_function_declarations_over_variables - - /// Experimental method to replace setState((){}); - /// Used with GetStateUpdate. - void getUpdate() { - if (mounted) setState(() {}); - } -} - -class GetxController extends DisposableInterface { - final _updaters = HashSet(); - -// final _updatersIds = HashMap(); // - final _updatersIds = HashMap(); - - final _updatersGroupIds = HashMap>(); - - /// Rebuilds [GetBuilder] each time you call [update()]; - /// Can take a List of [ids], that will only update the matching - /// `GetBuilder( id: )`, - /// [ids] can be reused among `GetBuilders` like group tags. - /// The update will only notify the Widgets, if [condition] is true. - void update([List ids, bool condition = true]) { - if (!condition) { - return; - } - if (ids == null) { -// _updaters?.forEach((rs) => rs(() {})); // - for (final updater in _updaters) { - updater(); - } - } else { - // @jonny, remove this commented code if it's not more optimized. -// for (final id in ids) { -// if (_updatersIds[id] != null) _updatersIds[id](); -// if (_updatersGroupIds[id] != null) -// for (final rs in _updatersGroupIds[id]) rs(); -// } - - for (final id in ids) { - _updatersIds[id]?.call(); - // ignore: avoid_function_literals_in_foreach_calls - _updatersGroupIds[id]?.forEach((rs) => rs()); - } - } - } - -// VoidCallback addListener(StateSetter listener) {// - VoidCallback addListener(GetStateUpdate listener) { - _updaters.add(listener); - return () => _updaters.remove(listener); - } - -// VoidCallback addListenerId(String key, StateSetter listener) {// - VoidCallback addListenerId(String key, GetStateUpdate listener) { -// _printCurrentIds(); - if (_updatersIds.containsKey(key)) { - _updatersGroupIds[key] ??= HashSet.identity(); - _updatersGroupIds[key].add(listener); - return () { - _updatersGroupIds[key].remove(listener); - }; - } else { - _updatersIds[key] = listener; - return () => _updatersIds.remove(key); - } - } - - /// To dispose an [id] from future updates(), this ids are registered - /// by [GetBuilder()] or similar, so is a way to unlink the state change with - /// the Widget from the Controller. - void disposeId(String id) { - _updatersIds.remove(id); - _updatersGroupIds.remove(id); - } - - /// Remove this after checking the new implementation makes sense. - /// Uncomment this if you wanna control the removal of ids.. - /// bool _debugging = false; - /// Future _printCurrentIds() async { - /// if (_debugging) return; - /// _debugging = true; - /// print('about to debug...'); - /// await Future.delayed(Duration(milliseconds: 10)); - /// int totalGroups = 0; - /// _updatersGroupIds.forEach((key, value) { - /// totalGroups += value.length; - /// }); - /// int totalIds = _updatersIds.length; - /// print( - /// 'Total: ${totalIds + totalGroups},'+ - /// 'in groups:$totalGroups, solo ids:$totalIds',); - /// _debugging = false; - /// } -} - -typedef GetControllerBuilder = Widget Function( - T controller); - -class GetBuilder extends StatefulWidget { - final GetControllerBuilder builder; - final bool global; - final String id; - final String tag; - final bool autoRemove; - final bool assignId; - final void Function(State state) initState, dispose, didChangeDependencies; - final void Function(GetBuilder oldWidget, State state) didUpdateWidget; - final T init; - - const GetBuilder({ - Key key, - this.init, - this.global = true, - @required this.builder, - this.autoRemove = true, - this.assignId = false, - this.initState, - this.tag, - this.dispose, - this.id, - this.didChangeDependencies, - this.didUpdateWidget, - }) : assert(builder != null), - super(key: key); - - @override - _GetBuilderState createState() => _GetBuilderState(); -} - -class _GetBuilderState extends State> - with GetStateUpdaterMixin { - T controller; - - bool isCreator = false; - VoidCallback remove; - - @override - void initState() { - super.initState(); - - if (widget.initState != null) widget.initState(this); - if (widget.global) { - final isPrepared = GetInstance().isPrepared(tag: widget.tag); - final isRegistered = GetInstance().isRegistered(tag: widget.tag); - - if (isPrepared) { - if (Get.smartManagement != SmartManagement.keepFactory) { - isCreator = true; - } - controller = GetInstance().find(tag: widget.tag); - } else if (isRegistered) { - controller = GetInstance().find(tag: widget.tag); - isCreator = false; - } else { - controller = widget.init; - isCreator = true; - GetInstance().put(controller, tag: widget.tag); - } - } else { - controller = widget.init; - isCreator = true; - controller?.onStart(); - } - - // if (widget.global && Get.smartManagement == - //SmartManagement.onlyBuilder) { - // controller?.onStart(); - // } - _subscribeToController(); - } - - /// Register to listen Controller's events. - /// It gets a reference to the remove() callback, to delete the - /// setState "link" from the Controller. - void _subscribeToController() { - remove?.call(); - remove = (widget.id == null) -// ? controller?.addListener(setState) // -// : controller?.addListenerId(widget.id, setState); // - ? controller?.addListener(getUpdate) - : controller?.addListenerId(widget.id, getUpdate); - } - - /// Sample for [GetStateUpdate] when you don't wanna - /// use [GetStateHelper mixin]. - /// bool _getUpdater() { - /// final _mounted = mounted; - /// if (_mounted) setState(() {}); - /// return _mounted; - /// } - - @override - void dispose() { - super.dispose(); - if (widget.dispose != null) widget.dispose(this); - if (isCreator || widget.assignId) { - if (widget.autoRemove && GetInstance().isRegistered(tag: widget.tag)) { - GetInstance().delete(tag: widget.tag); - } - } - - remove?.call(); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - if (widget.didChangeDependencies != null) { - widget.didChangeDependencies(this); - } - } - - @override - void didUpdateWidget(GetBuilder oldWidget) { - super.didUpdateWidget(oldWidget as GetBuilder); - // to avoid conflicts when modifying a "grouped" id list. - if (oldWidget.id != widget.id) { - _subscribeToController(); - } - if (widget.didUpdateWidget != null) widget.didUpdateWidget(oldWidget, this); - } - - @override - Widget build(BuildContext context) => widget.builder(controller); -} - -/// This is a experimental feature. -/// Meant to be used with SimpleBuilder, it auto-registers the variable -/// like Rx() does with Obx(). -class Value extends GetxController { - Value([this._value]); - - T _value; - - T get value { - TaskManager.instance.notify(_updaters); - return _value; - } - - set value(T newValue) { - if (_value == newValue) return; - _value = newValue; - update(); - } -} - -/// It's Experimental class, the Api can be change -abstract class GetState extends GetxController { - GetState(T initialValue) { - _state = initialValue; - } - - // StreamController _subject; - - // @override - // void onClose() { - // _subject?.close(); - // } - - // Stream get stream { - // if (_subject == null) { - // _subject = StreamController.broadcast(); - // } - // return _subject.stream; - // } - - T _state; - - T get state => _state; - - @protected - void change(T newState) { - if (newState != _state) { - _state = newState; - update(); - } - } -} diff --git a/packages/get_state_manager/lib/src/simple/get_view.dart b/packages/get_state_manager/lib/src/simple/get_view.dart deleted file mode 100644 index 8c452f03f..000000000 --- a/packages/get_state_manager/lib/src/simple/get_view.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:get_instance/get_instance.dart'; -import '../rx_flutter/rx_disposable.dart'; - -/// GetView is a great way of quickly access your Controller -/// without having to call Get.find() yourself. -/// -/// Sample: -/// ``` -/// class AwesomeController extends GetxController { -/// final String title = 'My Awesome View'; -/// } -/// -/// class AwesomeView extends GetView { -/// /// if you need you can pass the tag for -/// /// Get.find(tag:"myTag"); -/// @override -/// final String tag = "myTag"; -/// -/// AwesomeView({Key key}):super(key:key); -/// -/// @override -/// Widget build(BuildContext context) { -/// return Container( -/// padding: EdgeInsets.all(20), -/// child: Text( controller.title ), -/// ); -/// } -/// } -///`` -abstract class GetView extends StatelessWidget { - const GetView({Key key}) : super(key: key); - - final String tag = null; - - T get controller => GetInstance().find(tag: tag); - - @override - Widget build(BuildContext context); -} - -abstract class GetWidget - extends GetStatelessWidget { - GetWidget({Key key}) : super(key: key); - - final Set _value = {}; - - final String tag = null; - - T get controller { - if (_value.isEmpty) _value.add(GetInstance().find(tag: tag)); - return _value.first; - } - - @override - Widget build(BuildContext context); -} - -// abstract class GetView extends StatelessWidget { -// const GetView({Key key}) : super(key: key); -// A get controller => GetInstance().find(); -// B get controller2 => GetInstance().find(); - -// @override -// Widget build(BuildContext context); -// } - -// abstract class GetView2 extends StatelessWidget { -// const GetView2({Key key}) : super(key: key); -// A get controller => GetInstance().find(); -// B get controller2 => GetInstance().find(); -// C get controller3 => GetInstance().find(); - -// @override -// Widget build(BuildContext context); -// } - -class GetStatelessElement extends ComponentElement { - GetStatelessElement(GetStatelessWidget widget) : super(widget); - - @override - GetStatelessWidget get widget => super.widget as GetStatelessWidget; - - @override - Widget build() => widget.build(this); - - @override - void update(GetStatelessWidget newWidget) { - super.update(newWidget); - markNeedsBuild(); - rebuild(); - } - - @override - void mount(Element parent, dynamic newSlot) { - if (widget?.controller?.initialized != null && - !widget.controller.initialized) { - widget?.controller?.onStart(); - } - - super.mount(parent, newSlot); - } - - @override - void unmount() { - widget?.controller?.onClose(); - super.unmount(); - } -} - -abstract class GetStatelessWidget - extends Widget { - const GetStatelessWidget({Key key}) : super(key: key); - @override - GetStatelessElement createElement() => GetStatelessElement(this); - @protected - Widget build(BuildContext context); - - T get controller; -} diff --git a/packages/get_state_manager/lib/src/simple/immutable_state.dart b/packages/get_state_manager/lib/src/simple/immutable_state.dart deleted file mode 100644 index 73f58709b..000000000 --- a/packages/get_state_manager/lib/src/simple/immutable_state.dart +++ /dev/null @@ -1,148 +0,0 @@ -//import 'package:flutter/foundation.dart'; -//import 'package:flutter/material.dart'; -//import 'package:get/state_manager.dart'; -// -//import '../../instance/get_instance.dart'; -// -//abstract class GetState extends DisposableInterface { -// GetState(this.initialValue) { -// _state = initialValue; -// } -// -// final Set _updaters = {}; -// -// @protected -// void update(T value, [bool condition = true]) { -// if (!condition) return; -// _state = value; -// _updaters.forEach((rs) => rs(() {})); -// } -// -// T _state; -// -// final T initialValue; -// -// void addListener(StateSetter value) { -// _updaters.add(value); -// } -// -// void removeListener(StateSetter value) { -// _updaters.add(value); -// } -// -// // @protected -// T get state => _state; -// -// @protected -// void updater(void fn(T value)) { -// fn(_state); -// update(_state); -// } -//} -// -//class StateBuilder extends StatefulWidget { -// final Widget Function(dynamic) builder; -// final bool global; -// final String tag; -// final bool autoRemove; -// final bool assignId; -// final void Function(State state) initState, dispose, didChangeDependencies; -// final void Function(StateBuilder oldWidget, State state) didUpdateWidget; -// final T Function() state; -// -// const StateBuilder({ -// Key key, -// this.state, -// this.global = true, -// @required this.builder, -// this.autoRemove = true, -// this.assignId = false, -// this.initState, -// this.tag, -// this.dispose, -// this.didChangeDependencies, -// this.didUpdateWidget, -// }) : assert(builder != null), -// super(key: key); -// -// @override -// _StateBuilderState createState() => _StateBuilderState(); -//} -// -//class _StateBuilderState extends State> { -// T controller; -// -// bool isCreator = false; -// -// @override -// void initState() { -// super.initState(); -// if (widget.initState != null) widget.initState(this); -// if (widget.global) { -// final isPrepared = GetInstance().isPrepared(tag: widget.tag); -// final isRegistred = GetInstance().isRegistred(tag: widget.tag); -// -// if (isPrepared) { -// isCreator = true; -// } else if (isRegistred) { -// isCreator = false; -// } else { -// isCreator = true; -// } -// -// if (isCreator) { -// controller?.onStart(); -// } -// -// final instance = GetInstance().putOrFind( -// widget.state, -// tag: widget.tag, -// ); -// controller = instance; -// controller._updaters.add(setState); -// } else { -// controller = widget.state(); -// isCreator = true; -// controller._updaters.add(setState); -// controller?.onStart(); -// } -// } -// -// @override -// void dispose() { -// super.dispose(); -// if (widget.dispose != null) widget.dispose(this); -// if (isCreator || widget.assignId) { -// if (widget.autoRemove && -// GetInstance().isRegistred( -// tag: widget.tag, -// )) { -// controller._updaters.remove(setState); -// GetInstance().delete(tag: widget.tag); -// } -// } else { -// controller._updaters.remove(setState); -// } -// } -// -// @override -// void didChangeDependencies() { -// super.didChangeDependencies(); -// if (widget.didChangeDependencies != null) { -// widget.didChangeDependencies(this); -// } -// } -// -// @override -// void didUpdateWidget(StateBuilder oldWidget) { -// super.didUpdateWidget(oldWidget as StateBuilder); -// if (widget.didUpdateWidget != null) { -// widget.didUpdateWidget(oldWidget, this); -// } -// } -// -// @override -// Widget build(BuildContext context) { -// return widget.builder(controller.state); -// } -//} diff --git a/packages/get_state_manager/lib/src/simple/mixin_state.dart b/packages/get_state_manager/lib/src/simple/mixin_state.dart deleted file mode 100644 index f886468da..000000000 --- a/packages/get_state_manager/lib/src/simple/mixin_state.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter/material.dart'; -import '../../get_state_manager.dart'; -import 'get_state.dart'; - -class MixinBuilder extends StatelessWidget { - @required - final Widget Function(T) builder; - final bool global; - final String id; - final bool autoRemove; - final void Function(State state) initState, dispose, didChangeDependencies; - final void Function(GetBuilder oldWidget, State state) didUpdateWidget; - final T init; - - const MixinBuilder({ - Key key, - this.init, - this.global = true, - this.builder, - this.autoRemove = true, - this.initState, - this.dispose, - this.id, - this.didChangeDependencies, - this.didUpdateWidget, - }) : assert(builder != null), - super(key: key); - - @override - Widget build(BuildContext context) { - return GetBuilder( - init: init, - global: global, - autoRemove: autoRemove, - initState: initState, - dispose: dispose, - id: id, - didChangeDependencies: didChangeDependencies, - didUpdateWidget: didUpdateWidget, - builder: (controller) => Obx(() => builder.call(controller))); - } -} diff --git a/packages/get_state_manager/lib/src/simple/simple_builder.dart b/packages/get_state_manager/lib/src/simple/simple_builder.dart deleted file mode 100644 index 1a375df14..000000000 --- a/packages/get_state_manager/lib/src/simple/simple_builder.dart +++ /dev/null @@ -1,148 +0,0 @@ -import 'dart:async'; -import 'dart:collection'; -import 'package:flutter/widgets.dart'; -import 'get_state.dart'; - -typedef ValueBuilderUpdateCallback = void Function(T snapshot); -typedef ValueBuilderBuilder = Widget Function( - T snapshot, ValueBuilderUpdateCallback updater); - -/// Manages a local state like ObxValue, but uses a callback instead of -/// a Rx value. -/// -/// Example: -/// ``` -/// ValueBuilder( -/// initialValue: false, -/// builder: (value, update) => Switch( -/// value: value, -/// onChanged: (flag) { -/// update( flag ); -/// },), -/// onUpdate: (value) => print("Value updated: $value"), -/// ), -/// ``` -class ValueBuilder extends StatefulWidget { - final T initialValue; - final ValueBuilderBuilder builder; - final void Function() onDispose; - final void Function(T) onUpdate; - - const ValueBuilder({ - Key key, - this.initialValue, - this.onDispose, - this.onUpdate, - @required this.builder, - }) : super(key: key); - - @override - _ValueBuilderState createState() => _ValueBuilderState(); -} - -class _ValueBuilderState extends State> { - T value; - - @override - void initState() { - super.initState(); - value = widget.initialValue; - } - - @override - Widget build(BuildContext context) => widget.builder(value, updater); - - void updater(T newValue) { - if (widget.onUpdate != null) { - widget.onUpdate(newValue); - } - setState(() { - value = newValue; - }); - } - - @override - void dispose() { - super.dispose(); - widget?.onDispose?.call(); - if (value is ChangeNotifier) { - (value as ChangeNotifier)?.dispose(); - } else if (value is StreamController) { - (value as StreamController)?.close(); - } - value = null; - } -} - -// It's a experimental feature -class SimpleBuilder extends StatefulWidget { - final Widget Function(BuildContext) builder; - - const SimpleBuilder({Key key, @required this.builder}) - : assert(builder != null), - super(key: key); - - @override - _SimpleBuilderState createState() => _SimpleBuilderState(); -} - -class _SimpleBuilderState extends State - with GetStateUpdaterMixin { - final HashSet disposers = HashSet(); - - @override - void dispose() { - super.dispose(); - for (final disposer in disposers) { - disposer(); - } - } - - @override - Widget build(BuildContext context) { - return TaskManager.instance.exchange( - disposers, - getUpdate, - widget.builder, - context, - ); - } -} - -class TaskManager { - TaskManager._(); - - static TaskManager _instance; - - static TaskManager get instance => _instance ??= TaskManager._(); - -// StateSetter _setter;// - GetStateUpdate _setter; - - HashSet _remove; - -// void notify(HashSet _updaters) { // - void notify(HashSet _updaters) { - if (_setter != null) { - if (!_updaters.contains(_setter)) { - _updaters.add(_setter); - _remove.add(() => _updaters.remove(_setter)); - } - } - } - - Widget exchange( - HashSet disposers, -// StateSetter setState, // - GetStateUpdate setState, - Widget Function(BuildContext) builder, - BuildContext context, - ) { - _remove = disposers; - _setter = setState; - final result = builder(context); - _remove = null; - _setter = null; - return result; - } -} diff --git a/packages/get_state_manager/pubspec.yaml b/packages/get_state_manager/pubspec.yaml deleted file mode 100644 index 3b1a5fe5d..000000000 --- a/packages/get_state_manager/pubspec.yaml +++ /dev/null @@ -1,56 +0,0 @@ -name: get_state_manager -description: The most powerful, easier and flexible StateManager to Flutter and GetX™ framework. -version: 3.13.0 -homepage: https://github.com/jonataslaw/getx - -environment: - sdk: ">=2.7.0 <3.0.0" - flutter: ">=1.17.0 <2.0.0" - -dependencies: - flutter: - sdk: flutter - get_rx: ">=3.13.0 <4.0.0" - get_instance: ">=3.13.0 <4.0.0" - get_core: ">=3.13.0 <4.0.0" - -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: - - # 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 diff --git a/packages/get_state_manager/test/get_mixin_state_test.dart b/packages/get_state_manager/test/get_mixin_state_test.dart deleted file mode 100644 index 017e140ce..000000000 --- a/packages/get_state_manager/test/get_mixin_state_test.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_instance/get_instance.dart'; -import 'package:get_state_manager/get_state_manager.dart'; - -void main() { - testWidgets("MixinBuilder smoke test", (tester) async { - await tester.pumpWidget( - MaterialApp( - home: MixinBuilder( - init: Controller(), - builder: (controller) { - return Column( - children: [ - Text( - 'Count: ${controller.counter.value}', - ), - Text( - 'Count2: ${controller.count}', - ), - Text( - 'Double: ${controller.doubleNum.value}', - ), - Text( - 'String: ${controller.string.value}', - ), - Text( - 'List: ${controller.list.length}', - ), - Text( - 'Bool: ${controller.boolean.value}', - ), - Text( - 'Map: ${controller.map.length}', - ), - FlatButton( - child: Text("increment"), - onPressed: () => controller.increment(), - ) - ], - ); - }, - ), - ), - ); - - expect(find.text("Count: 0"), findsOneWidget); - expect(find.text("Count2: 0"), findsOneWidget); - expect(find.text("Double: 0.0"), findsOneWidget); - expect(find.text("String: string"), findsOneWidget); - expect(find.text("Bool: true"), findsOneWidget); - expect(find.text("List: 0"), findsOneWidget); - expect(find.text("Map: 0"), findsOneWidget); - - Controller.to.increment(); - - await tester.pump(); - - expect(find.text("Count: 1"), findsOneWidget); - - await tester.tap(find.text('increment')); - - await tester.pump(); - - expect(find.text("Count: 2"), findsOneWidget); - }); - - testWidgets( - "MixinBuilder with build null", - (tester) async { - expect( - () => MixinBuilder( - init: Controller(), - builder: null, - ), - throwsAssertionError, - ); - }, - ); -} - -class Controller extends GetxController { - static Controller get to => Get.find(); - int count = 0; - RxInt counter = 0.obs; - RxDouble doubleNum = 0.0.obs; - RxString string = "string".obs; - RxList list = [].obs; - RxMap map = {}.obs; - RxBool boolean = true.obs; - - void increment() { - counter.value++; - } - - void increment2() { - count++; - update(); - } -} diff --git a/packages/get_state_manager/test/get_obx_test.dart b/packages/get_state_manager/test/get_obx_test.dart deleted file mode 100644 index 8826835d1..000000000 --- a/packages/get_state_manager/test/get_obx_test.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_instance/get_instance.dart'; -import 'package:get_state_manager/get_state_manager.dart'; - -void main() { - final controller = Get.put(Controller()); - testWidgets("GetxController smoke test", (tester) async { - await tester.pumpWidget( - MaterialApp( - home: Column( - children: [ - Obx( - () => Column(children: [ - Text('Count: ${controller.counter.value}'), - Text('Double: ${controller.doubleNum.value}'), - Text('String: ${controller.string.value}'), - Text('List: ${controller.list.length}'), - Text('Bool: ${controller.boolean.value}'), - Text('Map: ${controller.map.length}'), - FlatButton( - child: Text("increment"), - onPressed: controller.increment, - ), - Obx(() => Text('Obx: ${controller.map.length}')) - ]), - ), - ], - ), - ), - ); - - expect(find.text("Count: 0"), findsOneWidget); - expect(find.text("Double: 0.0"), findsOneWidget); - expect(find.text("String: string"), findsOneWidget); - expect(find.text("Bool: true"), findsOneWidget); - expect(find.text("List: 0"), findsOneWidget); - expect(find.text("Map: 0"), findsOneWidget); - expect(find.text("Obx: 0"), findsOneWidget); - - Controller.to.increment(); - - await tester.pump(); - - expect(find.text("Count: 1"), findsOneWidget); - - await tester.tap(find.text('increment')); - - await tester.pump(); - - expect(find.text("Count: 2"), findsOneWidget); - }); -} - -class Controller extends GetxController { - static Controller get to => Get.find(); - - RxInt counter = 0.obs; - RxDouble doubleNum = 0.0.obs; - RxString string = "string".obs; - RxList list = [].obs; - RxMap map = {}.obs; - RxBool boolean = true.obs; - - void increment() { - counter.value++; - } -} diff --git a/packages/get_state_manager/test/get_rxstate_test.dart b/packages/get_state_manager/test/get_rxstate_test.dart deleted file mode 100644 index 96c695e91..000000000 --- a/packages/get_state_manager/test/get_rxstate_test.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_instance/get_instance.dart'; -import 'package:get_state_manager/get_state_manager.dart'; - -void main() { - Get.lazyPut(() => Controller2()); - testWidgets("GetxController smoke test", (tester) async { - await tester.pumpWidget( - MaterialApp( - home: GetX( - init: Controller(), - builder: (controller) { - return Column( - children: [ - Text( - 'Count: ${controller.counter.value}', - ), - Text( - 'Double: ${controller.doubleNum.value}', - ), - Text( - 'String: ${controller.string.value}', - ), - Text( - 'List: ${controller.list.length}', - ), - Text( - 'Bool: ${controller.boolean.value}', - ), - Text( - 'Map: ${controller.map.length}', - ), - FlatButton( - child: Text("increment"), - onPressed: () => controller.increment(), - ), - GetX(builder: (controller) { - return Text('lazy ${controller.lazy.value}'); - }), - GetX( - init: ControllerNonGlobal(), - global: false, - builder: (controller) { - return Text('single ${controller.nonGlobal.value}'); - }) - ], - ); - }, - ), - ), - ); - - expect(find.text("Count: 0"), findsOneWidget); - expect(find.text("Double: 0.0"), findsOneWidget); - expect(find.text("String: string"), findsOneWidget); - expect(find.text("Bool: true"), findsOneWidget); - expect(find.text("List: 0"), findsOneWidget); - expect(find.text("Map: 0"), findsOneWidget); - - Controller.to.increment(); - - await tester.pump(); - - expect(find.text("Count: 1"), findsOneWidget); - - await tester.tap(find.text('increment')); - - await tester.pump(); - - expect(find.text("Count: 2"), findsOneWidget); - expect(find.text("lazy 0"), findsOneWidget); - expect(find.text("single 0"), findsOneWidget); - }); -} - -class Controller2 extends GetxController { - RxInt lazy = 0.obs; -} - -class ControllerNonGlobal extends GetxController { - RxInt nonGlobal = 0.obs; -} - -class Controller extends GetxController { - static Controller get to => Get.find(); - - RxInt counter = 0.obs; - RxDouble doubleNum = 0.0.obs; - RxString string = "string".obs; - RxList list = [].obs; - RxMap map = {}.obs; - RxBool boolean = true.obs; - - void increment() { - counter.value++; - } -} diff --git a/packages/get_state_manager/test/get_state_test.dart b/packages/get_state_manager/test/get_state_test.dart deleted file mode 100644 index c144187d2..000000000 --- a/packages/get_state_manager/test/get_state_test.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_core/get_core.dart'; -import 'package:get_instance/get_instance.dart'; -import 'package:get_state_manager/get_state_manager.dart'; - -void main() { - Get.lazyPut(() => Controller2()); - testWidgets("GetxController smoke test", (test) async { - await test.pumpWidget( - MaterialApp( - home: GetBuilder( - init: Controller(), - builder: (controller) => Column( - children: [ - Text( - '${controller.counter}', - ), - FlatButton( - child: Text("increment"), - onPressed: () => controller.increment(), - ), - FlatButton( - child: Text("incrementWithId"), - onPressed: () => controller.incrementWithId(), - ), - GetBuilder( - id: '1', - didChangeDependencies: (_) { - // print("didChangeDependencies called"); - }, - builder: (controller) { - return Text('id ${controller.counter}'); - }), - GetBuilder(builder: (controller) { - return Text('lazy ${controller.test}'); - }), - GetBuilder( - init: ControllerNonGlobal(), - global: false, - builder: (controller) { - return Text('single ${controller.nonGlobal}'); - }) - ], - ), - ), - ), - ); - - expect(find.text("0"), findsOneWidget); - - Controller.to.increment(); - - await test.pump(); - - expect(find.text("1"), findsOneWidget); - - await test.tap(find.text('increment')); - - await test.pump(); - - expect(find.text("2"), findsOneWidget); - - await test.tap(find.text('incrementWithId')); - - await test.pump(); - - expect(find.text("id 3"), findsOneWidget); - expect(find.text("lazy 0"), findsOneWidget); - expect(find.text("single 0"), findsOneWidget); - }); - - testWidgets( - "MixinBuilder with build null", - (test) async { - expect( - () => GetBuilder( - init: Controller(), - builder: null, - ), - throwsAssertionError, - ); - }, - ); -} - -class Controller extends GetxController { - static Controller get to => Get.find(); - - int counter = 0; - - void increment() { - counter++; - update(); - } - - void incrementWithId() { - counter++; - update(['1']); - } -} - -class Controller2 extends GetxController { - int test = 0; -} - -class ControllerNonGlobal extends GetxController { - int nonGlobal = 0; -} diff --git a/packages/get_test/.gitignore b/packages/get_test/.gitignore deleted file mode 100644 index 1985397a2..000000000 --- a/packages/get_test/.gitignore +++ /dev/null @@ -1,74 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 diff --git a/packages/get_test/.metadata b/packages/get_test/.metadata deleted file mode 100644 index 3207f67d3..000000000 --- a/packages/get_test/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: a27c242b0eea731317cfec5bbdd9d35452ab3ecb - channel: dev - -project_type: package diff --git a/packages/get_test/CHANGELOG.md b/packages/get_test/CHANGELOG.md deleted file mode 100644 index d66abd29c..000000000 --- a/packages/get_test/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -## [3.13.0] -* Bump to Get 3.13.0 - -## [3.12.3] -* Added compatibility with last GetX - -## [3.12.0] -* Bump to Get 3.12.0 - -## [3.11.0] -- Compatibility with get 3.11.0 - -## [3.10.2] -- Initial release diff --git a/packages/get_test/LICENSE b/packages/get_test/LICENSE deleted file mode 100644 index 2fb920baf..000000000 --- a/packages/get_test/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jonny Borges - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/get_test/README.md b/packages/get_test/README.md deleted file mode 100644 index a40c4d8de..000000000 --- a/packages/get_test/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# get_test - -A new Flutter package. - -## Getting Started - -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/packages/get_test/analysis_options.yaml b/packages/get_test/analysis_options.yaml deleted file mode 100644 index 38018b421..000000000 --- a/packages/get_test/analysis_options.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# Include option is buggy: -# https://github.com/flutter/flutter/issues/62591 -# In case the include issue gets fixed, lines below INCLUDE_FIX -# can be removed - -# include: package:effective_dart/analysis_options.1.2.0.yaml -analyzer: - strong-mode: - implicit-casts: false -linter: - rules: - await_only_futures: true - # This one is desirable, but that's a lot of work for now - public_member_api_docs: false - # Desirable, but would be breaking changes: - avoid_positional_boolean_parameters: false - constant_identifier_names: false - include_file_not_found: false - - # INCLUDE_FIX (copy of effective dart 1.2.0) - # STYLE - camel_case_types: true - camel_case_extensions: true - library_names: true - file_names: true - library_prefixes: true - non_constant_identifier_names: true - directives_ordering: true - lines_longer_than_80_chars: true # avoid - curly_braces_in_flow_control_structures: true - - # DOCUMENTATION - slash_for_doc_comments: true - package_api_docs: true # prefer - #- comment_references # Unused because https://github.com/dart-lang/sdk/issues/36974 - - # USAGE - implementation_imports: true - avoid_relative_lib_imports: true # prefer - prefer_relative_imports: true # prefer - prefer_adjacent_string_concatenation: true - prefer_interpolation_to_compose_strings: true # prefer - unnecessary_brace_in_string_interps: true # avoid - prefer_collection_literals: true - avoid_function_literals_in_foreach_calls: true # avoid - prefer_iterable_whereType: true - prefer_function_declarations_over_variables: true - unnecessary_lambdas: true - prefer_equal_for_default_values: true - avoid_init_to_null: true - unnecessary_getters_setters: true - #- unnecessary_getters # prefer # Disabled pending fix: https://github.com/dart-lang/linter/issues/23 - #- prefer_expression_function_bodies # consider - unnecessary_this: true - prefer_initializing_formals: true - type_init_formals: true - empty_constructor_bodies: true - unnecessary_new: true - unnecessary_const: true - avoid_catches_without_on_clauses: true # avoid - avoid_catching_errors: true - use_rethrow_when_possible: true - - # DESIGN - use_to_and_as_if_applicable: true # prefer - one_member_abstracts: true # avoid - avoid_classes_with_only_static_members: true # avoid - prefer_mixin: true - prefer_final_fields: true # prefer - use_setters_to_change_properties: true - avoid_setters_without_getters: true - avoid_returning_null: true # avoid - avoid_returning_this: true # avoid - type_annotate_public_apis: true # prefer - #- prefer_typing_uninitialized_variables # consider - omit_local_variable_types: true # avoid - avoid_types_on_closure_parameters: true # avoid - avoid_return_types_on_setters: true # avoid - prefer_generic_function_type_aliases: true - avoid_private_typedef_functions: true # prefer - #- use_function_type_syntax_for_parameters # consider - hash_and_equals: true - avoid_equals_and_hash_code_on_mutable_classes: true # avoid - avoid_null_checks_in_equality_operators: true - diff --git a/packages/get_test/example/.gitignore b/packages/get_test/example/.gitignore deleted file mode 100644 index 9d532b18a..000000000 --- a/packages/get_test/example/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -/build/ - -# Web related -lib/generated_plugin_registrant.dart - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json diff --git a/packages/get_test/example/.metadata b/packages/get_test/example/.metadata deleted file mode 100644 index 37ddd46ac..000000000 --- a/packages/get_test/example/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: a27c242b0eea731317cfec5bbdd9d35452ab3ecb - channel: dev - -project_type: app diff --git a/packages/get_test/example/README.md b/packages/get_test/example/README.md deleted file mode 100644 index a13562602..000000000 --- a/packages/get_test/example/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# example - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/packages/get_test/example/lib/main.dart b/packages/get_test/example/lib/main.dart deleted file mode 100644 index 9a7952a5e..000000000 --- a/packages/get_test/example/lib/main.dart +++ /dev/null @@ -1,102 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get/get.dart'; -import 'package:get_test/get_test.dart'; - -void main() { - getTest( - "test description", - widgetTest: (tester) async { - expect('/', Get.currentRoute); - - Get.to(Container()); - expect('/Container', Get.currentRoute); - - Get.to(Scaffold()); - expect('/Scaffold', Get.currentRoute); - - Get.back(); - - expect('/Container', Get.currentRoute); - }, - ); - - testGetX( - 'GetX test', - widget: GetX( - init: Controller(), - builder: (controller) { - return Text("ban:${controller.count}"); - }, - ), - test: (e) { - expect(find.text("ban:0"), findsOneWidget); - expect(e.count.value, 0); - }, - ); - - testGetBuilder( - 'GetBuilder test', - widget: GetBuilder( - init: Controller(), - builder: (controller) { - return Text("ban:${controller.count}"); - }, - ), - test: (e) { - expect(find.text("ban:0"), findsOneWidget); - expect(e.count.value, 0); - }, - ); - - testObx( - 'Obx test', - widget: (controller) => Obx( - () => Text("ban:${controller.count}"), - ), - controller: Controller(), - test: (e) { - expect(find.text("ban:0"), findsOneWidget); - expect(e.count.value, 0); - }, - ); - - testController( - 'Controller test', - (controller) {}, - controller: Controller(), - onInit: (c) { - c.increment(); - print('onInit'); - }, - onReady: (c) { - print('onReady'); - c.increment(); - }, - onClose: (c) { - print('onClose'); - }, - ); -} - -class Controller extends GetxController { - final count = 0.obs; - void increment() => count.value++; - - @override - void onInit() { - print('inittt'); - super.onInit(); - } - - @override - void onReady() { - print('onReady'); - super.onReady(); - } - - void onClose() { - print('onClose'); - } -} diff --git a/packages/get_test/example/pubspec.yaml b/packages/get_test/example/pubspec.yaml deleted file mode 100644 index 61c5c6b76..000000000 --- a/packages/get_test/example/pubspec.yaml +++ /dev/null @@ -1,81 +0,0 @@ -name: example -description: A new Flutter project. - -# The following line prevents the package from being accidentally published to -# pub.dev using `pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0+1 - -environment: - sdk: ">=2.7.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - get: - git: - url: git://github.com/jonataslaw/getx.git - path: getx - ref: master - - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.0 - -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 diff --git a/packages/get_test/lib/get_test.dart b/packages/get_test/lib/get_test.dart deleted file mode 100644 index 3015029c7..000000000 --- a/packages/get_test/lib/get_test.dart +++ /dev/null @@ -1,142 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_navigation/get_navigation.dart'; -import 'package:get_state_manager/get_state_manager.dart'; -import 'package:meta/meta.dart'; -import 'utils/image_test.dart' - if (dart.library.io) 'utils/image_test_utils.dart'; - -class _Wrapper extends StatelessWidget { - final Widget child; - final List getPages; - final String initialRoute; - - const _Wrapper({ - Key key, - this.child = const Scaffold(), - this.getPages, - this.initialRoute, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return GetMaterialApp( - initialRoute: initialRoute, - getPages: getPages ?? [GetPage(name: '/', page: () => child)], - ); - } -} - -@isTest -void testController( - String description, - void Function(T) callback, { - @required T controller, - void Function(T) onInit, - void Function(T) onReady, - void Function(T) onClose, -}) { - test(description, () { - onInit(controller); - SchedulerBinding.instance.addPostFrameCallback((f) { - onReady(controller); - }); - callback(controller); - onClose(controller); - }); -} - -@isTest -Future testGetX( - String description, { - @required GetX widget, - @required void Function(T controller) test, -}) async { - T controller; - testWidgets(description, (tester) async { - provideMockedNetworkImages(() async { - await tester.pumpWidget(GetMaterialApp(home: widget)); - final controller = Get.find(); - test(controller); - }); - }); - return controller; -} - -@isTest -Future testGetBuilder( - String description, { - @required GetBuilder widget, - @required void Function(T controller) test, -}) async { - T controller; - testWidgets(description, (tester) async { - provideMockedNetworkImages(() async { - await tester.pumpWidget(GetMaterialApp(home: widget)); - final controller = Get.find(); - test(controller); - }); - }); - return controller; -} - -@isTest -Future testObx( - String description, { - @required T controller, - @required Obx Function(T controller) widget, - @required void Function(T controller) test, -}) async { - testWidgets(description, (tester) async { - provideMockedNetworkImages(() async { - await tester.pumpWidget(GetMaterialApp(home: widget(controller))); - test(controller); - }); - }); - return controller; -} - -@isTest -void getTest( - String description, { - @required WidgetTesterCallback widgetTest, - Widget wrapper, - List getPages, - String initialRoute = '/', - bool skip = false, - Timeout timeout, - Duration initialTimeout, - bool semanticsEnabled = true, - TestVariant variant = const DefaultTestVariant(), - dynamic tags, -}) { - assert(variant != null); - assert(variant.values.isNotEmpty); - - if (wrapper == null) { - if (getPages != null) { - wrapper = _Wrapper(getPages: getPages, initialRoute: initialRoute); - } else if (initialRoute != null && getPages != null) { - wrapper = _Wrapper(initialRoute: initialRoute, getPages: getPages); - } else { - wrapper = _Wrapper(); - } - } - - testWidgets( - description, - (tester) async { - provideMockedNetworkImages(() async { - await tester.pumpWidget(wrapper); - widgetTest(tester); - }); - }, - skip: skip, - timeout: timeout, - initialTimeout: initialTimeout, - semanticsEnabled: semanticsEnabled, - variant: variant, - tags: tags, - ); -} diff --git a/packages/get_test/lib/utils/image_test.dart b/packages/get_test/lib/utils/image_test.dart deleted file mode 100644 index d954b405f..000000000 --- a/packages/get_test/lib/utils/image_test.dart +++ /dev/null @@ -1,3 +0,0 @@ -R provideMockedNetworkImages(R body()) { - return body(); -} diff --git a/packages/get_test/lib/utils/image_test_utils.dart b/packages/get_test/lib/utils/image_test_utils.dart deleted file mode 100644 index 339f52c54..000000000 --- a/packages/get_test/lib/utils/image_test_utils.dart +++ /dev/null @@ -1,181 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'package:mockito/mockito.dart'; - -/// Copyright 2018 Iiro Krankka -/// Redistribution and use in source and binary forms, with or without -/// modification, are permitted provided that the following conditions are met: -/// 1. Redistributions of source code must retain the above copyright notice, -/// this list of conditions and the following disclaimer. -/// 2. Redistributions in binary form must reproduce the above copyright -/// notice, this list of conditions and the following disclaimer in the -/// documentation and/or other materials provided with the distribution. -/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -/// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -/// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -/// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -/// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -/// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -/// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -/// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -/// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -/// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -/// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/// Runs [body] in a fresh [Zone] that provides mocked responses for -/// [Image.network] widgets. -/// -/// Behind the scenes, this creates a mocked HTTP client that responds -/// with mocked -/// image data to all HTTP GET requests. -/// -/// This is a workaround needed for widget tests that use network images. -/// Without -/// the mocked HTTP client, any widget tests that pump a widget tree containing -/// [Image.network] widgets will crash. -/// -/// By default, the mocked HTTP client will respond with [_transparentImage]. If -/// provided, it will use [imageBytes] instead. -/// -/// Example usage in a test case: -/// -/// ``` -/// void main() { -/// testWidgets('should not crash', (WidgetTester tester) async { -/// provideMockedNetworkImages(() async { -/// await tester.pumpWidget( -/// MaterialApp( -/// home: Image.network('https://example.com/image.png'), -/// ), -/// ); -/// }); -/// }); -/// } -/// ``` -/// -/// Note that you'll want to add this package to the dev_dependencies instead of -/// the regular dependencies block on your pubspec.yaml. -/// -/// For more context about [Image.network] widgets failing in widget tests, see -/// these issues: -/// -/// * https://github.com/flutter/flutter/issues/13433 -/// * https://github.com/flutter/flutter_markdown/pull/17 -/// -/// The underlying code is taken from the Flutter repo: -/// https://github.com/flutter/flutter/blob/master/dev/manual_tests/test/mock_image_http.dart -R provideMockedNetworkImages(R body(), - {List imageBytes = _transparentImage}) { - return HttpOverrides.runZoned( - body, - createHttpClient: (_) => _createMockImageHttpClient(_, imageBytes), - ); -} - -class MockHttpClient extends Mock implements HttpClient {} - -class MockHttpClientRequest extends Mock implements HttpClientRequest {} - -class MockHttpClientResponse extends Mock implements HttpClientResponse {} - -class MockHttpHeaders extends Mock implements HttpHeaders {} - -// Returns a mock HTTP client that responds with an image to all requests. -MockHttpClient _createMockImageHttpClient( - SecurityContext _, List imageBytes) { - final client = MockHttpClient(); - final request = MockHttpClientRequest(); - final response = MockHttpClientResponse(); - final headers = MockHttpHeaders(); - - when(client.getUrl(any)) - .thenAnswer((_) => Future.value(request)); - when(request.headers).thenReturn(headers); - when(request.close()) - .thenAnswer((_) => Future.value(response)); - when(response.contentLength).thenReturn(_transparentImage.length); - when(response.statusCode).thenReturn(HttpStatus.ok); - when(response.listen(any)).thenAnswer((invocation) { - final onData = - invocation.positionalArguments[0] as void Function(List); - final onDone = invocation.namedArguments[#onDone] as void Function(); - final onError = invocation.namedArguments[#onError] as void Function(Object, - [StackTrace]); - final cancelOnError = invocation.namedArguments[#cancelOnError] as bool; - - return Stream>.fromIterable(>[imageBytes]).listen( - onData, - onDone: onDone, - onError: onError, - cancelOnError: cancelOnError); - }); - - return client; -} - -const List _transparentImage = [ - 0x89, - 0x50, - 0x4E, - 0x47, - 0x0D, - 0x0A, - 0x1A, - 0x0A, - 0x00, - 0x00, - 0x00, - 0x0D, - 0x49, - 0x48, - 0x44, - 0x52, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - 0x00, - 0x00, - 0x01, - 0x08, - 0x06, - 0x00, - 0x00, - 0x00, - 0x1F, - 0x15, - 0xC4, - 0x89, - 0x00, - 0x00, - 0x00, - 0x0A, - 0x49, - 0x44, - 0x41, - 0x54, - 0x78, - 0x9C, - 0x63, - 0x00, - 0x01, - 0x00, - 0x00, - 0x05, - 0x00, - 0x01, - 0x0D, - 0x0A, - 0x2D, - 0xB4, - 0x00, - 0x00, - 0x00, - 0x00, - 0x49, - 0x45, - 0x4E, - 0x44, - 0xAE, -]; diff --git a/packages/get_test/pubspec.yaml b/packages/get_test/pubspec.yaml deleted file mode 100644 index d8c74b696..000000000 --- a/packages/get_test/pubspec.yaml +++ /dev/null @@ -1,57 +0,0 @@ -name: get_test -description: A package that facilitates the creation of tests for applications built with GetX -version: 3.13.0 -homepage: https://github.com/jonataslaw/getx - -environment: - sdk: ">=2.7.0 <3.0.0" - flutter: ">=1.17.0 <2.0.0" - -dependencies: - flutter: - sdk: flutter - mockito: ">=3.0.0 <5.0.0" - get_navigation: ">=3.13.0 <4.0.0" - get_state_manager: ">=3.13.0 <4.0.0" - meta: ">=1.1.0 <2.0.0" - flutter_test: - sdk: flutter - - - - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - - - - # 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 diff --git a/packages/get_utils/.gitignore b/packages/get_utils/.gitignore deleted file mode 100644 index 1985397a2..000000000 --- a/packages/get_utils/.gitignore +++ /dev/null @@ -1,74 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 diff --git a/packages/get_utils/.metadata b/packages/get_utils/.metadata deleted file mode 100644 index 3207f67d3..000000000 --- a/packages/get_utils/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: a27c242b0eea731317cfec5bbdd9d35452ab3ecb - channel: dev - -project_type: package diff --git a/packages/get_utils/CHANGELOG.md b/packages/get_utils/CHANGELOG.md deleted file mode 100644 index 344af7595..000000000 --- a/packages/get_utils/CHANGELOG.md +++ /dev/null @@ -1,11 +0,0 @@ -## [3.13.0] -* Bump to Get 3.13.0 - -## [3.12.0] -* Bump to Get 3.12.0 -* Improve capitalizeFirst method - - -## [3.10.2] - -- Initial release diff --git a/packages/get_utils/LICENSE b/packages/get_utils/LICENSE deleted file mode 100644 index 2fb920baf..000000000 --- a/packages/get_utils/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jonny Borges - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/get_utils/README.md b/packages/get_utils/README.md deleted file mode 100644 index 3bfa62407..000000000 --- a/packages/get_utils/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# get_utils - -A new Flutter package project. - -## Getting Started - -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/packages/get_utils/analysis_options.yaml b/packages/get_utils/analysis_options.yaml deleted file mode 100644 index 38018b421..000000000 --- a/packages/get_utils/analysis_options.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# Include option is buggy: -# https://github.com/flutter/flutter/issues/62591 -# In case the include issue gets fixed, lines below INCLUDE_FIX -# can be removed - -# include: package:effective_dart/analysis_options.1.2.0.yaml -analyzer: - strong-mode: - implicit-casts: false -linter: - rules: - await_only_futures: true - # This one is desirable, but that's a lot of work for now - public_member_api_docs: false - # Desirable, but would be breaking changes: - avoid_positional_boolean_parameters: false - constant_identifier_names: false - include_file_not_found: false - - # INCLUDE_FIX (copy of effective dart 1.2.0) - # STYLE - camel_case_types: true - camel_case_extensions: true - library_names: true - file_names: true - library_prefixes: true - non_constant_identifier_names: true - directives_ordering: true - lines_longer_than_80_chars: true # avoid - curly_braces_in_flow_control_structures: true - - # DOCUMENTATION - slash_for_doc_comments: true - package_api_docs: true # prefer - #- comment_references # Unused because https://github.com/dart-lang/sdk/issues/36974 - - # USAGE - implementation_imports: true - avoid_relative_lib_imports: true # prefer - prefer_relative_imports: true # prefer - prefer_adjacent_string_concatenation: true - prefer_interpolation_to_compose_strings: true # prefer - unnecessary_brace_in_string_interps: true # avoid - prefer_collection_literals: true - avoid_function_literals_in_foreach_calls: true # avoid - prefer_iterable_whereType: true - prefer_function_declarations_over_variables: true - unnecessary_lambdas: true - prefer_equal_for_default_values: true - avoid_init_to_null: true - unnecessary_getters_setters: true - #- unnecessary_getters # prefer # Disabled pending fix: https://github.com/dart-lang/linter/issues/23 - #- prefer_expression_function_bodies # consider - unnecessary_this: true - prefer_initializing_formals: true - type_init_formals: true - empty_constructor_bodies: true - unnecessary_new: true - unnecessary_const: true - avoid_catches_without_on_clauses: true # avoid - avoid_catching_errors: true - use_rethrow_when_possible: true - - # DESIGN - use_to_and_as_if_applicable: true # prefer - one_member_abstracts: true # avoid - avoid_classes_with_only_static_members: true # avoid - prefer_mixin: true - prefer_final_fields: true # prefer - use_setters_to_change_properties: true - avoid_setters_without_getters: true - avoid_returning_null: true # avoid - avoid_returning_this: true # avoid - type_annotate_public_apis: true # prefer - #- prefer_typing_uninitialized_variables # consider - omit_local_variable_types: true # avoid - avoid_types_on_closure_parameters: true # avoid - avoid_return_types_on_setters: true # avoid - prefer_generic_function_type_aliases: true - avoid_private_typedef_functions: true # prefer - #- use_function_type_syntax_for_parameters # consider - hash_and_equals: true - avoid_equals_and_hash_code_on_mutable_classes: true # avoid - avoid_null_checks_in_equality_operators: true - diff --git a/packages/get_utils/lib/get_utils.dart b/packages/get_utils/lib/get_utils.dart deleted file mode 100644 index 15bc8f876..000000000 --- a/packages/get_utils/lib/get_utils.dart +++ /dev/null @@ -1,4 +0,0 @@ -export 'src/extensions/export.dart'; -export 'src/get_utils/get_utils.dart'; -export 'src/platform/platform.dart'; -export 'src/queue/get_queue.dart'; diff --git a/packages/get_utils/lib/src/extensions/context_extensions.dart b/packages/get_utils/lib/src/extensions/context_extensions.dart deleted file mode 100644 index 3762d22eb..000000000 --- a/packages/get_utils/lib/src/extensions/context_extensions.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; - -import '../platform/platform.dart'; - -extension ContextExtensionss on BuildContext { - /// The same of [MediaQuery.of(context).size] - Size get mediaQuerySize => MediaQuery.of(this).size; - - /// The same of [MediaQuery.of(context).size.height] - /// Note: updates when you rezise your screen (like on a browser or - /// desktop window) - double get height => mediaQuerySize.height; - - /// The same of [MediaQuery.of(context).size.width] - /// Note: updates when you rezise your screen (like on a browser or - /// desktop window) - double get width => mediaQuerySize.width; - - /// Gives you the power to get a portion of the height. - /// Useful for responsive applications. - /// - /// [dividedBy] is for when you want to have a portion of the value you - /// would get like for example: if you want a value that represents a third - /// of the screen you can set it to 3, and you will get a third of the height - /// - /// [reducedBy] is a percentage value of how much of the height you want - /// if you for example want 46% of the height, then you reduce it by 56%. - double heightTransformer({double dividedBy = 1, double reducedBy = 0.0}) { - return (mediaQuerySize.height - - ((mediaQuerySize.height / 100) * reducedBy)) / - dividedBy; - } - - /// Gives you the power to get a portion of the width. - /// Useful for responsive applications. - /// - /// [dividedBy] is for when you want to have a portion of the value you - /// would get like for example: if you want a value that represents a third - /// of the screen you can set it to 3, and you will get a third of the width - /// - /// [reducedBy] is a percentage value of how much of the width you want - /// if you for example want 46% of the width, then you reduce it by 56%. - double widthTransformer({double dividedBy = 1, double reducedBy = 0.0}) { - return (mediaQuerySize.width - ((mediaQuerySize.width / 100) * reducedBy)) / - dividedBy; - } - - /// Divide the height proportionally by the given value - double ratio({ - double dividedBy = 1, - double reducedByW = 0.0, - double reducedByH = 0.0, - }) { - return heightTransformer(dividedBy: dividedBy, reducedBy: reducedByH) / - widthTransformer(dividedBy: dividedBy, reducedBy: reducedByW); - } - - /// similar to [MediaQuery.of(context).padding] - ThemeData get theme => Theme.of(this); - - /// similar to [MediaQuery.of(context).padding] - TextTheme get textTheme => Theme.of(this).textTheme; - - /// similar to [MediaQuery.of(context).padding] - EdgeInsets get mediaQueryPadding => MediaQuery.of(this).padding; - - /// similar to [MediaQuery.of(context).padding] - MediaQueryData get mediaQuery => MediaQuery.of(this); - - /// similar to [MediaQuery.of(context).viewPadding] - EdgeInsets get mediaQueryViewPadding => MediaQuery.of(this).viewPadding; - - /// similar to [MediaQuery.of(context).viewInsets] - EdgeInsets get mediaQueryViewInsets => MediaQuery.of(this).viewInsets; - - /// similar to [MediaQuery.of(context).orientation] - Orientation get orientation => MediaQuery.of(this).orientation; - - /// check if device is on landscape mode - bool get isLandscape => orientation == Orientation.landscape; - - /// check if device is on portrait mode - bool get isPortrait => orientation == Orientation.portrait; - - /// similar to [MediaQuery.of(this).devicePixelRatio] - double get devicePixelRatio => MediaQuery.of(this).devicePixelRatio; - - /// similar to [MediaQuery.of(this).textScaleFactor] - double get textScaleFactor => MediaQuery.of(this).textScaleFactor; - - /// get the shortestSide from screen - double get mediaQueryShortestSide => mediaQuerySize.shortestSide; - - /// True if width be larger than 800 - bool get showNavbar => (width > 800); - - /// True if the shortestSide is smaller than 600p - bool get isPhone => (mediaQueryShortestSide < 600); - - /// True if the shortestSide is largest than 600p - bool get isSmallTablet => (mediaQueryShortestSide >= 600); - - /// True if the shortestSide is largest than 720p - bool get isLargeTablet => (mediaQueryShortestSide >= 720); - - /// True if the current device is Tablet - bool get isTablet => isSmallTablet || isLargeTablet; - - /// Returns a specific value according to the screen size - /// if the device width is higher than or equal to 1200 return - /// [desktop] value. if the device width is higher than or equal to 600 - /// and less than 1200 return [tablet] value. - /// if the device width is less than 300 return [watch] value. - /// in other cases return [mobile] value. - T responsiveValue({ - T mobile, - T tablet, - T desktop, - T watch, - }) { - var deviceWidth = mediaQuerySize.shortestSide; - if (GetPlatform.isDesktop) { - deviceWidth = mediaQuerySize.width; - } - if (deviceWidth >= 1200 && desktop != null) return desktop; - if (deviceWidth >= 600 && tablet != null) return tablet; - if (deviceWidth < 300 && watch != null) return watch; - return mobile; - } -} diff --git a/packages/get_utils/lib/src/extensions/double_extensions.dart b/packages/get_utils/lib/src/extensions/double_extensions.dart deleted file mode 100644 index 03ffa36dd..000000000 --- a/packages/get_utils/lib/src/extensions/double_extensions.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'dart:math'; - -extension Precision on double { - double toPrecision(int fractionDigits) { - var mod = pow(10, fractionDigits.toDouble()).toDouble(); - return ((this * mod).round().toDouble() / mod); - } -} diff --git a/packages/get_utils/lib/src/extensions/duration_extensions.dart b/packages/get_utils/lib/src/extensions/duration_extensions.dart deleted file mode 100644 index 6af77d305..000000000 --- a/packages/get_utils/lib/src/extensions/duration_extensions.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'dart:async'; - -/// Duration utilities. -extension GetDurationUtils on Duration { - /// Utility to delay some callback (or code execution). - /// - /// Sample: - /// ``` - /// void main() async { - /// final _delay = 3.seconds; - /// print('+ wait $_delay'); - /// await _delay.delay(); - /// print('- finish wait $_delay'); - /// print('+ callback in 700ms'); - /// await 0.7.seconds.delay(() { - /// } - ///``` - Future delay([FutureOr callback()]) async => Future.delayed(this, callback); -} diff --git a/packages/get_utils/lib/src/extensions/dynamic_extensions.dart b/packages/get_utils/lib/src/extensions/dynamic_extensions.dart deleted file mode 100644 index 7cb9c36d4..000000000 --- a/packages/get_utils/lib/src/extensions/dynamic_extensions.dart +++ /dev/null @@ -1,18 +0,0 @@ -import '../get_utils/get_utils.dart'; - -extension GetDynamicUtils on dynamic { - bool get isNull => GetUtils.isNull(this); - - bool get isNullOrBlank => GetUtils.isNullOrBlank(this); - - void printError( - {String info = '', Function logFunction = GetUtils.printFunction}) => - // ignore: unnecessary_this - logFunction('Error: ${this.runtimeType}', this, info, isError: true); - - void printInfo( - {String info = '', - Function printFunction = GetUtils.printFunction}) => - // ignore: unnecessary_this - printFunction('Info: ${this.runtimeType}', this, info); -} diff --git a/packages/get_utils/lib/src/extensions/export.dart b/packages/get_utils/lib/src/extensions/export.dart deleted file mode 100644 index 536f4ba10..000000000 --- a/packages/get_utils/lib/src/extensions/export.dart +++ /dev/null @@ -1,8 +0,0 @@ -export 'context_extensions.dart'; -export 'double_extensions.dart'; -export 'duration_extensions.dart'; -export 'dynamic_extensions.dart'; -export 'internacionalization.dart'; -export 'num_extensions.dart'; -export 'string_extensions.dart'; -export 'widget_extensions.dart'; diff --git a/packages/get_utils/lib/src/extensions/internacionalization.dart b/packages/get_utils/lib/src/extensions/internacionalization.dart deleted file mode 100644 index 4ee9dc55e..000000000 --- a/packages/get_utils/lib/src/extensions/internacionalization.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'dart:ui'; -import 'package:get_core/get_core.dart'; - -extension Trans on String { - String get tr { - // Returns the key if locale is null. - if (Get.locale?.languageCode == null) return this; - - // Checks whether the language code and country code are present, and - // whether the key is also present. - if (Get.translations.containsKey( - "${Get.locale.languageCode}_${Get.locale.countryCode}") && - Get.translations["${Get.locale.languageCode}_${Get.locale.countryCode}"] - .containsKey(this)) { - return Get.translations[ - "${Get.locale.languageCode}_${Get.locale.countryCode}"][this]; - - // Checks if there is a callback language in the absence of the specific - // country, and if it contains that key. - } else if (Get.translations.containsKey(Get.locale.languageCode) && - Get.translations[Get.locale.languageCode].containsKey(this)) { - return Get.translations[Get.locale.languageCode][this]; - // If there is no corresponding language or corresponding key, return - // the key. - } else if (Get.fallbackLocale != null) { - final fallback = Get.fallbackLocale; - final key = "${fallback.languageCode}_${fallback.countryCode}"; - - if (Get.translations.containsKey(key) && - Get.translations[key].containsKey(this)) { - return Get.translations[key][this]; - } - if (Get.translations.containsKey(fallback.languageCode) && - Get.translations[fallback.languageCode].containsKey(this)) { - return Get.translations[fallback.languageCode][this]; - } - return this; - } else { - return this; - } - } - - String trArgs([List args]) { - var key = tr; - if (args != null) { - for (final arg in args) { - key = key.replaceFirst(RegExp(r'%s'), arg.toString()); - } - } - return key; - } -} - -class _IntlHost { - Locale locale; - - Locale fallbackLocale; - - Map> translations = {}; -} - -extension LocalesIntl on GetInterface { - static final _intlHost = _IntlHost(); - - Locale get locale => _intlHost.locale; - - Locale get fallbackLocale => _intlHost.fallbackLocale; - - set locale(Locale newLocale) => _intlHost.locale = newLocale; - - set fallbackLocale(Locale newLocale) => _intlHost.fallbackLocale = newLocale; - - Map> get translations => _intlHost.translations; - - void addTranslations(Map> tr) { - translations.addAll(tr); - } - - void appendTranslations(Map> tr) { - tr.forEach((key, map) { - if (translations.containsKey(key)) { - translations[key].addAll(map); - } else { - translations[key] = map; - } - }); - } -} diff --git a/packages/get_utils/lib/src/extensions/num_extensions.dart b/packages/get_utils/lib/src/extensions/num_extensions.dart deleted file mode 100644 index b319a60f4..000000000 --- a/packages/get_utils/lib/src/extensions/num_extensions.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'dart:async'; -import '../get_utils/get_utils.dart'; - -extension GetNumUtils on num { - bool isLowerThan(num b) => GetUtils.isLowerThan(this, b); - - bool isGreaterThan(num b) => GetUtils.isGreaterThan(this, b); - - bool isEqual(num b) => GetUtils.isEqual(this, b); - - /// Utility to delay some callback (or code execution). - /// TODO: Add a separated implementation of delay() with the ability - /// to stop it. - /// - /// Sample: - /// ``` - /// void main() async { - /// print('+ wait for 2 seconds'); - /// await 2.delay(); - /// print('- 2 seconds completed'); - /// print('+ callback in 1.2sec'); - /// 1.delay(() => print('- 1.2sec callback called')); - /// print('currently running callback 1.2sec'); - /// } - ///``` - Future delay([FutureOr callback()]) async => Future.delayed( - Duration(milliseconds: (this * 1000).round()), - callback, - ); - - /// Easy way to make Durations from numbers. - /// - /// Sample: - /// ``` - /// print(1.seconds + 200.milliseconds); - /// print(1.hours + 30.minutes); - /// print(1.5.hours); - ///``` - Duration get milliseconds => Duration(microseconds: (this * 1000).round()); - - Duration get seconds => Duration(milliseconds: (this * 1000).round()); - - Duration get minutes => - Duration(seconds: (this * Duration.secondsPerMinute).round()); - - Duration get hours => - Duration(minutes: (this * Duration.minutesPerHour).round()); - - Duration get days => Duration(hours: (this * Duration.hoursPerDay).round()); - -//final _delayMaps = {}; -// TODO: create a proper Future and control the Timer. -// Future delay([double seconds = 0, VoidCallback callback]) async { -// final ms = (seconds * 1000).round(); -// return Future.delayed(Duration(milliseconds: ms), callback); -// return _delayMaps[callback]; -// } -//killDelay(VoidCallback callback) { -// if (_delayMaps.containsKey(callback)) { -// _delayMaps[callback]?.timeout(Duration.zero, onTimeout: () { -// print('callbacl eliminado!'); -// }); -// _delayMaps.remove(callback); -// } -//} - -} diff --git a/packages/get_utils/lib/src/extensions/string_extensions.dart b/packages/get_utils/lib/src/extensions/string_extensions.dart deleted file mode 100644 index a9db6f771..000000000 --- a/packages/get_utils/lib/src/extensions/string_extensions.dart +++ /dev/null @@ -1,82 +0,0 @@ -import '../get_utils/get_utils.dart'; - -extension GetStringUtils on String { - bool get isNum => GetUtils.isNum(this); - - bool get isNumericOnly => GetUtils.isNumericOnly(this); - - bool get isAlphabetOnly => GetUtils.isAlphabetOnly(this); - - bool get isBool => GetUtils.isBool(this); - - bool get isVectorFileName => GetUtils.isVector(this); - - bool get isImageFileName => GetUtils.isImage(this); - - bool get isAudioFileName => GetUtils.isAudio(this); - - bool get isVideoFileName => GetUtils.isVideo(this); - - bool get isTxtFileName => GetUtils.isTxt(this); - - bool get isDocumentFileName => GetUtils.isWord(this); - - bool get isExcelFileName => GetUtils.isExcel(this); - - bool get isPPTFileName => GetUtils.isPPT(this); - - bool get isAPKFileName => GetUtils.isAPK(this); - - bool get isPDFFileName => GetUtils.isPDF(this); - - bool get isHTMLFileName => GetUtils.isHTML(this); - - bool get isURL => GetUtils.isURL(this); - - bool get isEmail => GetUtils.isEmail(this); - - bool get isPhoneNumber => GetUtils.isPhoneNumber(this); - - bool get isDateTime => GetUtils.isDateTime(this); - - bool get isMD5 => GetUtils.isMD5(this); - - bool get isSHA1 => GetUtils.isSHA1(this); - - bool get isSHA256 => GetUtils.isSHA256(this); - - bool get isBinary => GetUtils.isBinary(this); - - bool get isIPv4 => GetUtils.isIPv4(this); - - bool get isIPv6 => GetUtils.isIPv6(this); - - bool get isHexadecimal => GetUtils.isHexadecimal(this); - - bool get isPalindrom => GetUtils.isPalindrom(this); - - bool get isPassport => GetUtils.isPassport(this); - - bool get isCurrency => GetUtils.isCurrency(this); - - bool get isCpf => GetUtils.isCpf(this); - - bool get isCnpj => GetUtils.isCnpj(this); - - bool isCaseInsensitiveContains(String b) => - GetUtils.isCaseInsensitiveContains(this, b); - - bool isCaseInsensitiveContainsAny(String b) => - GetUtils.isCaseInsensitiveContainsAny(this, b); - - String get capitalize => GetUtils.capitalize(this); - - String get capitalizeFirst => GetUtils.capitalizeFirst(this); - - String get removeAllWhitespace => GetUtils.removeAllWhitespace(this); - - String get camelCase => GetUtils.camelCase(this); - - String numericOnly({bool firstWordOnly = false}) => - GetUtils.numericOnly(this, firstWordOnly: firstWordOnly); -} diff --git a/packages/get_utils/lib/src/extensions/widget_extensions.dart b/packages/get_utils/lib/src/extensions/widget_extensions.dart deleted file mode 100644 index 3e4b6d3d8..000000000 --- a/packages/get_utils/lib/src/extensions/widget_extensions.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/widgets.dart'; - -/// add Padding Property to widget -extension WidgetPaddingX on Widget { - Widget paddingAll(double padding) => - Padding(padding: EdgeInsets.all(padding), child: this); - - Widget paddingSymmetric({double horizontal = 0.0, double vertical = 0.0}) => - Padding( - padding: - EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical), - child: this); - - Widget paddingOnly({ - double left = 0.0, - double top = 0.0, - double right = 0.0, - double bottom = 0.0, - }) => - Padding( - padding: EdgeInsets.only( - top: top, left: left, right: right, bottom: bottom), - child: this); - - Widget get paddingZero => Padding(padding: EdgeInsets.zero, child: this); -} - -/// Add margin property to widget -extension WidgetMarginX on Widget { - Widget marginAll(double margin) => - Container(margin: EdgeInsets.all(margin), child: this); - - Widget marginSymmetric({double horizontal = 0.0, double vertical = 0.0}) => - Container( - margin: - EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical), - child: this); - - Widget marginOnly({ - double left = 0.0, - double top = 0.0, - double right = 0.0, - double bottom = 0.0, - }) => - Container( - margin: EdgeInsets.only( - top: top, left: left, right: right, bottom: bottom), - child: this); - - Widget get marginZero => Container(margin: EdgeInsets.zero, child: this); -} - -/// Allows you to insert widgets inside a CustomScrollView -extension WidgetSliverBoxX on Widget { - Widget get sliverBox => SliverToBoxAdapter(child: this); -} diff --git a/packages/get_utils/lib/src/get_utils/get_utils.dart b/packages/get_utils/lib/src/get_utils/get_utils.dart deleted file mode 100644 index 96561cc73..000000000 --- a/packages/get_utils/lib/src/get_utils/get_utils.dart +++ /dev/null @@ -1,581 +0,0 @@ -import 'package:get_core/get_core.dart'; - -/// Returns whether a dynamic value PROBABLY -/// has the isEmpty getter/method by checking -/// standard dart types that contains it. -/// -/// This is here to for the 'DRY' -bool _hasIsEmpty(dynamic value) { - return value is Iterable || value is String || value is Map; -} - -/// Returns whether a dynamic value PROBABLY -/// has the length getter/method by checking -/// standard dart types that contains it. -/// -/// This is here to for the 'DRY' -bool _hasLength(dynamic value) { - return value is Iterable || value is String || value is Map; -} - -/// Obtains a length of a dynamic value -/// by previously validating it's type -/// -/// Note: if [value] is double/int -/// it will be taking the .toString -/// length of the given value. -/// -/// Note 2: **this may return null!** -/// -/// Note 3: null [value] returns null. -int _obtainDynamicLength(dynamic value) { - if (value == null) { - // ignore: avoid_returning_null - return null; - } - - if (_hasLength(value)) { - return value.length as int; - } - - if (value is int) { - return value.toString().length; - } - - if (value is double) { - return value.toString().replaceAll('.', '').length; - } - - // ignore: avoid_returning_null - return null; -} - -class GetUtils { - GetUtils._(); - - /// Checks if data is null. - static bool isNull(dynamic value) => value == null; - - /// In dart2js (in flutter v1.17) a var by default is undefined. - /// *Use this only if you are in version <- 1.17*. - /// So we assure the null type in json convertions to avoid the - /// "value":value==null?null:value; someVar.nil will force the null type - /// if the var is null or undefined. - /// `nil` taken from ObjC just to have a shorter sintax. - static dynamic nil(dynamic s) => s == null ? null : s; - - /// Checks if data is null or blank (empty or only contains whitespace). - static bool isNullOrBlank(dynamic value) { - if (isNull(value)) { - return true; - } - - if (value is String) { - return value.toString().trim().isEmpty; - } - - // Pretty sure that isNullOrBlank should't be validating - // iterables... but I'm going to keep this for compatibility. - return _hasIsEmpty(value) ? value.isEmpty as bool : false; - } - - /// Checks if string is int or double. - static bool isNum(String value) { - if (isNull(value)) { - return false; - } - - return num.tryParse(value) is num; - } - - /// Checks if string consist only numeric. - /// Numeric only doesn't accepting "." which double data type have - static bool isNumericOnly(String s) => hasMatch(s, r'^\d+$'); - - /// Checks if string consist only Alphabet. (No Whitespace) - static bool isAlphabetOnly(String s) => hasMatch(s, r'^[a-zA-Z]+$'); - - /// Checks if string is boolean. - static bool isBool(String value) { - if (isNull(value)) { - return false; - } - - return (value == 'true' || value == 'false'); - } - - /// Checks if string is an video file. - static bool isVideo(String filePath) { - var ext = filePath.toLowerCase(); - - return ext.endsWith(".mp4") || - ext.endsWith(".avi") || - ext.endsWith(".wmv") || - ext.endsWith(".rmvb") || - ext.endsWith(".mpg") || - ext.endsWith(".mpeg") || - ext.endsWith(".3gp"); - } - - /// Checks if string is an image file. - static bool isImage(String filePath) { - final ext = filePath.toLowerCase(); - - return ext.endsWith(".jpg") || - ext.endsWith(".jpeg") || - ext.endsWith(".png") || - ext.endsWith(".gif") || - ext.endsWith(".bmp"); - } - - /// Checks if string is an audio file. - static bool isAudio(String filePath) { - final ext = filePath.toLowerCase(); - - return ext.endsWith(".mp3") || - ext.endsWith(".wav") || - ext.endsWith(".wma") || - ext.endsWith(".amr") || - ext.endsWith(".ogg"); - } - - /// Checks if string is an powerpoint file. - static bool isPPT(String filePath) { - final ext = filePath.toLowerCase(); - - return ext.endsWith(".ppt") || ext.endsWith(".pptx"); - } - - /// Checks if string is an word file. - static bool isWord(String filePath) { - final ext = filePath.toLowerCase(); - - return ext.endsWith(".doc") || ext.endsWith(".docx"); - } - - /// Checks if string is an excel file. - static bool isExcel(String filePath) { - final ext = filePath.toLowerCase(); - - return ext.endsWith(".xls") || ext.endsWith(".xlsx"); - } - - /// Checks if string is an apk file. - static bool isAPK(String filePath) { - return filePath.toLowerCase().endsWith(".apk"); - } - - /// Checks if string is an pdf file. - static bool isPDF(String filePath) { - return filePath.toLowerCase().endsWith(".pdf"); - } - - /// Checks if string is an txt file. - static bool isTxt(String filePath) { - return filePath.toLowerCase().endsWith(".txt"); - } - - /// Checks if string is an chm file. - static bool isChm(String filePath) { - return filePath.toLowerCase().endsWith(".chm"); - } - - /// Checks if string is a vector file. - static bool isVector(String filePath) { - return filePath.toLowerCase().endsWith(".svg"); - } - - /// Checks if string is an html file. - static bool isHTML(String filePath) { - return filePath.toLowerCase().endsWith(".html"); - } - - /// Checks if string is a valid username. - static bool isUsername(String s) => - hasMatch(s, r'^[a-zA-Z0-9][a-zA-Z0-9_.]+[a-zA-Z0-9]$'); - - /// Checks if string is URL. - static bool isURL(String s) => hasMatch(s, - r"^((((H|h)(T|t)|(F|f))(T|t)(P|p)((S|s)?))\://)?(www.|[a-zA-Z0-9].)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,6}(\:[0-9]{1,5})*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$"); - - /// Checks if string is email. - static bool isEmail(String s) => hasMatch(s, - r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'); - - /// Checks if string is phone number. - static bool isPhoneNumber(String s) => hasMatch(s, - r'^(0|\+|(\+[0-9]{2,4}|\(\+?[0-9]{2,4}\)) ?)([0-9]*|\d{2,4}-\d{2,4}(-\d{2,4})?)$'); - - /// Checks if string is DateTime (UTC or Iso8601). - static bool isDateTime(String s) => - hasMatch(s, r'^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}.\d{3}Z?$'); - - /// Checks if string is MD5 hash. - static bool isMD5(String s) => hasMatch(s, r'^[a-f0-9]{32}$'); - - /// Checks if string is SHA1 hash. - static bool isSHA1(String s) => - hasMatch(s, r'(([A-Fa-f0-9]{2}\:){19}[A-Fa-f0-9]{2}|[A-Fa-f0-9]{40})'); - - /// Checks if string is SHA256 hash. - static bool isSHA256(String s) => - hasMatch(s, r'([A-Fa-f0-9]{2}\:){31}[A-Fa-f0-9]{2}|[A-Fa-f0-9]{64}'); - - /// Checks if string is SSN (Social Security Number). - static bool isSSN(String s) => hasMatch(s, - r'^(?!0{3}|6{3}|9[0-9]{2})[0-9]{3}-?(?!0{2})[0-9]{2}-?(?!0{4})[0-9]{4}$'); - - /// Checks if string is binary. - static bool isBinary(String s) => hasMatch(s, r'^[0-1]+$'); - - /// Checks if string is IPv4. - static bool isIPv4(String s) => - hasMatch(s, r'^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$'); - - /// Checks if string is IPv6. - static bool isIPv6(String s) => hasMatch(s, - r'^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$'); - - /// Checks if string is hexadecimal. - /// Example: HexColor => #12F - static bool isHexadecimal(String s) => - hasMatch(s, r'^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$'); - - /// Checks if string is Palindrom. - static bool isPalindrom(String string) { - final cleanString = string - .toLowerCase() - .replaceAll(RegExp(r"\s+"), '') - .replaceAll(RegExp(r"[^0-9a-zA-Z]+"), ""); - - for (var i = 0; i < cleanString.length; i++) { - if (cleanString[i] != cleanString[cleanString.length - i - 1]) { - return false; - } - } - - return true; - } - - /// Checks if all data have same value. - /// Example: 111111 -> true, wwwww -> true, [1,1,1,1] -> true - static bool isOneAKind(dynamic value) { - if ((value is String || value is List) && !isNullOrBlank(value)) { - final first = value[0]; - final len = value.length as num; - - for (var i = 0; i < len; i++) { - if (value[i] != first) { - return false; - } - } - - return true; - } - - if (value is int) { - final stringValue = value.toString(); - final first = stringValue[0]; - - for (var i = 0; i < stringValue.length; i++) { - if (stringValue[i] != first) { - return false; - } - } - - return true; - } - - return false; - } - - /// Checks if string is Passport No. - static bool isPassport(String s) => - hasMatch(s, r'^(?!^0+$)[a-zA-Z0-9]{6,9}$'); - - /// Checks if string is Currency. - static bool isCurrency(String s) => hasMatch(s, - r'^(S?\$|\₩|Rp|\¥|\€|\₹|\₽|fr|R\$|R)?[ ]?[-]?([0-9]{1,3}[,.]([0-9]{3}[,.])*[0-9]{3}|[0-9]+)([,.][0-9]{1,2})?( ?(USD?|AUD|NZD|CAD|CHF|GBP|CNY|EUR|JPY|IDR|MXN|NOK|KRW|TRY|INR|RUB|BRL|ZAR|SGD|MYR))?$'); - - /// Checks if length of data is GREATER than maxLength. - static bool isLengthGreaterThan(dynamic value, int maxLength) { - final length = _obtainDynamicLength(value); - - if (length == null) { - return false; - } - - return length > maxLength; - } - - /// Checks if length of data is GREATER OR EQUAL to maxLength. - static bool isLengthGreaterOrEqual(dynamic value, int maxLength) { - final length = _obtainDynamicLength(value); - - if (length == null) { - return false; - } - - return length >= maxLength; - } - - /// Checks if length of data is LOWER than maxLength. - /// - /// This method is deprecated, use [isLengthLessThan] instead - @deprecated - static bool isLengthLowerThan(dynamic value, int maxLength) => - isLengthLessThan(value, maxLength); - - /// Checks if length of data is LESS than maxLength. - static bool isLengthLessThan(dynamic value, int maxLength) { - final length = _obtainDynamicLength(value); - if (length == null) { - return false; - } - - return length < maxLength; - } - - /// Checks if length of data is LOWER OR EQUAL to maxLength. - /// - /// This method is deprecated, use [isLengthLessOrEqual] instead - @deprecated - static bool isLengthLowerOrEqual(dynamic value, int maxLength) => - isLengthLessOrEqual(value, maxLength); - - /// Checks if length of data is LESS OR EQUAL to maxLength. - static bool isLengthLessOrEqual(dynamic value, int maxLength) { - final length = _obtainDynamicLength(value); - - if (length == null) { - return false; - } - - return length <= maxLength; - } - - /// Checks if length of data is EQUAL to maxLength. - static bool isLengthEqualTo(dynamic value, int otherLength) { - final length = _obtainDynamicLength(value); - - if (length == null) { - return false; - } - - return length == otherLength; - } - - /// Checks if length of data is BETWEEN minLength to maxLength. - static bool isLengthBetween(dynamic value, int minLength, int maxLength) { - if (isNull(value)) { - return false; - } - - return isLengthGreaterOrEqual(value, minLength) && - isLengthLessOrEqual(value, maxLength); - } - - /// Checks if a contains b (Treating or interpreting upper- and lowercase - /// letters as being the same). - static bool isCaseInsensitiveContains(String a, String b) { - return a.toLowerCase().contains(b.toLowerCase()); - } - - /// Checks if a contains b or b contains a (Treating or - /// interpreting upper- and lowercase letters as being the same). - static bool isCaseInsensitiveContainsAny(String a, String b) { - final lowA = a.toLowerCase(); - final lowB = b.toLowerCase(); - - return lowA.contains(lowB) || lowB.contains(lowA); - } - - /// Checks if num a LOWER than num b. - static bool isLowerThan(num a, num b) => a < b; - - /// Checks if num a GREATER than num b. - static bool isGreaterThan(num a, num b) => a > b; - - /// Checks if num a EQUAL than num b. - static bool isEqual(num a, num b) => a == b; - - //Check if num is a cnpj - static bool isCnpj(String cnpj) { - if (cnpj == null) { - return false; - } - - // Obter somente os números do CNPJ - final numbers = cnpj.replaceAll(RegExp(r'[^0-9]'), ''); - - // Testar se o CNPJ possui 14 dígitos - if (numbers.length != 14) { - return false; - } - - // Testar se todos os dígitos do CNPJ são iguais - if (RegExp(r'^(\d)\1*$').hasMatch(numbers)) { - return false; - } - - // Dividir dígitos - final digits = numbers.split('').map(int.parse).toList(); - - // Calcular o primeiro dígito verificador - var calcDv1 = 0; - var j = 0; - for (var i in Iterable.generate(12, (i) => i < 4 ? 5 - i : 13 - i)) { - calcDv1 += digits[j++] * i; - } - calcDv1 %= 11; - final dv1 = calcDv1 < 2 ? 0 : 11 - calcDv1; - - // Testar o primeiro dígito verificado - if (digits[12] != dv1) { - return false; - } - - // Calcular o segundo dígito verificador - var calcDv2 = 0; - j = 0; - for (var i in Iterable.generate(13, (i) => i < 5 ? 6 - i : 14 - i)) { - calcDv2 += digits[j++] * i; - } - calcDv2 %= 11; - final dv2 = calcDv2 < 2 ? 0 : 11 - calcDv2; - - // Testar o segundo dígito verificador - if (digits[13] != dv2) { - return false; - } - - return true; - } - - /// Checks if the cpf is valid. - static bool isCpf(String cpf) { - if (cpf == null) { - return false; - } - - // get only the numbers - final numbers = cpf.replaceAll(RegExp(r'[^0-9]'), ''); - // Test if the CPF has 11 digits - if (numbers.length != 11) { - return false; - } - // Test if all CPF digits are the same - if (RegExp(r'^(\d)\1*$').hasMatch(numbers)) { - return false; - } - - // split the digits - final digits = numbers.split('').map(int.parse).toList(); - - // Calculate the first verifier digit - var calcDv1 = 0; - for (var i in Iterable.generate(9, (i) => 10 - i)) { - calcDv1 += digits[10 - i] * i; - } - calcDv1 %= 11; - - final dv1 = calcDv1 < 2 ? 0 : 11 - calcDv1; - - // Tests the first verifier digit - if (digits[9] != dv1) { - return false; - } - - // Calculate the second verifier digit - var calcDv2 = 0; - for (var i in Iterable.generate(10, (i) => 11 - i)) { - calcDv2 += digits[11 - i] * i; - } - calcDv2 %= 11; - - final dv2 = calcDv2 < 2 ? 0 : 11 - calcDv2; - - // Test the second verifier digit - if (digits[10] != dv2) { - return false; - } - - return true; - } - - /// Capitalize each word inside string - /// Example: your name => Your Name, your name => Your name - static String capitalize(String value) { - if (isNullOrBlank(value)) return null; - return value.split(' ').map(capitalizeFirst).join(' '); - } - - /// Uppercase first letter inside string and let the others lowercase - /// Example: your name => Your name - static String capitalizeFirst(String s) { - if (isNullOrBlank(s)) { - return null; - } - - return s[0].toUpperCase() + s.substring(1).toLowerCase(); - } - - /// Remove all whitespace inside string - /// Example: your name => yourname - static String removeAllWhitespace(String value) { - if (isNullOrBlank(value)) { - return null; - } - - return value.replaceAll(' ', ''); - } - - /// Camelcase string - /// Example: your name => yourName - static String camelCase(String value) { - if (isNullOrBlank(value)) { - return null; - } - - final separatedWords = value.split(' '); - var newString = ''; - - for (final word in separatedWords) { - newString += word[0].toUpperCase() + word.substring(1).toLowerCase(); - } - - return newString[0].toLowerCase() + newString.substring(1); - } - - /// Extract numeric value of string - /// Example: OTP 12312 27/04/2020 => 1231227042020ß - /// If firstword only is true, then the example return is "12312" - /// (first found numeric word) - static String numericOnly(String s, {bool firstWordOnly = false}) { - var numericOnlyStr = ''; - - for (var i = 0; i < s.length; i++) { - if (isNumericOnly(s[i])) { - numericOnlyStr += s[i]; - } - if (firstWordOnly && numericOnlyStr.isNotEmpty && s[i] == " ") { - break; - } - } - - return numericOnlyStr; - } - - static bool hasMatch(String value, String pattern) { - return (value == null) ? false : RegExp(pattern).hasMatch(value); - } - - static void printFunction( - String prefix, - dynamic value, - String info, { - bool isError = false, - }) { - Get.log('$prefix $value $info'.trim(), isError: isError); - } -} diff --git a/packages/get_utils/lib/src/platform/platform.dart b/packages/get_utils/lib/src/platform/platform.dart deleted file mode 100644 index 63dc201cb..000000000 --- a/packages/get_utils/lib/src/platform/platform.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'platform_web.dart' if (dart.library.io) 'platform_io.dart'; - -// ignore: avoid_classes_with_only_static_members -class GetPlatform { - static bool get isWeb => GeneralPlatform.isWeb; - - static bool get isMacOS => GeneralPlatform.isMacOS; - - static bool get isWindows => GeneralPlatform.isWindows; - - static bool get isLinux => GeneralPlatform.isLinux; - - static bool get isAndroid => GeneralPlatform.isAndroid; - - static bool get isIOS => GeneralPlatform.isIOS; - - static bool get isFuchsia => GeneralPlatform.isFuchsia; - - static bool get isMobile => GetPlatform.isIOS || GetPlatform.isAndroid; - - static bool get isDesktop => - GetPlatform.isMacOS || GetPlatform.isWindows || GetPlatform.isLinux; -} diff --git a/packages/get_utils/lib/src/platform/platform_io.dart b/packages/get_utils/lib/src/platform/platform_io.dart deleted file mode 100644 index 1808275b3..000000000 --- a/packages/get_utils/lib/src/platform/platform_io.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'dart:io'; - -// ignore: avoid_classes_with_only_static_members -class GeneralPlatform { - static bool get isWeb => false; - - static bool get isMacOS => Platform.isMacOS; - - static bool get isWindows => Platform.isWindows; - - static bool get isLinux => Platform.isLinux; - - static bool get isAndroid => Platform.isAndroid; - - static bool get isIOS => Platform.isIOS; - - static bool get isFuchsia => Platform.isFuchsia; - - static bool get isDesktop => - Platform.isMacOS || Platform.isWindows || Platform.isLinux; -} diff --git a/packages/get_utils/lib/src/platform/platform_web.dart b/packages/get_utils/lib/src/platform/platform_web.dart deleted file mode 100644 index 9387e11b0..000000000 --- a/packages/get_utils/lib/src/platform/platform_web.dart +++ /dev/null @@ -1,35 +0,0 @@ -// TODO: resolve platform/desktop by JS browser agent. -// ignore: avoid_web_libraries_in_flutter -import 'dart:html' as html; - -import '../../get_utils.dart'; - -html.Navigator _navigator = html.window.navigator; - -// ignore: avoid_classes_with_only_static_members -class GeneralPlatform { - static bool get isWeb => true; - - static bool get isMacOS => - _navigator.appVersion.contains('Mac OS') && !GeneralPlatform.isIOS; - - static bool get isWindows => _navigator.appVersion.contains('Win'); - - static bool get isLinux => - (_navigator.appVersion.contains('Linux') || - _navigator.appVersion.contains('x11')) && - !isAndroid; - - // @check https://developer.chrome.com/multidevice/user-agent - static bool get isAndroid => _navigator.appVersion.contains('Android '); - - static bool get isIOS { - // maxTouchPoints is needed to separate iPad iOS13 vs new MacOS - return GetUtils.hasMatch(_navigator.platform, r'/iPad|iPhone|iPod/') || - (_navigator.platform == 'MacIntel' && _navigator.maxTouchPoints > 1); - } - - static bool get isFuchsia => false; - - static bool get isDesktop => isMacOS || isWindows || isLinux; -} diff --git a/packages/get_utils/lib/src/queue/get_queue.dart b/packages/get_utils/lib/src/queue/get_queue.dart deleted file mode 100644 index cfb524463..000000000 --- a/packages/get_utils/lib/src/queue/get_queue.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'dart:async'; - -class GetQueue { - final List<_Item> _queue = []; - bool _active = false; - - void _check() async { - if (!_active && _queue.isNotEmpty) { - _active = true; - var item = _queue.removeAt(0); - try { - item.completer.complete(await item.job()); - } on Exception catch (e) { - item.completer.completeError(e); - } - _active = false; - _check(); - } - } - - Future add(Function job) { - var completer = Completer(); - _queue.add(_Item(completer, job)); - _check(); - return completer.future; - } -} - -class _Item { - final dynamic completer; - final dynamic job; - - _Item(this.completer, this.job); -} diff --git a/packages/get_utils/pubspec.yaml b/packages/get_utils/pubspec.yaml deleted file mode 100644 index 3662139a2..000000000 --- a/packages/get_utils/pubspec.yaml +++ /dev/null @@ -1,55 +0,0 @@ -name: get_utils -description: A set of tools that allows you to access high-level APIs and obtain validation tools for Flutter and GetX™ framework. -version: 3.13.0 -homepage: https://github.com/jonataslaw/getx - -environment: - sdk: ">=2.7.0 <3.0.0" - flutter: ">=1.17.0 <2.0.0" - -dependencies: - flutter: - sdk: flutter - get_core: ">=3.13.0 <4.0.0" - meta: ">=1.1.0 <2.0.0" - -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: - - # 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 diff --git a/packages/get_utils/test/platform_test.dart b/packages/get_utils/test/platform_test.dart deleted file mode 100644 index e00065fc7..000000000 --- a/packages/get_utils/test/platform_test.dart +++ /dev/null @@ -1,16 +0,0 @@ -@TestOn('vm') -import 'dart:io'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_utils/get_utils.dart'; - -void main() { - test('Platform test', () { - expect(GetPlatform.isAndroid, Platform.isAndroid); - expect(GetPlatform.isIOS, Platform.isIOS); - expect(GetPlatform.isFuchsia, Platform.isFuchsia); - expect(GetPlatform.isLinux, Platform.isLinux); - expect(GetPlatform.isMacOS, Platform.isMacOS); - expect(GetPlatform.isWindows, Platform.isWindows); - expect(GetPlatform.isWeb, false); - }); -} diff --git a/packages/get_utils/test/platform_web_test.dart b/packages/get_utils/test/platform_web_test.dart deleted file mode 100644 index 240deb3eb..000000000 --- a/packages/get_utils/test/platform_web_test.dart +++ /dev/null @@ -1,16 +0,0 @@ -@TestOn('browser') -import 'dart:io'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:get_utils/get_utils.dart'; - -void main() { - test('Platform test', () { - expect(GetPlatform.isAndroid, Platform.isAndroid); - expect(GetPlatform.isIOS, Platform.isIOS); - expect(GetPlatform.isFuchsia, Platform.isFuchsia); - expect(GetPlatform.isLinux, Platform.isLinux); - expect(GetPlatform.isMacOS, Platform.isMacOS); - expect(GetPlatform.isWindows, Platform.isWindows); - expect(GetPlatform.isWeb, true); - }); -} diff --git a/pubspec.yaml b/pubspec.yaml index 42fbe7129..38ee26d1b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: get description: Open screens/snackbars/dialogs/bottomSheets without context, manage states and inject dependencies easily with GetX. -version: 3.13.1 +version: 3.13.2 homepage: https://github.com/jonataslaw/getx environment: