├── .flutter-plugins ├── .flutter-plugins-dependencies ├── .gitignore ├── .metadata ├── .pubignore ├── .vscode ├── launch.json └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── analysis_options.yaml ├── exmaple ├── .flutter-plugins ├── .flutter-plugins-dependencies ├── android │ ├── .gradle │ │ ├── 7.4 │ │ │ ├── checksums │ │ │ │ ├── checksums.lock │ │ │ │ ├── md5-checksums.bin │ │ │ │ └── sha1-checksums.bin │ │ │ ├── dependencies-accessors │ │ │ │ ├── dependencies-accessors.lock │ │ │ │ └── gc.properties │ │ │ ├── executionHistory │ │ │ │ └── executionHistory.lock │ │ │ ├── fileChanges │ │ │ │ └── last-build.bin │ │ │ ├── fileHashes │ │ │ │ └── fileHashes.lock │ │ │ └── gc.properties │ │ ├── buildOutputCleanup │ │ │ ├── buildOutputCleanup.lock │ │ │ ├── cache.properties │ │ │ └── outputFiles.bin │ │ └── vcs-1 │ │ │ └── gc.properties │ ├── app │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── flutter │ │ │ └── plugins │ │ │ └── GeneratedPluginRegistrant.java │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.jar │ ├── gradlew │ ├── gradlew.bat │ └── local.properties ├── ios │ ├── .symlinks │ │ └── plugins │ │ │ └── url_launcher_ios │ ├── Flutter │ │ ├── Flutter.podspec │ │ ├── Generated.xcconfig │ │ └── flutter_export_environment.sh │ ├── Pods │ │ ├── Local Podspecs │ │ │ ├── Flutter.podspec.json │ │ │ └── url_launcher_ios.podspec.json │ │ ├── Pods.xcodeproj │ │ │ ├── project.pbxproj │ │ │ └── xcuserdata │ │ │ │ └── thruthesky.xcuserdatad │ │ │ │ └── xcschemes │ │ │ │ ├── Flutter.xcscheme │ │ │ │ ├── Pods-Runner.xcscheme │ │ │ │ ├── url_launcher_ios.xcscheme │ │ │ │ └── xcschememanagement.plist │ │ └── Target Support Files │ │ │ ├── Flutter │ │ │ ├── Flutter.debug.xcconfig │ │ │ └── Flutter.release.xcconfig │ │ │ ├── Pods-Runner │ │ │ ├── Pods-Runner-Info.plist │ │ │ ├── Pods-Runner-acknowledgements.markdown │ │ │ ├── Pods-Runner-acknowledgements.plist │ │ │ ├── Pods-Runner-dummy.m │ │ │ ├── Pods-Runner-frameworks-Debug-input-files.xcfilelist │ │ │ ├── Pods-Runner-frameworks-Debug-output-files.xcfilelist │ │ │ ├── Pods-Runner-frameworks-Profile-input-files.xcfilelist │ │ │ ├── Pods-Runner-frameworks-Profile-output-files.xcfilelist │ │ │ ├── Pods-Runner-frameworks-Release-input-files.xcfilelist │ │ │ ├── Pods-Runner-frameworks-Release-output-files.xcfilelist │ │ │ ├── Pods-Runner-frameworks.sh │ │ │ ├── Pods-Runner-umbrella.h │ │ │ ├── Pods-Runner.debug.xcconfig │ │ │ ├── Pods-Runner.modulemap │ │ │ ├── Pods-Runner.profile.xcconfig │ │ │ └── Pods-Runner.release.xcconfig │ │ │ └── url_launcher_ios │ │ │ ├── url_launcher_ios-Info.plist │ │ │ ├── url_launcher_ios-dummy.m │ │ │ ├── url_launcher_ios-prefix.pch │ │ │ ├── url_launcher_ios-umbrella.h │ │ │ ├── url_launcher_ios.debug.xcconfig │ │ │ ├── url_launcher_ios.modulemap │ │ │ └── url_launcher_ios.release.xcconfig │ └── Runner │ │ ├── GeneratedPluginRegistrant.h │ │ └── GeneratedPluginRegistrant.m └── pubspec.lock ├── lib ├── flutterflow_widgets.dart └── src │ ├── custom_calendar │ └── custom_calendar.dart │ ├── custom_popup │ ├── custom_icon_popup.dart │ └── custom_popup.dart │ ├── display_media │ └── display_media.dart │ ├── icon_label_column │ └── icon_label_column.dart │ ├── linkify_text │ └── linkify_text.dart │ ├── safe_area │ ├── safe_area_bottom.dart │ └── safe_area_top.dart │ ├── show_modal_top_sheet │ └── show_modal_top_sheet.dart │ ├── snackbar │ └── snackbar.dart │ ├── text │ └── text_with_label.dart │ └── url_preview │ ├── url_preview.dart │ └── url_preview.model.dart ├── pubspec.yaml └── res └── img ├── calendar-action.jpg ├── calendar-appstate.jpg ├── calendar-display.jpg ├── calendar-document.jpg ├── calendar-schema.jpg ├── calendar-title.jpg ├── custom-popup.gif ├── ffw-calendar-2.jpg ├── ffw-calendar-3.jpg ├── ffw-calendar-5.jpg ├── ffw-link-preview.jpg ├── icon-label-column.jpg ├── snackbar.gif └── url-preview-and-linkify-text-2.jpg /.flutter-plugins: -------------------------------------------------------------------------------- 1 | # This is a generated file; do not edit or check into version control. 2 | path_provider=/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider-2.1.4/ 3 | path_provider_android=/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_android-2.2.10/ 4 | path_provider_foundation=/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/ 5 | path_provider_linux=/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ 6 | path_provider_windows=/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/ 7 | shared_preferences=/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences-2.0.15/ 8 | shared_preferences_android=/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_android-2.3.2/ 9 | shared_preferences_ios=/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_ios-2.1.1/ 10 | shared_preferences_linux=/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/ 11 | shared_preferences_macos=/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_macos-2.0.5/ 12 | shared_preferences_web=/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.2/ 13 | shared_preferences_windows=/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/ 14 | sqflite=/Users/thruthesky/.pub-cache/hosted/pub.dev/sqflite-2.3.3+1/ 15 | url_launcher=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher-6.1.10/ 16 | url_launcher_android=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.10/ 17 | url_launcher_ios=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.1/ 18 | url_launcher_linux=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.0/ 19 | url_launcher_macos=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.0/ 20 | url_launcher_web=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_web-2.3.3/ 21 | url_launcher_windows=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.2/ 22 | video_player=/Users/thruthesky/.pub-cache/hosted/pub.dev/video_player-2.6.0/ 23 | video_player_android=/Users/thruthesky/.pub-cache/hosted/pub.dev/video_player_android-2.4.3/ 24 | video_player_avfoundation=/Users/thruthesky/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.4.2/ 25 | video_player_web=/Users/thruthesky/.pub-cache/hosted/pub.dev/video_player_web-2.3.1/ 26 | wakelock=/Users/thruthesky/.pub-cache/hosted/pub.dev/wakelock-0.6.2/ 27 | wakelock_macos=/Users/thruthesky/.pub-cache/hosted/pub.dev/wakelock_macos-0.4.0/ 28 | wakelock_web=/Users/thruthesky/.pub-cache/hosted/pub.dev/wakelock_web-0.4.0/ 29 | -------------------------------------------------------------------------------- /.flutter-plugins-dependencies: -------------------------------------------------------------------------------- 1 | {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_foundation","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"shared_preferences_ios","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_ios-2.1.1/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/sqflite-2.3.3+1/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.1/","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.4.2/","native_build":true,"dependencies":[]},{"name":"wakelock","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/wakelock-0.6.2/","native_build":true,"dependencies":[]}],"android":[{"name":"path_provider_android","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_android-2.2.10/","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_android-2.3.2/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/sqflite-2.3.3+1/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.10/","native_build":true,"dependencies":[]},{"name":"video_player_android","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/video_player_android-2.4.3/","native_build":true,"dependencies":[]},{"name":"wakelock","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/wakelock-0.6.2/","native_build":true,"dependencies":[]}],"macos":[{"name":"path_provider_foundation","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"shared_preferences_macos","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_macos-2.0.5/","native_build":true,"dependencies":[]},{"name":"sqflite","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/sqflite-2.3.3+1/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.0/","native_build":true,"dependencies":[]},{"name":"wakelock_macos","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/wakelock_macos-0.4.0/","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/","native_build":false,"dependencies":["path_provider_linux"]},{"name":"url_launcher_linux","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.0/","native_build":true,"dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/","native_build":false,"dependencies":["path_provider_windows"]},{"name":"url_launcher_windows","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.2/","native_build":true,"dependencies":[]}],"web":[{"name":"shared_preferences_web","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.2/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_web-2.3.3/","dependencies":[]},{"name":"video_player_web","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/video_player_web-2.3.1/","dependencies":[]},{"name":"wakelock_web","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/wakelock_web-0.4.0/","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_ios","shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_ios","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"video_player","dependencies":["video_player_android","video_player_avfoundation","video_player_web"]},{"name":"video_player_android","dependencies":[]},{"name":"video_player_avfoundation","dependencies":[]},{"name":"video_player_web","dependencies":[]},{"name":"wakelock","dependencies":["wakelock_macos","wakelock_web"]},{"name":"wakelock_macos","dependencies":[]},{"name":"wakelock_web","dependencies":[]}],"date_created":"2024-09-22 18:16:24.791051","version":"3.24.3","swift_package_manager_enabled":false} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | apps/ 2 | 3 | 4 | # Miscellaneous 5 | *.class 6 | *.log 7 | *.pyc 8 | *.swp 9 | .DS_Store 10 | .atom/ 11 | .buildlog/ 12 | .history 13 | .svn/ 14 | migrate_working_dir/ 15 | 16 | # IntelliJ related 17 | *.iml 18 | *.ipr 19 | *.iws 20 | .idea/ 21 | 22 | # The .vscode folder contains launch configuration and tasks you configure in 23 | # VS Code which you may wish to be included in version control, so this line 24 | # is commented out by default. 25 | #.vscode/ 26 | 27 | # Flutter/Dart/Pub related 28 | # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. 29 | /pubspec.lock 30 | **/doc/api/ 31 | .dart_tool/ 32 | .packages 33 | build/ 34 | example 35 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: e3c29ec00c9c825c891d75054c63fcc46454dca1 8 | channel: stable 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /.pubignore: -------------------------------------------------------------------------------- 1 | doc/ 2 | etc/ 3 | key.dart 4 | 5 | 6 | 7 | example/.dart_tool 8 | example/.idea 9 | example/android 10 | example/build 11 | example/ios 12 | example/linux 13 | example/macos 14 | example/web 15 | example/windows 16 | example/test 17 | example/README.md 18 | example/analysis_options.yaml 19 | example/pubspec.lock 20 | 21 | analysis_options.yaml 22 | 23 | ./test/ 24 | res/ 25 | apps/ 26 | firebase/ 27 | firebase_options.dart 28 | 29 | 30 | # Miscellaneous 31 | *.class 32 | *.log 33 | *.pyc 34 | *.swp 35 | .DS_Store 36 | .atom/ 37 | .buildlog/ 38 | .history 39 | .svn/ 40 | migrate_working_dir/ 41 | 42 | # IntelliJ related 43 | *.iml 44 | *.ipr 45 | *.iws 46 | .idea/ 47 | 48 | # The .vscode folder contains launch configuration and tasks you configure in 49 | # VS Code which you may wish to be included in version control, so this line 50 | # is commented out by default. 51 | #.vscode/ 52 | 53 | # Flutter/Dart/Pub related 54 | # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. 55 | /pubspec.lock 56 | **/doc/api/ 57 | .dart_tool/ 58 | .packages 59 | build/ 60 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Simulator - M1 Mac Book - 16", 9 | "cwd": "example", 10 | "program": "lib/main.dart", 11 | "request": "launch", 12 | "type": "dart", 13 | "flutterMode": "debug", 14 | "deviceId": "8E7C4276-1F64-453C-AE32-422C59170B93" 15 | }, 16 | { 17 | "name": "iPhone11MaxPro - iPhone - JaeHo", 18 | "cwd": "example", 19 | "program": "lib/main.dart", 20 | "request": "launch", 21 | "type": "dart", 22 | "flutterMode": "debug", 23 | "deviceId": "00008030-000904C80290802E" 24 | }, 25 | 26 | { 27 | "name": "Emulator - 5554", 28 | "cwd": "example", 29 | "program": "lib/main.dart", 30 | "request": "launch", 31 | "type": "dart", 32 | "deviceId": "emulator-5554" 33 | }, 34 | 35 | { 36 | "name": "Chrome", 37 | "cwd": "example", 38 | "program": "lib/main.dart", 39 | "request": "launch", 40 | "type": "dart", 41 | "deviceId": "chrome" 42 | }, 43 | 44 | { 45 | "name": "Calendar - Simulator - M1 Mac Book - 16", 46 | "cwd": "apps/testcalendar", 47 | "program": "lib/main.dart", 48 | "request": "launch", 49 | "type": "dart", 50 | "flutterMode": "debug", 51 | "deviceId": "8E7C4276-1F64-453C-AE32-422C59170B93" 52 | } 53 | ] 54 | } 55 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.codeActionsOnSave": { 3 | "source.fixAll": "explicit" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.0.53 2 | 3 | * Dependency version updates 4 | 5 | 6 | ## 0.0.52 7 | 8 | * Dependency version updates 9 | 10 | 11 | ## 0.0.51 12 | 13 | * Dependency version updates 14 | 15 | 16 | ## 0.0.50 17 | 18 | * Dependency version updates 19 | 20 | 21 | ## 0.0.45 22 | 23 | * Update. Add more tutorial text on CustomCalendar. 24 | 25 | ## 0.0.44 26 | 27 | * Bump. 28 | 29 | ## 0.0.43 30 | 31 | * Bump. 32 | 33 | 34 | ## 0.0.42 35 | 36 | * Add. TextWithLabel 37 | 38 | 39 | ## 0.0.41 40 | 41 | * Add. IconLabelColumn 42 | 43 | 44 | ## 0.0.40 45 | 46 | * Update. Doc. 47 | 48 | ## 0.0.39 49 | 50 | * Update. Custom popup tooltip. Document updates. 51 | 52 | ## 0.0.38 53 | 54 | * Update. document. 55 | 56 | ## 0.0.37 57 | 58 | * Update. document. 59 | 60 | 61 | ## 0.0.35 62 | 63 | * Update. document on CustomCalendar. 64 | 65 | 66 | ## 0.0.34 67 | 68 | * Update. document on CustomCalendar. 69 | 70 | ## 0.0.33 71 | 72 | * Update. document. 73 | 74 | 75 | ## 0.0.32 76 | 77 | * Update. document. 78 | 79 | ## 0.0.31 80 | 81 | * Update. Calendar with events. 82 | 83 | ## 0.0.30 84 | 85 | * Add. Calendar with events. 86 | 87 | 88 | ## 0.0.29 89 | 90 | * Fix. UrlPreview model. 91 | 92 | ## 0.0.28 93 | 94 | * Update. add `hasData` on UrlPreview model. 95 | 96 | ## 0.0.27 97 | 98 | * Update. add url preview action. 99 | 100 | ## 0.0.26 101 | 102 | * Fix. dependency. 103 | 104 | ## 0.0.25 105 | 106 | * Update. Cache image in UrlPreview. 107 | 108 | 109 | ## 0.0.24 110 | 111 | * Update. Better parsing and improvment on loading speed in UrlPreview. 112 | 113 | 114 | ## 0.0.23 115 | 116 | * Update. UrlPreview design. 117 | 118 | ## 0.0.22 119 | 120 | * Update. url preview. add builder for better ui work. 121 | 122 | ## 0.0.21 123 | 124 | * Update. url preview. 125 | 126 | 127 | ## 0.0.20 128 | 129 | * Add. url preview. 130 | 131 | 132 | ## 0.0.19 133 | 134 | * Update. doc. 135 | 136 | ## 0.0.18 137 | 138 | * Update. CustomIconPopup. 139 | 140 | 141 | ## 0.0.16 142 | 143 | * Update. Document on snackbar. 144 | 145 | 146 | ## 0.0.16 147 | 148 | * Update. Document. 149 | 150 | ## 0.0.15 151 | 152 | * Update. Document. 153 | 154 | ## 0.0.14 155 | 156 | * Fix. update document. 157 | 158 | ## 0.0.13 159 | 160 | * Fix. revert the video player to cheiw. 161 | 162 | ## 0.0.10 163 | 164 | * Fix. export. 165 | 166 | 167 | ## 0.0.9 168 | 169 | * Fix. doc. 170 | 171 | 172 | ## 0.0.8 173 | 174 | * Copy some widgets from fireflow. 175 | 176 | ## 0.0.7 177 | 178 | * Document update only 179 | 180 | 181 | ## 0.0.6 182 | 183 | * Add `TextStyle` on `LinkText`. 184 | 185 | ## 0.0.5 186 | 187 | * Set Dart SDK to `>=2.12.0 <3.0.0`. 188 | * Change name from `LinkText` to `LinkifyText`. 189 | 190 | 191 | ## 0.0.4 192 | 193 | * Update documentation. 194 | 195 | ## 0.0.3 196 | 197 | * Change name from `LinkifyLauncher` to `LinkText`. 198 | 199 | ## 0.0.2 200 | 201 | * Add `LinkifyLauncher`. 202 | 203 | 204 | ## 0.0.1 205 | 206 | * Initial release. 207 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2022 JaeHo Song 2 | 3 | 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: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FlutterFlow Widgets 2 | 3 | - This package is developed for `FlutterFlow`. And you may use in flutter. 4 | - This package contains not only widgets but also some actions that are related with UI design like snackbar. 5 | 6 | - [FlutterFlow Widgets](#flutterflow-widgets) 7 | - [TextWithLabel](#textwithlabel) 8 | - [LinkifyText](#linkifytext) 9 | - [TODO](#todo) 10 | - [How to use LinkifyText](#how-to-use-linkifytext) 11 | - [UrlPreview](#urlpreview) 12 | - [Custom Popup widget.](#custom-popup-widget) 13 | - [Custom Popup Tips](#custom-popup-tips) 14 | - [How to implement the custom ppup](#how-to-implement-the-custom-ppup) 15 | - [Custom popup step by step example](#custom-popup-step-by-step-example) 16 | - [Create a child Component](#create-a-child-component) 17 | - [Create a popup Component](#create-a-popup-component) 18 | - [Custom widget for Custom Popup](#custom-widget-for-custom-popup) 19 | - [Add the custom widget in your design](#add-the-custom-widget-in-your-design) 20 | - [CustomIconPopup](#customiconpopup) 21 | - [DisplayMedia widget](#displaymedia-widget) 22 | - [SafeArea widget](#safearea-widget) 23 | - [Snackbar](#snackbar) 24 | - [success snackbar](#success-snackbar) 25 | - [error snackbar](#error-snackbar) 26 | - [Using go\_router context to let the snackbar work after page change](#using-go_router-context-to-let-the-snackbar-work-after-page-change) 27 | - [Customizing the snackbar](#customizing-the-snackbar) 28 | - [CustomCalendar](#customcalendar) 29 | - [IconLabelColumn](#iconlabelcolumn) 30 | 31 | 32 | # TextWithLabel 33 | 34 | - explain... 35 | 36 | # LinkifyText 37 | 38 | - This is a simple and handy widget to use display linkified and launchable text. When a user taps, it will open the url in the text. This is a simple combination of `linkify` and `launcher` widgets. 39 | 40 | ## TODO 41 | 42 | - Change the widget name from `LinkTest` to `LinkifyText`. 43 | 44 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/url-preview-and-linkify-text-2.jpg?raw=true "LinkifyText and UrlPreview") 45 | 46 | ## How to use LinkifyText 47 | 48 | - import `flutterflow_widgets` package and supply `text` property to `LinkifyText`. 49 | - It will open the link when the user taps on the link. 50 | - Don't forget to uncheck `Enforce Width and Height`. 51 | 52 | ```dart 53 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 54 | 55 | class Linkify extends StatefulWidget { 56 | const Linkify({ 57 | Key? key, 58 | this.width, 59 | this.height, 60 | this.text, 61 | }) : super(key: key); 62 | 63 | final double? width; 64 | final double? height; 65 | final String? text; 66 | 67 | @override 68 | _LinkifyState createState() => _LinkifyState(); 69 | } 70 | 71 | class _LinkifyState extends State { 72 | @override 73 | Widget build(BuildContext context) { 74 | return LinkifyText( 75 | text: widget.text ?? '', 76 | style: TextStyle(fontSize: 14), 77 | ); 78 | } 79 | } 80 | ``` 81 | 82 | # UrlPreview 83 | 84 | 85 | 86 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/ffw-link-preview.jpg?raw=true "CustomCalendar") 87 | 88 | 89 | - When there is an URL in a text, then it will show a preview. 90 | 91 | ```dart 92 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 93 | UrlPreview( 94 | text: 'Stack overflow: https://stackoverflow.com/questions/62540297/figma-text-orientation?a=b&text-orien, This is naver https://naver.com.', 95 | descriptionLength: 80, 96 | builder: (child) => Container( 97 | margin: const EdgeInsets.only(top: 8), 98 | padding: const EdgeInsets.all(8), 99 | width: 240, 100 | decoration: BoxDecoration( 101 | color: Colors.amber.shade100, 102 | border: Border.all(color: Colors.black), 103 | borderRadius: BorderRadius.circular(8), 104 | ), 105 | child: child, 106 | ), 107 | ), 108 | ``` 109 | 110 | - For more details, see the example at example/lib/url_preview.screen.dart 111 | 112 | 113 | - Here is another example for FlutterFlow. Just copy & paste the code below. 114 | 115 | ```dart 116 | 117 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 118 | 119 | class SitePreview extends StatefulWidget { 120 | const SitePreview({ 121 | Key? key, 122 | this.width, 123 | this.height, 124 | this.text, 125 | this.padding, 126 | this.descriptionLength, 127 | required this.myMessage, 128 | }) : super(key: key); 129 | 130 | final double? width; 131 | final double? height; 132 | final String? text; 133 | final double? padding; 134 | final int? descriptionLength; 135 | final bool myMessage; 136 | 137 | @override 138 | createState() => SitePreviewState(); 139 | } 140 | 141 | class SitePreviewState extends State { 142 | @override 143 | Widget build(BuildContext context) { 144 | return UrlPreview( 145 | text: widget.text, 146 | descriptionLength: widget.descriptionLength, 147 | builder: (Widget child) => Container( 148 | margin: const EdgeInsets.only(top: 8), 149 | padding: const EdgeInsets.all(16), 150 | width: 260, 151 | decoration: BoxDecoration( 152 | color: Colors.amber.shade50.withAlpha(100), 153 | border: Border.all(color: Colors.black26.withAlpha(25)), 154 | borderRadius: BorderRadius.only( 155 | topLeft: Radius.circular(widget.myMessage == false ? 0 : 16), 156 | topRight: Radius.circular(widget.myMessage ? 0 : 16), 157 | bottomLeft: Radius.circular(16), 158 | bottomRight: Radius.circular(16), 159 | )), 160 | child: child, 161 | ), 162 | ); 163 | } 164 | } 165 | ``` 166 | 167 | 168 | 169 | 170 | 171 | 172 | # Custom Popup widget. 173 | 174 | Flutterflow provides the bottom sheet widget. But it is a bit different from the popup menu. 175 | 176 | So, I made a widget named `CustomPopup` that does something like the popup menu in the following screenshot. 177 | 178 | In the screenshot, I display the members of the chat room. Yes, it is a real popup menu and all the designs are coming from Components. You can add custom design and actions as you want. 179 | 180 | 181 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/custom-popup.gif?raw=true "Custom Popup") 182 | 183 | 184 | It would be good to use when there are multiple popup menus in one screen. Like one in left side of appbar, and another in right side of app bar, and one more on user profile photo of each posts and comments. 185 | 186 | ## Custom Popup Tips 187 | 188 | - When you want to display dynamic content in the popup box, you would set the width and height bound on the popup box. Or you would see an error of `NEEDS-LAYOUT NEEDS-PAINT`. 189 | 190 | - To change the state of popup, you need to make it with a stream. 191 | 192 | ## How to implement the custom ppup 193 | 194 | - For your information, When you create a Component, you can use that Component in a Custom widget. You need to check `Exclude from Compile` in this case. 195 | 196 | 197 | - The child widget is the Component that displays as a trigger. The child component in the screenshot above is the widget that has two photos. In the component, the first user is the user who sent the last message. The second user is the user who last entered the chat room. 198 | 199 | 200 | - When a user taps on the Component, a popup menu is shown. And the popup menu is the ChatGroupUsers Component. 201 | 202 | 203 | - You can make your own child Component and the popup Component with your own design and actions. Just the way you develop your Component. 204 | - And passed them over the CustomPopup widget. 205 | 206 | - Don't put the size of the width in the popup component. Or put it as `inf`. The width of the popup component meant to be automatically sized by the `CustomPopup` widget. See [the popup component width size issue](https://github.com/withcenter/fireflow/issues/1). 207 | 208 | - Options 209 | - dx is the x position where the popup would appear. 210 | - dy is the y position where the popup would appear. 211 | 212 | - `tooltip` can be used to display as the tooltip text when it is hovered. By default, it is an empty string and no tooltip appears. 213 | 214 | 215 | ```dart 216 | import 'package:app/components/icon_component_widget.dart'; 217 | import 'package:app/components/popup_component_widget.dart'; 218 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 219 | 220 | class PopupExample extends StatefulWidget { 221 | const PopupExample({ 222 | Key? key, 223 | this.width, 224 | this.height, 225 | }) : super(key: key); 226 | 227 | final double? width; 228 | final double? height; 229 | 230 | @override 231 | _PopupExampleSate createState() => _PopupExampleSate(); 232 | } 233 | 234 | class _PopupExampleSate extends State { 235 | @override 236 | Widget build(BuildContext context) { 237 | return CustomPopup( 238 | tooltip: 'This is the tooltip', 239 | dx: 32, 240 | dy: 38, 241 | child: IconComponentWidget(), 242 | popup: PopupComponentWidget(), 243 | ); 244 | } 245 | } 246 | ``` 247 | 248 | - It can go much complicated customization like below. 249 | - The custom widget `DisplayChatUsers` below takes a parameter of `chatRoom` and it passes over the child widget and popup widget. Then, the child and popup widget may display different information. 250 | 251 | ```dart 252 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 253 | import '../../components/user_photo_popup_icon_widget.dart'; 254 | import '../../components/user_photo_popup_menu_widget.dart'; 255 | 256 | class UserPhoto extends StatefulWidget { 257 | const UserPhoto({ 258 | Key? key, 259 | this.width, 260 | this.height, 261 | required this.userPublicDataDocument, 262 | }) : super(key: key); 263 | 264 | final double? width; 265 | final double? height; 266 | final UsersPublicDataRecord userPublicDataDocument; 267 | 268 | @override 269 | _UserPhotoState createState() => _UserPhotoState(); 270 | } 271 | 272 | class _UserPhotoState extends State { 273 | @override 274 | Widget build(BuildContext context) { 275 | return CustomPopup( 276 | dx: 32, 277 | dy: 38, 278 | popup: UserPhotoPopupMenuWidget( 279 | userPublicDataDocument: widget.userPublicDataDocument, 280 | ), 281 | child: UserPhotoPopupIconWidget( 282 | userPublicDataDocument: widget.userPublicDataDocument, 283 | width: widget.width, 284 | height: widget.height, 285 | ), 286 | ); 287 | } 288 | } 289 | ``` 290 | 291 | - If you are showing only an icon for the popup menu button, then you won't need to create a custom component for that. 292 | - Simply use Icon parameter 293 | 294 | ```dart 295 | 296 | import '../../components/chat_room_menu_popup_widget.dart'; 297 | 298 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 299 | 300 | class ChatRoomMenu extends StatefulWidget { 301 | const ChatRoomMenu({ 302 | Key? key, 303 | this.width, 304 | this.height, 305 | required this.chatRoomDocument, 306 | required this.icon, 307 | }) : super(key: key); 308 | 309 | final double? width; 310 | final double? height; 311 | final ChatRoomsRecord chatRoomDocument; 312 | final Widget icon; 313 | 314 | @override 315 | _ChatRoomMenuState createState() => _ChatRoomMenuState(); 316 | } 317 | 318 | class _ChatRoomMenuState extends State { 319 | @override 320 | Widget build(BuildContext context) { 321 | return CustomPopup( 322 | dx: 0, 323 | dy: 32, 324 | child: widget.icon, 325 | popup: ChatRoomMenuPopupWidget(chatRoomDocument: widget.chatRoomDocument), 326 | ); 327 | } 328 | } 329 | ``` 330 | 331 | 332 | ## Custom popup step by step example 333 | 334 | 335 | ### Create a child Component 336 | 337 | The child component is the widget that will trigger a popup menu to be appeared when a user presses on. 338 | 339 | Example) 340 | 341 | Just create an icon, or a text or any. You can do whatever design you like, but don’t put a widget that has tap event handler like a button. 342 | 343 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/custom-popup-1.jpg?raw=true "Custom Popup") 344 | 345 | 346 | 347 | ### Create a popup Component 348 | 349 | Create a component that will appear as a popup menu. You can do whatever design you want and you can add whatever actions you like. And yes, it works just as you expect. 350 | 351 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/custom-popup-2.jpg?raw=true "Custom Popup") 352 | 353 | 354 | ### Custom widget for Custom Popup 355 | 356 | - Create a custom widget to make the child Component and the popup Component work together 357 | 358 | The difficult part may be creating the custom widget to make the two widgets work together. 359 | 360 | I named the custom widget as `ChatRoomMenu`. So, the following code snippet contains `ChatRoomMenu` as its class name. 361 | 362 | The see import statement. The patterns of the import path are 363 | Add `../../components/` in front. 364 | Then, add the kebab case of the Component. 365 | Lastly, add `_widget.dart`. 366 | 367 | You will need to import package:fireflow.fireflow.dart for fireflow. 368 | 369 | And in the body of the state class, use CustomPopup with child and popup parameters with its respective Components. 370 | 371 | And finally, on the Widget Settings. 372 | I checked `Exclude from compilation`. This is needed when you refer to codes that are generated by FlutterFlow itself like accessing Components. 373 | 374 | 375 | 376 | - Example 377 | 378 | **Pubspec Dependencies** 379 | `flutterflow_widgets` 380 | 381 | ```dart 382 | import '../../components/chat_room_menu_icon_widget.dart'; 383 | import '../../components/chat_room_menu_popup_widget.dart'; 384 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 385 | 386 | class ChatRoomMenu extends StatefulWidget { 387 | const chatRoomMenu({ 388 | Key? key, 389 | this.width, 390 | this.height, 391 | }) : super( key: key ); 392 | 393 | final double this.width; 394 | final double this.height; 395 | 396 | @override 397 | _ChatRoomMenuState createState() => _ChatRoomMenuState(); 398 | } 399 | 400 | class _ChatRoomMenuState extends State { 401 | @override 402 | Widget build(BuildContext context) { 403 | return CustomComponent( 404 | dx: 0, 405 | dy: 38, 406 | child: ChatRoomMenuIconWidget(), 407 | popup: ChatRoomMenuPopupWidget(), 408 | ) 409 | } 410 | } 411 | ``` 412 | 413 | 414 | ### Add the custom widget in your design 415 | 416 | Now, the easiest part. Just add the custom widget where you want to add. 417 | For the example of the code above, the Custom widget is ChatRoomMenu. And I added at the top-right corner. 418 | 419 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/custom-popup-4.jpg?raw=true "Custom Popup") 420 | 421 | 422 | # CustomIconPopup 423 | 424 | - You can use `Icon` instead of adding a child component. 425 | 426 | 427 | - Below are two example of how you can create a widget that uses `CustomIconPopup`. 428 | 429 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/custom-icon-popup-1.jpg?raw=true "Custom Popup") 430 | 431 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/custom-icon-popup-2.jpg?raw=true "Custom Popup") 432 | 433 | 434 | - You can code like below. 435 | 436 | ```dart 437 | CustomIconPopup( 438 | popup: Container( 439 | color: Colors.blue, 440 | child: Column( 441 | mainAxisSize: MainAxisSize.min, 442 | children: [ 443 | const Text('Custom Icon Popup '), 444 | const Text('Content of the popup'), 445 | const Text('Apple, Banana, Cherry'), 446 | const Text(''), 447 | const Text('Close'), 448 | TextButton.icon( 449 | onPressed: Navigator.of(context).pop, 450 | icon: const Icon(Icons.close), 451 | label: const Text( 452 | 'Close', 453 | style: TextStyle(color: Colors.white), 454 | ), 455 | ), 456 | ], 457 | ), 458 | ), 459 | icon: const Icon( 460 | Icons.settings, 461 | size: 18, 462 | ), 463 | iconPadding: 16, 464 | ) 465 | ``` 466 | 467 | # DisplayMedia widget 468 | 469 | This widget accepts a String of URL together with width and height. 470 | 471 | The width and height are respected to size the DisplayMedia widget. 472 | 473 | This widget displays any kind of url like photo, video, audio, txt, pdf, etc. 474 | 475 | See the details on the [API reference - MediaDisplay](https://pub.dev/documentation/fireflow/latest/fireflow/DisplayMedia-class.html). 476 | 477 | 478 | Below is an example of displaying media by giving a photo url. 479 | 480 | 481 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/display-media-1.jpg?raw=true "Display Media") 482 | 483 | To make the border round like above, 484 | 485 | 486 | Disable `Enforce Width and Height` 487 | 488 | 489 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/display-media-2.jpg?raw=true "Display Media") 490 | 491 | 492 | And wrap it with a container, put border property, and enable `Clip Content`. 493 | 494 | 495 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/display-media-3.jpg?raw=true "Display Media") 496 | 497 | 498 | 499 | The DisplayMedia widget of FlutterFlow_Widget displays files like below. 500 | 501 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/display-media-4.jpg?raw=true "Display Media") 502 | 503 | 504 | 505 | It displays the file of the given url but does not react on tap. So, it is up to you how you want to design your app. 506 | 507 | 508 | # SafeArea widget 509 | 510 | You can Enable/Disable the SafeArea in FF. But you cannot give SafeArea on top only or bottom only. And you cannot optionally add a space to make the contents(widgets) appear safely from the notches. 511 | 512 | For instance, you want to design your app with an image that displays as a background of the full screen. In this case you have to disable the SafeArea. But you need it enabled for some devices that have notches. 513 | 514 | In the example below; 515 | 516 | Some devices like the one on the left side have no notches. That’s fine without SafeArea. 517 | But some devices like the one on the right have notches at the top and at the bottom. 518 | 519 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/safearea-1.jpg?raw=true "SafeArea") 520 | 521 | 522 | Yes, of course, you may twist the widgets to make the full screen with a background image like below. But that has limitations and the widget tree goes crazy. 523 | 524 | 525 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/safearea-2.jpg?raw=true "SafeArea") 526 | 527 | 528 | So? 529 | 530 | Here comes with the two widgets. SafeAreaTop and SafeAreaBottom. 531 | 532 | Here is how to create SafeAreaTop and SafeAreaBottom widgets using Fireflow. 533 | 534 | 535 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/safearea-3.jpg?raw=true "SafeArea") 536 | 537 | 538 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/safearea-4.jpg?raw=true "SafeArea") 539 | 540 | How to layout the SafeAreaTop and SafeAreaBottom widgets. 541 | 542 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/safearea-5.jpg?raw=true "SafeArea") 543 | 544 | Be sure that you disable the `Enforce Width and Height` option. 545 | 546 | ![Image Link](https://github.com/withcenter/fireflow/blob/main/etc/readme/img/safearea-6.jpg?raw=true "SafeArea") 547 | 548 | 549 | 550 | # Snackbar 551 | 552 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/snackbar.gif?raw=true "Snackbar") 553 | 554 | 555 | The `snackbar` is an action that it does appear on the screen by an action. You can show a snackbar on `On Page Load` event, or when a user presses a button. 556 | 557 | You need to create a custom action like below and call the action. 558 | 559 | You can name the action by yourself. 560 | 561 | 562 | ## success snackbar 563 | 564 | **Action Settings** 565 | - Include BuildContext 566 | - No return value 567 | 568 | **Define Arguments** 569 | | Parameter Name | Type | List | Nullable | 570 | |----------------|------|------|----------| 571 | | title | String | No | No | 572 | | message | String | No | No | 573 | 574 | 575 | ```dart 576 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 577 | 578 | Future successSnackbar( 579 | BuildContext context, 580 | String title, 581 | String message, 582 | ) async { 583 | // Add your function code here! 584 | snackBarSuccess( 585 | context: context, 586 | title: title, 587 | message: message, 588 | ); 589 | } 590 | ``` 591 | 592 | 593 | 594 | ## error snackbar 595 | 596 | **Action Settings** 597 | - Include BuildContext 598 | - No return value 599 | 600 | **Define Arguments** 601 | | Parameter Name | Type | List | Nullable | 602 | |----------------|------|------|----------| 603 | | title | String | No | No | 604 | | message | String | No | No | 605 | 606 | 607 | ```dart 608 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 609 | 610 | Future errorSnackbar( 611 | BuildContext context, 612 | String title, 613 | String message, 614 | ) async { 615 | // Add your function code here! 616 | snackBarWarning( 617 | context: context, 618 | title: title, 619 | message: message, 620 | ); 621 | } 622 | ``` 623 | 624 | 625 | ## Using go_router context to let the snackbar work after page change 626 | 627 | When a snackbar is open and the user moves to antoher page, then the context of the snackbar would be invalid. And when user press the close icon, the snackbar will not be closed immediately. 628 | 629 | You can give the context of go_router in this case if you are using the Routing in FF app details settings. 630 | 631 | ```dart 632 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 633 | import 'package:go_router/go_router.dart'; 634 | 635 | Future successSnackbar( 636 | BuildContext context, 637 | String title, 638 | String message, 639 | ) async { 640 | // Add your function code here! 641 | snackBarSuccess( 642 | context: GoRouter.of(context).routerDelegate.navigatorKey.currentContext!, 643 | title: title, 644 | message: message, 645 | ); 646 | } 647 | ``` 648 | 649 | 650 | ## Customizing the snackbar 651 | 652 | You can use `showSnackbar` method. The `snackBarSuccess` and `snackBarWarning` are merely a wrapper of `showSnackbar` with different properties. 653 | 654 | ```dart 655 | showSnackBar( 656 | GoRouter.of(context).routerDelegate.navigatorKey.currentContext!, 657 | snackBarContent( 658 | context: GoRouter.of(context).routerDelegate.navigatorKey.currentContext!, 659 | title: title, 660 | message: message, 661 | backgroundColor: Colors.black.withAlpha(190), 662 | closeButtonColor: Colors.white, 663 | icon: const Icon(Icons.check_circle, color: Colors.green, size: 28), 664 | arrowBackgroundColor: Colors.white, 665 | seconds: 20, 666 | ), 667 | ); 668 | ``` 669 | 670 | 671 | 672 | 673 | # CustomCalendar 674 | 675 | 676 | You can display the number of events on the dates of the calendar. See the [Example FlutterFlow Project](https://app.flutterflow.io/project/flutter-flow-widgets-calendar-plzgls). 677 | 678 | 679 | - The documet must have `date` field. 680 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/calendar-schema.jpg?raw=true "CustomCalendar") 681 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/calendar-document.jpg?raw=true "CustomCalendar") 682 | 683 | 684 | 685 | - Set a variable named `events` with the type of `List < JSON >` on AppState. 686 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/calendar-appstate.jpg?raw=true "CustomCalendar") 687 | 688 | - Create a custom widget. Let's name it `MyCalendar`. See the images below. 689 | 690 | 691 | - Add a `onTap` action parameter to the `MyCalendar`. 692 | - When the user taps on a day, the `MyCalendar` will save the event information on the `events` App State and will call the `onTap` action. So you need to add your own action and pass it over the `MyCalendar`. 693 | 694 | 695 | 696 | - When the user taps on a day, your action will run. You can get the events from `events` App State and display in on screen. 697 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/calendar-appstate.jpg?raw=true "CustomCalendar") 698 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/calendar-action.jpg?raw=true "CustomCalendar") 699 | 700 | 701 | - Display the `events` from AppState into a ListView 702 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/calendar-display.jpg?raw=true "CustomCalendar") 703 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/calendar-title.jpg?raw=true "CustomCalendar") 704 | 705 | - There are two examples below. 706 | - The first one does Firestore backend query with custom code. You can copy and use it without modification. Well of course, you can modify if you want. 707 | - The second one does Firebase backend query with the native FF Firestore backend query. But you have to modify the custom code especially for the event data converting. 708 | 709 | 710 | 711 | 712 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/ffw-calendar-2.jpg?raw=true "CustomCalendar") 713 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/ffw-calendar-3.jpg?raw=true "CustomCalendar") 714 | 715 | 716 | 717 | * Example of custom widget to display the number of events from firestore in realtime. 718 | 719 | ```dart 720 | 721 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 722 | 723 | class MyCalendar extends StatefulWidget { 724 | const MyCalendar({ 725 | Key? key, 726 | this.width, 727 | this.height, 728 | required this.collectionName, 729 | required this.onTap, 730 | }) : super(key: key); 731 | 732 | final double? width; 733 | final double? height; 734 | final String collectionName; 735 | final Future Function() onTap; 736 | 737 | @override 738 | _MyCalendarState createState() => _MyCalendarState(); 739 | } 740 | 741 | class _MyCalendarState extends State { 742 | final Map events = {}; 743 | 744 | @override 745 | void initState() { 746 | super.initState(); 747 | init(); 748 | } 749 | 750 | init() async { 751 | // / Get documents from collection 752 | FirebaseFirestore.instance.collection(widget.collectionName).snapshots().listen((QuerySnapshot querySnapshot) { 753 | if (querySnapshot.size == 0 || querySnapshot.docs.isEmpty) { 754 | return; 755 | } 756 | events.clear(); 757 | for (final doc in querySnapshot.docs) { 758 | if (doc['date'] == null) continue; 759 | final data = doc.data() as Map; 760 | data['reference'] = doc.reference; 761 | events[doc['date'].toDate()] = data; 762 | } 763 | setState(() {}); 764 | }); 765 | } 766 | 767 | @override 768 | Widget build(BuildContext context) { 769 | return CustomCalendar( 770 | events: events, 771 | onDaySelected: (events) { 772 | print('events; $events'); 773 | FFAppState().events = events ?? []; 774 | widget.onTap(); 775 | }, 776 | ); 777 | } 778 | } 779 | ``` 780 | 781 | 782 | Instead of passing the collection name into the method and do the firebase things inside, you can do the Firestore backend query and pass the list of the document you have. 783 | 784 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/ffw-calendar-5.jpg?raw=true "CustomCalendar") 785 | 786 | ```dart 787 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 788 | 789 | class MyCalendar extends StatefulWidget { 790 | const MyCalendar({ 791 | Key? key, 792 | this.width, 793 | this.height, 794 | required this.documents, 795 | required this.onTap, 796 | }) : super(key: key); 797 | 798 | final double? width; 799 | final double? height; 800 | final List? documents; 801 | final Future Function() onTap; 802 | 803 | @override 804 | _MyCalendarState createState() => _MyCalendarState(); 805 | } 806 | 807 | class _MyCalendarState extends State { 808 | final Map events = {}; 809 | 810 | @override 811 | Widget build(BuildContext context) { 812 | events.clear(); 813 | for (final DatesRecord doc in widget.documents ?? []) { 814 | if (doc.date == null) continue; 815 | events[doc.date!] = { 816 | 'reference': doc.reference, 817 | 'date': doc.date, 818 | 'title': doc.title, 819 | }; 820 | } 821 | return CustomCalendar( 822 | events: events, 823 | onDaySelected: (events) { 824 | print('events; $events'); 825 | FFAppState().events = events ?? []; 826 | widget.onTap(); 827 | }, 828 | ); 829 | } 830 | } 831 | ``` 832 | 833 | 834 | The code below is even more short. 835 | 836 | ```dart 837 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 838 | 839 | class MyCalendar extends StatefulWidget { 840 | const MyCalendar({ 841 | Key? key, 842 | this.width, 843 | this.height, 844 | required this.documents, 845 | required this.onTap, 846 | }) : super(key: key); 847 | 848 | final double? width; 849 | final double? height; 850 | final List? documents; 851 | final Future Function() onTap; 852 | 853 | @override 854 | _MyCalendarState createState() => _MyCalendarState(); 855 | } 856 | 857 | class _MyCalendarState extends State { 858 | @override 859 | Widget build(BuildContext context) { 860 | return CustomCalendar( 861 | events: Map.fromEntries(widget.documents!.map((e) => MapEntry(e.date!, { 862 | 'reference': e.reference, 863 | 'date': e.date, 864 | 'title': e.title, 865 | }))), 866 | onDaySelected: (events) { 867 | FFAppState().events = events ?? []; 868 | widget.onTap(); 869 | }, 870 | ); 871 | } 872 | } 873 | ``` 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | # IconLabelColumn 882 | 883 | - It's a simple widget of a combination of icon and label in column. It shows icon on top and label at bottom. That's it. 884 | 885 | Example of UI 886 | ![Image Link](https://github.com/thruthesky/flutterflow_widgets/blob/main/res/img/icon-label-column.jpg?raw=true "Icon label column") 887 | 888 | 889 | ```dart 890 | IconLabelColumn( 891 | icon: Icons.favorite, 892 | label: 'Favorite', 893 | ) 894 | ``` 895 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | 3 | # Additional information about this file can be found at 4 | # https://dart.dev/guides/language/analysis-options 5 | -------------------------------------------------------------------------------- /exmaple/.flutter-plugins: -------------------------------------------------------------------------------- 1 | # This is a generated file; do not edit or check into version control. 2 | url_launcher=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher-6.1.10/ 3 | url_launcher_android=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.26/ 4 | url_launcher_ios=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.3/ 5 | url_launcher_linux=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.4/ 6 | url_launcher_macos=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.4/ 7 | url_launcher_web=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.16/ 8 | url_launcher_windows=/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.5/ 9 | -------------------------------------------------------------------------------- /exmaple/.flutter-plugins-dependencies: -------------------------------------------------------------------------------- 1 | {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"url_launcher_ios","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_ios-6.1.3/","native_build":true,"dependencies":[]}],"android":[{"name":"url_launcher_android","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_android-6.0.26/","native_build":true,"dependencies":[]}],"macos":[{"name":"url_launcher_macos","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_macos-3.0.4/","native_build":true,"dependencies":[]}],"linux":[{"name":"url_launcher_linux","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_linux-3.0.4/","native_build":true,"dependencies":[]}],"windows":[{"name":"url_launcher_windows","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_windows-3.0.5/","native_build":true,"dependencies":[]}],"web":[{"name":"url_launcher_web","path":"/Users/thruthesky/.pub-cache/hosted/pub.dev/url_launcher_web-2.0.16/","dependencies":[]}]},"dependencyGraph":[{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2023-04-05 11:18:50.318064","version":"3.7.8"} -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/7.4/checksums/checksums.lock -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/checksums/md5-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/7.4/checksums/md5-checksums.bin -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/checksums/sha1-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/7.4/checksums/sha1-checksums.bin -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/dependencies-accessors/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/7.4/dependencies-accessors/gc.properties -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/executionHistory/executionHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/7.4/executionHistory/executionHistory.lock -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/7.4/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /exmaple/android/.gradle/7.4/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/7.4/gc.properties -------------------------------------------------------------------------------- /exmaple/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock -------------------------------------------------------------------------------- /exmaple/android/.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Thu Sep 22 11:43:55 KST 2022 2 | gradle.version=7.4 3 | -------------------------------------------------------------------------------- /exmaple/android/.gradle/buildOutputCleanup/outputFiles.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/buildOutputCleanup/outputFiles.bin -------------------------------------------------------------------------------- /exmaple/android/.gradle/vcs-1/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/.gradle/vcs-1/gc.properties -------------------------------------------------------------------------------- /exmaple/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java: -------------------------------------------------------------------------------- 1 | package io.flutter.plugins; 2 | 3 | import androidx.annotation.Keep; 4 | import androidx.annotation.NonNull; 5 | import io.flutter.Log; 6 | 7 | import io.flutter.embedding.engine.FlutterEngine; 8 | 9 | /** 10 | * Generated file. Do not edit. 11 | * This file is generated by the Flutter tool based on the 12 | * plugins that support the Android platform. 13 | */ 14 | @Keep 15 | public final class GeneratedPluginRegistrant { 16 | private static final String TAG = "GeneratedPluginRegistrant"; 17 | public static void registerWith(@NonNull FlutterEngine flutterEngine) { 18 | try { 19 | flutterEngine.getPlugins().add(new io.flutter.plugins.urllauncher.UrlLauncherPlugin()); 20 | } catch(Exception e) { 21 | Log.e(TAG, "Error registering plugin url_launcher_android, io.flutter.plugins.urllauncher.UrlLauncherPlugin", e); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /exmaple/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/exmaple/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /exmaple/android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /exmaple/android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /exmaple/android/local.properties: -------------------------------------------------------------------------------- 1 | sdk.dir=/Users/thruthesky/Library/Android/sdk 2 | flutter.sdk=/Users/thruthesky/bin/flutter -------------------------------------------------------------------------------- /exmaple/ios/.symlinks/plugins/url_launcher_ios: -------------------------------------------------------------------------------- 1 | /Users/thruthesky/.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.17/ -------------------------------------------------------------------------------- /exmaple/ios/Flutter/Flutter.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: This podspec is NOT to be published. It is only used as a local source! 3 | # This is a generated file; do not edit or check into version control. 4 | # 5 | 6 | Pod::Spec.new do |s| 7 | s.name = 'Flutter' 8 | s.version = '1.0.0' 9 | s.summary = 'A UI toolkit for beautiful and fast apps.' 10 | s.homepage = 'https://flutter.dev' 11 | s.license = { :type => 'BSD' } 12 | s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } 13 | s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } 14 | s.ios.deployment_target = '11.0' 15 | # Framework linking is handled by Flutter tooling, not CocoaPods. 16 | # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. 17 | s.vendored_frameworks = 'path/to/nothing' 18 | end 19 | -------------------------------------------------------------------------------- /exmaple/ios/Flutter/Generated.xcconfig: -------------------------------------------------------------------------------- 1 | // This is a generated file; do not edit or check into version control. 2 | FLUTTER_ROOT=/Users/thruthesky/bin/flutter 3 | FLUTTER_APPLICATION_PATH=/Users/thruthesky/apps/flutter/flutterflow_widgets/exmaple 4 | COCOAPODS_PARALLEL_CODE_SIGN=true 5 | FLUTTER_TARGET=lib/main.dart 6 | FLUTTER_BUILD_DIR=build 7 | FLUTTER_BUILD_NAME=1.0.0 8 | FLUTTER_BUILD_NUMBER=1 9 | EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 10 | EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 11 | DART_OBFUSCATION=false 12 | TRACK_WIDGET_CREATION=true 13 | TREE_SHAKE_ICONS=false 14 | PACKAGE_CONFIG=.dart_tool/package_config.json 15 | -------------------------------------------------------------------------------- /exmaple/ios/Flutter/flutter_export_environment.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # This is a generated file; do not edit or check into version control. 3 | export "FLUTTER_ROOT=/Users/thruthesky/bin/flutter" 4 | export "FLUTTER_APPLICATION_PATH=/Users/thruthesky/apps/flutter/flutterflow_widgets/exmaple" 5 | export "COCOAPODS_PARALLEL_CODE_SIGN=true" 6 | export "FLUTTER_TARGET=lib/main.dart" 7 | export "FLUTTER_BUILD_DIR=build" 8 | export "FLUTTER_BUILD_NAME=1.0.0" 9 | export "FLUTTER_BUILD_NUMBER=1" 10 | export "DART_OBFUSCATION=false" 11 | export "TRACK_WIDGET_CREATION=true" 12 | export "TREE_SHAKE_ICONS=false" 13 | export "PACKAGE_CONFIG=.dart_tool/package_config.json" 14 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Local Podspecs/Flutter.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Flutter", 3 | "version": "1.0.0", 4 | "summary": "A UI toolkit for beautiful and fast apps.", 5 | "homepage": "https://flutter.dev", 6 | "license": { 7 | "type": "BSD" 8 | }, 9 | "authors": { 10 | "Flutter Dev Team": "flutter-dev@googlegroups.com" 11 | }, 12 | "source": { 13 | "git": "https://github.com/flutter/engine", 14 | "tag": "1.0.0" 15 | }, 16 | "platforms": { 17 | "ios": "11.0" 18 | }, 19 | "vendored_frameworks": "path/to/nothing" 20 | } 21 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Local Podspecs/url_launcher_ios.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "url_launcher_ios", 3 | "version": "0.0.1", 4 | "summary": "Flutter plugin for launching a URL.", 5 | "description": "A Flutter plugin for making the underlying platform (Android or iOS) launch a URL.", 6 | "homepage": "https://github.com/flutter/plugins/tree/main/packages/url_launcher", 7 | "license": { 8 | "type": "BSD", 9 | "file": "../LICENSE" 10 | }, 11 | "authors": { 12 | "Flutter Dev Team": "flutter-dev@googlegroups.com" 13 | }, 14 | "source": { 15 | "http": "https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_ios" 16 | }, 17 | "documentation_url": "https://pub.dev/packages/url_launcher", 18 | "source_files": "Classes/**/*", 19 | "public_header_files": "Classes/**/*.h", 20 | "dependencies": { 21 | "Flutter": [ 22 | 23 | ] 24 | }, 25 | "platforms": { 26 | "ios": "9.0" 27 | }, 28 | "pod_target_xcconfig": { 29 | "DEFINES_MODULE": "YES" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | 1EFDDC32A34D56D411E640A81DCD9E73 /* Flutter */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = 94078A06C17E946ADC1F2C06726219E5 /* Build configuration list for PBXAggregateTarget "Flutter" */; 13 | buildPhases = ( 14 | ); 15 | dependencies = ( 16 | ); 17 | name = Flutter; 18 | }; 19 | /* End PBXAggregateTarget section */ 20 | 21 | /* Begin PBXBuildFile section */ 22 | 246F00FEB697E9671659AD33B9221DF0 /* url_launcher_ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E13E7CD28D2D1BE59F2D3447B8E64AD1 /* url_launcher_ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 23 | 247B2892CA1E75B5944DE1FB0BDB5FAF /* FLTURLLauncherPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 888CE128DD390E54B37827FF7DF4822D /* FLTURLLauncherPlugin.m */; }; 24 | 30CED8E0DE9638051A46D71D430F60CA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 25 | 34C2BD83BE3A9970202CFE96F7AB52C3 /* url_launcher_ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5723F46C42A01679DA7ED6B25CB65C74 /* url_launcher_ios-dummy.m */; }; 26 | 53E0F8EFF11402C0979EA4B0E9F7E14F /* Pods-Runner-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B3C932BD54DBB963102A89E0F9E3948 /* Pods-Runner-dummy.m */; }; 27 | 62319EDA137F253138E84737ED11980B /* Pods-Runner-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 96BF45FBE2BC9AD7B2D7E56D01B5EE46 /* Pods-Runner-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 28 | 718108DC1E2B385521522BD6ECAD2285 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 29 | E68323EF6253EB06DEFEB41FA2A5B27E /* FLTURLLauncherPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E9D702F693BE36CB18E0869F573794E /* FLTURLLauncherPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30 | /* End PBXBuildFile section */ 31 | 32 | /* Begin PBXContainerItemProxy section */ 33 | 353BA8F5FCC335359CDF2BB91A78EEE4 /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = DF45E85925DF410BE416B32171F59C1F; 38 | remoteInfo = url_launcher_ios; 39 | }; 40 | 400C772EB92E15341134A7ED380EEDE2 /* PBXContainerItemProxy */ = { 41 | isa = PBXContainerItemProxy; 42 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 43 | proxyType = 1; 44 | remoteGlobalIDString = 1EFDDC32A34D56D411E640A81DCD9E73; 45 | remoteInfo = Flutter; 46 | }; 47 | 433A656739919BC5A274D12756E127E3 /* PBXContainerItemProxy */ = { 48 | isa = PBXContainerItemProxy; 49 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 50 | proxyType = 1; 51 | remoteGlobalIDString = 1EFDDC32A34D56D411E640A81DCD9E73; 52 | remoteInfo = Flutter; 53 | }; 54 | /* End PBXContainerItemProxy section */ 55 | 56 | /* Begin PBXFileReference section */ 57 | 0ED8C2B270AD648F0F67E3A7EEE50CDB /* url_launcher_ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "url_launcher_ios-Info.plist"; sourceTree = ""; }; 58 | 17A5513E6A8FB3CE308320CAF00116A5 /* url_launcher_ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = url_launcher_ios.debug.xcconfig; sourceTree = ""; }; 59 | 2143AD908044CDE272850B246F3A9EB5 /* Flutter.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Flutter.release.xcconfig; sourceTree = ""; }; 60 | 317C26B9A7CEDD34ADE8F37FAAB7AC20 /* Pods-Runner-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Runner-frameworks.sh"; sourceTree = ""; }; 61 | 51825CD8F0558EFA53D9510F0E5BFA16 /* Pods-Runner-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Runner-Info.plist"; sourceTree = ""; }; 62 | 5723F46C42A01679DA7ED6B25CB65C74 /* url_launcher_ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "url_launcher_ios-dummy.m"; sourceTree = ""; }; 63 | 582A55C20DBFC41DFC5E06D4996CC842 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; name = LICENSE; path = "../../../../../../../../../.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.17/LICENSE"; sourceTree = ""; }; 64 | 669E8F25E1897672BDB80B7EB784DA24 /* Pods-Runner */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-Runner"; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | 6E9D702F693BE36CB18E0869F573794E /* FLTURLLauncherPlugin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FLTURLLauncherPlugin.h; path = "../../../../../../../../../../.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.17/ios/Classes/FLTURLLauncherPlugin.h"; sourceTree = ""; }; 66 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 67 | 7B3C932BD54DBB963102A89E0F9E3948 /* Pods-Runner-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Runner-dummy.m"; sourceTree = ""; }; 68 | 7B7C06D35B3BC2BD649AAA1A489E49DA /* url_launcher_ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = url_launcher_ios; path = url_launcher_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 69 | 888CE128DD390E54B37827FF7DF4822D /* FLTURLLauncherPlugin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FLTURLLauncherPlugin.m; path = "../../../../../../../../../../.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.17/ios/Classes/FLTURLLauncherPlugin.m"; sourceTree = ""; }; 70 | 96BF45FBE2BC9AD7B2D7E56D01B5EE46 /* Pods-Runner-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Runner-umbrella.h"; sourceTree = ""; }; 71 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 72 | 9E03E8242D54634C9773568F1C74925F /* Flutter.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = Flutter.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 73 | 9F79F8269DC34AC56BB3D1D9652C0D86 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74 | AD1ADB294F6E5673A95F44CB8183071B /* url_launcher_ios-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "url_launcher_ios-prefix.pch"; sourceTree = ""; }; 75 | B463674953AE6F038D749FAD6C191891 /* Flutter.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Flutter.debug.xcconfig; sourceTree = ""; }; 76 | C6EA98402A94995D022D330B64B5203D /* Pods-Runner-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Runner-acknowledgements.markdown"; sourceTree = ""; }; 77 | CDAECCF4B5E08124ED410F09FD5A5DF9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 78 | D1CB4F3C890964FBBF8A96BA2ED08CDB /* url_launcher_ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = url_launcher_ios.modulemap; sourceTree = ""; }; 79 | D2FA70CA298C392CB8332ADEEDD1CE85 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Runner.release.xcconfig"; sourceTree = ""; }; 80 | D9F2B4CB813B4BDC4D164C6E0868930A /* Pods-Runner-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Runner-acknowledgements.plist"; sourceTree = ""; }; 81 | DA991DADC118CB35CA44F40BA7203FE4 /* url_launcher_ios.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = url_launcher_ios.podspec; path = "../../../../../../../../../.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.17/ios/url_launcher_ios.podspec"; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 82 | DAB7F28FAAA9E32A93A47FA53F621AB1 /* url_launcher_ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = url_launcher_ios.release.xcconfig; sourceTree = ""; }; 83 | E13E7CD28D2D1BE59F2D3447B8E64AD1 /* url_launcher_ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "url_launcher_ios-umbrella.h"; sourceTree = ""; }; 84 | F49C32B3B8CF59AB437BFD7314674868 /* Pods-Runner.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Runner.modulemap"; sourceTree = ""; }; 85 | /* End PBXFileReference section */ 86 | 87 | /* Begin PBXFrameworksBuildPhase section */ 88 | 49F83C54CE216E2B479DC2D2239C6E7D /* Frameworks */ = { 89 | isa = PBXFrameworksBuildPhase; 90 | buildActionMask = 2147483647; 91 | files = ( 92 | 30CED8E0DE9638051A46D71D430F60CA /* Foundation.framework in Frameworks */, 93 | ); 94 | runOnlyForDeploymentPostprocessing = 0; 95 | }; 96 | D5615FC37E5AE0D3839542E679097E33 /* Frameworks */ = { 97 | isa = PBXFrameworksBuildPhase; 98 | buildActionMask = 2147483647; 99 | files = ( 100 | 718108DC1E2B385521522BD6ECAD2285 /* Foundation.framework in Frameworks */, 101 | ); 102 | runOnlyForDeploymentPostprocessing = 0; 103 | }; 104 | /* End PBXFrameworksBuildPhase section */ 105 | 106 | /* Begin PBXGroup section */ 107 | 076DA8548DA70777D10108581A9BB5CA /* Classes */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 6E9D702F693BE36CB18E0869F573794E /* FLTURLLauncherPlugin.h */, 111 | 888CE128DD390E54B37827FF7DF4822D /* FLTURLLauncherPlugin.m */, 112 | ); 113 | name = Classes; 114 | path = Classes; 115 | sourceTree = ""; 116 | }; 117 | 097A709D13E6000C50D00A277BD0702D /* ios */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 076DA8548DA70777D10108581A9BB5CA /* Classes */, 121 | ); 122 | name = ios; 123 | path = ios; 124 | sourceTree = ""; 125 | }; 126 | 20DD6162DBE3E5844742880BB7EB0F19 /* url_launcher_ios */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 76AE62AAB1DC72144566CE104772B5F2 /* .. */, 130 | 39C1627C7388A86BB4F13F06FAD7CDFA /* Pod */, 131 | F0B7948103B2CA89B7790F1FF8D33201 /* Support Files */, 132 | ); 133 | name = url_launcher_ios; 134 | path = ../.symlinks/plugins/url_launcher_ios/ios; 135 | sourceTree = ""; 136 | }; 137 | 2AFCA577645887166D8786C0B84400C2 /* .. */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | 49C6E9643E4D4D356FF4A9B1FBD7BCD3 /* apps */, 141 | ); 142 | name = ..; 143 | path = ..; 144 | sourceTree = ""; 145 | }; 146 | 39C1627C7388A86BB4F13F06FAD7CDFA /* Pod */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | 582A55C20DBFC41DFC5E06D4996CC842 /* LICENSE */, 150 | DA991DADC118CB35CA44F40BA7203FE4 /* url_launcher_ios.podspec */, 151 | ); 152 | name = Pod; 153 | sourceTree = ""; 154 | }; 155 | 4028BD8700473F657686EDBDFC820DFE /* Pod */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 9E03E8242D54634C9773568F1C74925F /* Flutter.podspec */, 159 | ); 160 | name = Pod; 161 | sourceTree = ""; 162 | }; 163 | 408F3D4601BD2C74ABF0CDBB7AAF8307 /* .. */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | C0F430A5D99757E22403517541F05BD7 /* .. */, 167 | ); 168 | name = ..; 169 | path = ..; 170 | sourceTree = ""; 171 | }; 172 | 49C6E9643E4D4D356FF4A9B1FBD7BCD3 /* apps */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | B713908FE440EB2B0A41F28C67C68321 /* flutter */, 176 | ); 177 | name = apps; 178 | path = apps; 179 | sourceTree = ""; 180 | }; 181 | 578452D2E740E91742655AC8F1636D1F /* iOS */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, 185 | ); 186 | name = iOS; 187 | sourceTree = ""; 188 | }; 189 | 58DAB9C06D6C1534D88E3C635329F78C /* .. */ = { 190 | isa = PBXGroup; 191 | children = ( 192 | 408F3D4601BD2C74ABF0CDBB7AAF8307 /* .. */, 193 | ); 194 | name = ..; 195 | path = ..; 196 | sourceTree = ""; 197 | }; 198 | 64D537B62F0891132A43CFC0C32645CE /* flutterflow_widgets */ = { 199 | isa = PBXGroup; 200 | children = ( 201 | FF020E4FEAB3EE5A702979B08E74DAB1 /* exmaple */, 202 | ); 203 | name = flutterflow_widgets; 204 | path = flutterflow_widgets; 205 | sourceTree = ""; 206 | }; 207 | 72C37E23EE2A1E581C9117C7964A2CB5 /* Support Files */ = { 208 | isa = PBXGroup; 209 | children = ( 210 | B463674953AE6F038D749FAD6C191891 /* Flutter.debug.xcconfig */, 211 | 2143AD908044CDE272850B246F3A9EB5 /* Flutter.release.xcconfig */, 212 | ); 213 | name = "Support Files"; 214 | path = "../Pods/Target Support Files/Flutter"; 215 | sourceTree = ""; 216 | }; 217 | 76AE62AAB1DC72144566CE104772B5F2 /* .. */ = { 218 | isa = PBXGroup; 219 | children = ( 220 | 7E7E90DD6C101EE65D1ADEDAA5A5DC08 /* .. */, 221 | ); 222 | name = ..; 223 | path = "../../../../../../../../../.pub-cache/hosted/pub.dartlang.org/url_launcher_ios-6.0.17/ios"; 224 | sourceTree = ""; 225 | }; 226 | 791C6E4B424AF06279F8918FA67B8ED6 /* Targets Support Files */ = { 227 | isa = PBXGroup; 228 | children = ( 229 | 7B0D67477903E1EB8D6A9F9AF51BC5CC /* Pods-Runner */, 230 | ); 231 | name = "Targets Support Files"; 232 | sourceTree = ""; 233 | }; 234 | 7B0D67477903E1EB8D6A9F9AF51BC5CC /* Pods-Runner */ = { 235 | isa = PBXGroup; 236 | children = ( 237 | F49C32B3B8CF59AB437BFD7314674868 /* Pods-Runner.modulemap */, 238 | C6EA98402A94995D022D330B64B5203D /* Pods-Runner-acknowledgements.markdown */, 239 | D9F2B4CB813B4BDC4D164C6E0868930A /* Pods-Runner-acknowledgements.plist */, 240 | 7B3C932BD54DBB963102A89E0F9E3948 /* Pods-Runner-dummy.m */, 241 | 317C26B9A7CEDD34ADE8F37FAAB7AC20 /* Pods-Runner-frameworks.sh */, 242 | 51825CD8F0558EFA53D9510F0E5BFA16 /* Pods-Runner-Info.plist */, 243 | 96BF45FBE2BC9AD7B2D7E56D01B5EE46 /* Pods-Runner-umbrella.h */, 244 | CDAECCF4B5E08124ED410F09FD5A5DF9 /* Pods-Runner.debug.xcconfig */, 245 | 9F79F8269DC34AC56BB3D1D9652C0D86 /* Pods-Runner.profile.xcconfig */, 246 | D2FA70CA298C392CB8332ADEEDD1CE85 /* Pods-Runner.release.xcconfig */, 247 | ); 248 | name = "Pods-Runner"; 249 | path = "Target Support Files/Pods-Runner"; 250 | sourceTree = ""; 251 | }; 252 | 7E7E90DD6C101EE65D1ADEDAA5A5DC08 /* .. */ = { 253 | isa = PBXGroup; 254 | children = ( 255 | 58DAB9C06D6C1534D88E3C635329F78C /* .. */, 256 | ); 257 | name = ..; 258 | path = ..; 259 | sourceTree = ""; 260 | }; 261 | 956BA9A48320B59F465BAD441D72264F /* Flutter */ = { 262 | isa = PBXGroup; 263 | children = ( 264 | 4028BD8700473F657686EDBDFC820DFE /* Pod */, 265 | 72C37E23EE2A1E581C9117C7964A2CB5 /* Support Files */, 266 | ); 267 | name = Flutter; 268 | path = ../Flutter; 269 | sourceTree = ""; 270 | }; 271 | 9BFEBDC7A4CCB14D2630BF46A8A02C32 /* plugins */ = { 272 | isa = PBXGroup; 273 | children = ( 274 | E022611ADA6CE32933F038576AC64E28 /* url_launcher_ios */, 275 | ); 276 | name = plugins; 277 | path = plugins; 278 | sourceTree = ""; 279 | }; 280 | B48829168F724B12BC49D4974CFC0A39 /* Products */ = { 281 | isa = PBXGroup; 282 | children = ( 283 | 669E8F25E1897672BDB80B7EB784DA24 /* Pods-Runner */, 284 | 7B7C06D35B3BC2BD649AAA1A489E49DA /* url_launcher_ios */, 285 | ); 286 | name = Products; 287 | sourceTree = ""; 288 | }; 289 | B713908FE440EB2B0A41F28C67C68321 /* flutter */ = { 290 | isa = PBXGroup; 291 | children = ( 292 | 64D537B62F0891132A43CFC0C32645CE /* flutterflow_widgets */, 293 | ); 294 | name = flutter; 295 | path = flutter; 296 | sourceTree = ""; 297 | }; 298 | C0F430A5D99757E22403517541F05BD7 /* .. */ = { 299 | isa = PBXGroup; 300 | children = ( 301 | 2AFCA577645887166D8786C0B84400C2 /* .. */, 302 | ); 303 | name = ..; 304 | path = ..; 305 | sourceTree = ""; 306 | }; 307 | C44DE50E6457A886780D5DF90C8AA474 /* Development Pods */ = { 308 | isa = PBXGroup; 309 | children = ( 310 | 956BA9A48320B59F465BAD441D72264F /* Flutter */, 311 | 20DD6162DBE3E5844742880BB7EB0F19 /* url_launcher_ios */, 312 | ); 313 | name = "Development Pods"; 314 | sourceTree = ""; 315 | }; 316 | C71643270774DE420A5DBB02D74EFCDC /* ios */ = { 317 | isa = PBXGroup; 318 | children = ( 319 | FA7FDDEAE7974B967C3653FE64543B35 /* .symlinks */, 320 | ); 321 | name = ios; 322 | path = ios; 323 | sourceTree = ""; 324 | }; 325 | CF1408CF629C7361332E53B88F7BD30C = { 326 | isa = PBXGroup; 327 | children = ( 328 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 329 | C44DE50E6457A886780D5DF90C8AA474 /* Development Pods */, 330 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 331 | B48829168F724B12BC49D4974CFC0A39 /* Products */, 332 | 791C6E4B424AF06279F8918FA67B8ED6 /* Targets Support Files */, 333 | ); 334 | sourceTree = ""; 335 | }; 336 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 337 | isa = PBXGroup; 338 | children = ( 339 | 578452D2E740E91742655AC8F1636D1F /* iOS */, 340 | ); 341 | name = Frameworks; 342 | sourceTree = ""; 343 | }; 344 | E022611ADA6CE32933F038576AC64E28 /* url_launcher_ios */ = { 345 | isa = PBXGroup; 346 | children = ( 347 | 097A709D13E6000C50D00A277BD0702D /* ios */, 348 | ); 349 | name = url_launcher_ios; 350 | path = url_launcher_ios; 351 | sourceTree = ""; 352 | }; 353 | F0B7948103B2CA89B7790F1FF8D33201 /* Support Files */ = { 354 | isa = PBXGroup; 355 | children = ( 356 | D1CB4F3C890964FBBF8A96BA2ED08CDB /* url_launcher_ios.modulemap */, 357 | 5723F46C42A01679DA7ED6B25CB65C74 /* url_launcher_ios-dummy.m */, 358 | 0ED8C2B270AD648F0F67E3A7EEE50CDB /* url_launcher_ios-Info.plist */, 359 | AD1ADB294F6E5673A95F44CB8183071B /* url_launcher_ios-prefix.pch */, 360 | E13E7CD28D2D1BE59F2D3447B8E64AD1 /* url_launcher_ios-umbrella.h */, 361 | 17A5513E6A8FB3CE308320CAF00116A5 /* url_launcher_ios.debug.xcconfig */, 362 | DAB7F28FAAA9E32A93A47FA53F621AB1 /* url_launcher_ios.release.xcconfig */, 363 | ); 364 | name = "Support Files"; 365 | path = "../../../../Pods/Target Support Files/url_launcher_ios"; 366 | sourceTree = ""; 367 | }; 368 | FA7FDDEAE7974B967C3653FE64543B35 /* .symlinks */ = { 369 | isa = PBXGroup; 370 | children = ( 371 | 9BFEBDC7A4CCB14D2630BF46A8A02C32 /* plugins */, 372 | ); 373 | name = .symlinks; 374 | path = .symlinks; 375 | sourceTree = ""; 376 | }; 377 | FF020E4FEAB3EE5A702979B08E74DAB1 /* exmaple */ = { 378 | isa = PBXGroup; 379 | children = ( 380 | C71643270774DE420A5DBB02D74EFCDC /* ios */, 381 | ); 382 | name = exmaple; 383 | path = exmaple; 384 | sourceTree = ""; 385 | }; 386 | /* End PBXGroup section */ 387 | 388 | /* Begin PBXHeadersBuildPhase section */ 389 | 65E577FBAEF0DDD079C9F45CFC043884 /* Headers */ = { 390 | isa = PBXHeadersBuildPhase; 391 | buildActionMask = 2147483647; 392 | files = ( 393 | 62319EDA137F253138E84737ED11980B /* Pods-Runner-umbrella.h in Headers */, 394 | ); 395 | runOnlyForDeploymentPostprocessing = 0; 396 | }; 397 | 796E178C3A65D152F9E76998E8266020 /* Headers */ = { 398 | isa = PBXHeadersBuildPhase; 399 | buildActionMask = 2147483647; 400 | files = ( 401 | E68323EF6253EB06DEFEB41FA2A5B27E /* FLTURLLauncherPlugin.h in Headers */, 402 | 246F00FEB697E9671659AD33B9221DF0 /* url_launcher_ios-umbrella.h in Headers */, 403 | ); 404 | runOnlyForDeploymentPostprocessing = 0; 405 | }; 406 | /* End PBXHeadersBuildPhase section */ 407 | 408 | /* Begin PBXNativeTarget section */ 409 | 8B74B458B450D74B75744B87BD747314 /* Pods-Runner */ = { 410 | isa = PBXNativeTarget; 411 | buildConfigurationList = EF7023EC6D1AD8640E942883C152B08C /* Build configuration list for PBXNativeTarget "Pods-Runner" */; 412 | buildPhases = ( 413 | 65E577FBAEF0DDD079C9F45CFC043884 /* Headers */, 414 | 78756CDCD8186E53BE0A2E42C135D220 /* Sources */, 415 | D5615FC37E5AE0D3839542E679097E33 /* Frameworks */, 416 | 846890693D41FED91C8B4EBCDA219485 /* Resources */, 417 | ); 418 | buildRules = ( 419 | ); 420 | dependencies = ( 421 | BC41DCE1D5086987593FE79FC8484A8A /* PBXTargetDependency */, 422 | FE39896B8A0C1A03E86DA2DBF6E19F39 /* PBXTargetDependency */, 423 | ); 424 | name = "Pods-Runner"; 425 | productName = Pods_Runner; 426 | productReference = 669E8F25E1897672BDB80B7EB784DA24 /* Pods-Runner */; 427 | productType = "com.apple.product-type.framework"; 428 | }; 429 | DF45E85925DF410BE416B32171F59C1F /* url_launcher_ios */ = { 430 | isa = PBXNativeTarget; 431 | buildConfigurationList = 7A89E4A4D6E464861B7EA2FCA373B67F /* Build configuration list for PBXNativeTarget "url_launcher_ios" */; 432 | buildPhases = ( 433 | 796E178C3A65D152F9E76998E8266020 /* Headers */, 434 | 437CD89D9E5DC82E368F14712082BCD7 /* Sources */, 435 | 49F83C54CE216E2B479DC2D2239C6E7D /* Frameworks */, 436 | DFF8BF4F68E5B5FCCB757A09B6A42AA1 /* Resources */, 437 | ); 438 | buildRules = ( 439 | ); 440 | dependencies = ( 441 | B8D6A4163C8C9D23F58D3A8442678446 /* PBXTargetDependency */, 442 | ); 443 | name = url_launcher_ios; 444 | productName = url_launcher_ios; 445 | productReference = 7B7C06D35B3BC2BD649AAA1A489E49DA /* url_launcher_ios */; 446 | productType = "com.apple.product-type.framework"; 447 | }; 448 | /* End PBXNativeTarget section */ 449 | 450 | /* Begin PBXProject section */ 451 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 452 | isa = PBXProject; 453 | attributes = { 454 | LastSwiftUpdateCheck = 1240; 455 | LastUpgradeCheck = 1240; 456 | }; 457 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 458 | compatibilityVersion = "Xcode 9.3"; 459 | developmentRegion = en; 460 | hasScannedForEncodings = 0; 461 | knownRegions = ( 462 | Base, 463 | en, 464 | ); 465 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 466 | productRefGroup = B48829168F724B12BC49D4974CFC0A39 /* Products */; 467 | projectDirPath = ""; 468 | projectRoot = ""; 469 | targets = ( 470 | 1EFDDC32A34D56D411E640A81DCD9E73 /* Flutter */, 471 | 8B74B458B450D74B75744B87BD747314 /* Pods-Runner */, 472 | DF45E85925DF410BE416B32171F59C1F /* url_launcher_ios */, 473 | ); 474 | }; 475 | /* End PBXProject section */ 476 | 477 | /* Begin PBXResourcesBuildPhase section */ 478 | 846890693D41FED91C8B4EBCDA219485 /* Resources */ = { 479 | isa = PBXResourcesBuildPhase; 480 | buildActionMask = 2147483647; 481 | files = ( 482 | ); 483 | runOnlyForDeploymentPostprocessing = 0; 484 | }; 485 | DFF8BF4F68E5B5FCCB757A09B6A42AA1 /* Resources */ = { 486 | isa = PBXResourcesBuildPhase; 487 | buildActionMask = 2147483647; 488 | files = ( 489 | ); 490 | runOnlyForDeploymentPostprocessing = 0; 491 | }; 492 | /* End PBXResourcesBuildPhase section */ 493 | 494 | /* Begin PBXSourcesBuildPhase section */ 495 | 437CD89D9E5DC82E368F14712082BCD7 /* Sources */ = { 496 | isa = PBXSourcesBuildPhase; 497 | buildActionMask = 2147483647; 498 | files = ( 499 | 247B2892CA1E75B5944DE1FB0BDB5FAF /* FLTURLLauncherPlugin.m in Sources */, 500 | 34C2BD83BE3A9970202CFE96F7AB52C3 /* url_launcher_ios-dummy.m in Sources */, 501 | ); 502 | runOnlyForDeploymentPostprocessing = 0; 503 | }; 504 | 78756CDCD8186E53BE0A2E42C135D220 /* Sources */ = { 505 | isa = PBXSourcesBuildPhase; 506 | buildActionMask = 2147483647; 507 | files = ( 508 | 53E0F8EFF11402C0979EA4B0E9F7E14F /* Pods-Runner-dummy.m in Sources */, 509 | ); 510 | runOnlyForDeploymentPostprocessing = 0; 511 | }; 512 | /* End PBXSourcesBuildPhase section */ 513 | 514 | /* Begin PBXTargetDependency section */ 515 | B8D6A4163C8C9D23F58D3A8442678446 /* PBXTargetDependency */ = { 516 | isa = PBXTargetDependency; 517 | name = Flutter; 518 | target = 1EFDDC32A34D56D411E640A81DCD9E73 /* Flutter */; 519 | targetProxy = 433A656739919BC5A274D12756E127E3 /* PBXContainerItemProxy */; 520 | }; 521 | BC41DCE1D5086987593FE79FC8484A8A /* PBXTargetDependency */ = { 522 | isa = PBXTargetDependency; 523 | name = Flutter; 524 | target = 1EFDDC32A34D56D411E640A81DCD9E73 /* Flutter */; 525 | targetProxy = 400C772EB92E15341134A7ED380EEDE2 /* PBXContainerItemProxy */; 526 | }; 527 | FE39896B8A0C1A03E86DA2DBF6E19F39 /* PBXTargetDependency */ = { 528 | isa = PBXTargetDependency; 529 | name = url_launcher_ios; 530 | target = DF45E85925DF410BE416B32171F59C1F /* url_launcher_ios */; 531 | targetProxy = 353BA8F5FCC335359CDF2BB91A78EEE4 /* PBXContainerItemProxy */; 532 | }; 533 | /* End PBXTargetDependency section */ 534 | 535 | /* Begin XCBuildConfiguration section */ 536 | 123B0D65A35211FC43B8BEE770443D25 /* Release */ = { 537 | isa = XCBuildConfiguration; 538 | baseConfigurationReference = 2143AD908044CDE272850B246F3A9EB5 /* Flutter.release.xcconfig */; 539 | buildSettings = { 540 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 541 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 542 | CLANG_ENABLE_OBJC_WEAK = NO; 543 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 544 | LD_RUNPATH_SEARCH_PATHS = ( 545 | "$(inherited)", 546 | "@executable_path/Frameworks", 547 | ); 548 | SDKROOT = iphoneos; 549 | TARGETED_DEVICE_FAMILY = "1,2"; 550 | VALIDATE_PRODUCT = YES; 551 | }; 552 | name = Release; 553 | }; 554 | 1753484A064BD2DDF8936BD022F2A683 /* Debug */ = { 555 | isa = XCBuildConfiguration; 556 | baseConfigurationReference = CDAECCF4B5E08124ED410F09FD5A5DF9 /* Pods-Runner.debug.xcconfig */; 557 | buildSettings = { 558 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 559 | CLANG_ENABLE_OBJC_WEAK = NO; 560 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 561 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 562 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 563 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 564 | CURRENT_PROJECT_VERSION = 1; 565 | DEFINES_MODULE = YES; 566 | DYLIB_COMPATIBILITY_VERSION = 1; 567 | DYLIB_CURRENT_VERSION = 1; 568 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 569 | "EXCLUDED_ARCHS[sdk=iphoneos*]" = "$(inherited) armv7"; 570 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "$(inherited) i386"; 571 | "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]" = ( 572 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\"", 573 | "$(inherited)", 574 | ); 575 | "FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]" = ( 576 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\"", 577 | "$(inherited)", 578 | ); 579 | INFOPLIST_FILE = "Target Support Files/Pods-Runner/Pods-Runner-Info.plist"; 580 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 581 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 582 | LD_RUNPATH_SEARCH_PATHS = ( 583 | "$(inherited)", 584 | "@executable_path/Frameworks", 585 | "@loader_path/Frameworks", 586 | ); 587 | MACH_O_TYPE = staticlib; 588 | MODULEMAP_FILE = "Target Support Files/Pods-Runner/Pods-Runner.modulemap"; 589 | ONLY_ACTIVE_ARCH = NO; 590 | OTHER_LDFLAGS = ( 591 | "$(inherited)", 592 | "-framework", 593 | Flutter, 594 | ); 595 | OTHER_LIBTOOLFLAGS = ""; 596 | PODS_ROOT = "$(SRCROOT)"; 597 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 598 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 599 | SDKROOT = iphoneos; 600 | SKIP_INSTALL = YES; 601 | TARGETED_DEVICE_FAMILY = "1,2"; 602 | "VALID_ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; 603 | VERSIONING_SYSTEM = "apple-generic"; 604 | VERSION_INFO_PREFIX = ""; 605 | }; 606 | name = Debug; 607 | }; 608 | 2E26C48A39B9B419F13A47556E00FB0F /* Release */ = { 609 | isa = XCBuildConfiguration; 610 | baseConfigurationReference = D2FA70CA298C392CB8332ADEEDD1CE85 /* Pods-Runner.release.xcconfig */; 611 | buildSettings = { 612 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 613 | CLANG_ENABLE_OBJC_WEAK = NO; 614 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 615 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 616 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 617 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 618 | CURRENT_PROJECT_VERSION = 1; 619 | DEFINES_MODULE = YES; 620 | DYLIB_COMPATIBILITY_VERSION = 1; 621 | DYLIB_CURRENT_VERSION = 1; 622 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 623 | "EXCLUDED_ARCHS[sdk=iphoneos*]" = "$(inherited) armv7"; 624 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "$(inherited) i386"; 625 | "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]" = ( 626 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\"", 627 | "$(inherited)", 628 | ); 629 | "FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]" = ( 630 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\"", 631 | "$(inherited)", 632 | ); 633 | INFOPLIST_FILE = "Target Support Files/Pods-Runner/Pods-Runner-Info.plist"; 634 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 635 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 636 | LD_RUNPATH_SEARCH_PATHS = ( 637 | "$(inherited)", 638 | "@executable_path/Frameworks", 639 | "@loader_path/Frameworks", 640 | ); 641 | MACH_O_TYPE = staticlib; 642 | MODULEMAP_FILE = "Target Support Files/Pods-Runner/Pods-Runner.modulemap"; 643 | OTHER_LDFLAGS = ( 644 | "$(inherited)", 645 | "-framework", 646 | Flutter, 647 | ); 648 | OTHER_LIBTOOLFLAGS = ""; 649 | PODS_ROOT = "$(SRCROOT)"; 650 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 651 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 652 | SDKROOT = iphoneos; 653 | SKIP_INSTALL = YES; 654 | TARGETED_DEVICE_FAMILY = "1,2"; 655 | VALIDATE_PRODUCT = YES; 656 | "VALID_ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; 657 | VERSIONING_SYSTEM = "apple-generic"; 658 | VERSION_INFO_PREFIX = ""; 659 | }; 660 | name = Release; 661 | }; 662 | 58A635DDE1A58ED5433FF9AE32BEBB02 /* Profile */ = { 663 | isa = XCBuildConfiguration; 664 | baseConfigurationReference = 9F79F8269DC34AC56BB3D1D9652C0D86 /* Pods-Runner.profile.xcconfig */; 665 | buildSettings = { 666 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 667 | CLANG_ENABLE_OBJC_WEAK = NO; 668 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 669 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 670 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 671 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 672 | CURRENT_PROJECT_VERSION = 1; 673 | DEFINES_MODULE = YES; 674 | DYLIB_COMPATIBILITY_VERSION = 1; 675 | DYLIB_CURRENT_VERSION = 1; 676 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 677 | "EXCLUDED_ARCHS[sdk=iphoneos*]" = "$(inherited) armv7"; 678 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "$(inherited) i386"; 679 | "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]" = ( 680 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\"", 681 | "$(inherited)", 682 | ); 683 | "FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]" = ( 684 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\"", 685 | "$(inherited)", 686 | ); 687 | INFOPLIST_FILE = "Target Support Files/Pods-Runner/Pods-Runner-Info.plist"; 688 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 689 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 690 | LD_RUNPATH_SEARCH_PATHS = ( 691 | "$(inherited)", 692 | "@executable_path/Frameworks", 693 | "@loader_path/Frameworks", 694 | ); 695 | MACH_O_TYPE = staticlib; 696 | MODULEMAP_FILE = "Target Support Files/Pods-Runner/Pods-Runner.modulemap"; 697 | OTHER_LDFLAGS = ( 698 | "$(inherited)", 699 | "-framework", 700 | Flutter, 701 | ); 702 | OTHER_LIBTOOLFLAGS = ""; 703 | PODS_ROOT = "$(SRCROOT)"; 704 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 705 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 706 | SDKROOT = iphoneos; 707 | SKIP_INSTALL = YES; 708 | TARGETED_DEVICE_FAMILY = "1,2"; 709 | VALIDATE_PRODUCT = YES; 710 | "VALID_ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; 711 | VERSIONING_SYSTEM = "apple-generic"; 712 | VERSION_INFO_PREFIX = ""; 713 | }; 714 | name = Profile; 715 | }; 716 | 5DC85DDD82C4F8CD007F4637CEE932F6 /* Release */ = { 717 | isa = XCBuildConfiguration; 718 | baseConfigurationReference = DAB7F28FAAA9E32A93A47FA53F621AB1 /* url_launcher_ios.release.xcconfig */; 719 | buildSettings = { 720 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 721 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 722 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 723 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 724 | CURRENT_PROJECT_VERSION = 1; 725 | DYLIB_COMPATIBILITY_VERSION = 1; 726 | DYLIB_CURRENT_VERSION = 1; 727 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 728 | "EXCLUDED_ARCHS[sdk=iphoneos*]" = "$(inherited) armv7"; 729 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "$(inherited) i386"; 730 | "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]" = ( 731 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\"", 732 | "$(inherited)", 733 | ); 734 | "FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]" = ( 735 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\"", 736 | "$(inherited)", 737 | ); 738 | GCC_PREFIX_HEADER = "Target Support Files/url_launcher_ios/url_launcher_ios-prefix.pch"; 739 | INFOPLIST_FILE = "Target Support Files/url_launcher_ios/url_launcher_ios-Info.plist"; 740 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 741 | LD_RUNPATH_SEARCH_PATHS = ( 742 | "$(inherited)", 743 | "@executable_path/Frameworks", 744 | "@loader_path/Frameworks", 745 | ); 746 | MODULEMAP_FILE = "Target Support Files/url_launcher_ios/url_launcher_ios.modulemap"; 747 | OTHER_LDFLAGS = ( 748 | "$(inherited)", 749 | "-framework", 750 | Flutter, 751 | ); 752 | PRODUCT_MODULE_NAME = url_launcher_ios; 753 | PRODUCT_NAME = url_launcher_ios; 754 | SDKROOT = iphoneos; 755 | SKIP_INSTALL = YES; 756 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 757 | SWIFT_VERSION = 5.0; 758 | TARGETED_DEVICE_FAMILY = "1,2"; 759 | VALIDATE_PRODUCT = YES; 760 | "VALID_ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; 761 | VERSIONING_SYSTEM = "apple-generic"; 762 | VERSION_INFO_PREFIX = ""; 763 | }; 764 | name = Release; 765 | }; 766 | 84D798D6A5C4F89004A7D95C2A05A21A /* Debug */ = { 767 | isa = XCBuildConfiguration; 768 | baseConfigurationReference = 17A5513E6A8FB3CE308320CAF00116A5 /* url_launcher_ios.debug.xcconfig */; 769 | buildSettings = { 770 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 771 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 772 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 773 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 774 | CURRENT_PROJECT_VERSION = 1; 775 | DYLIB_COMPATIBILITY_VERSION = 1; 776 | DYLIB_CURRENT_VERSION = 1; 777 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 778 | "EXCLUDED_ARCHS[sdk=iphoneos*]" = "$(inherited) armv7"; 779 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "$(inherited) i386"; 780 | "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]" = ( 781 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64\"", 782 | "$(inherited)", 783 | ); 784 | "FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]" = ( 785 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios/Flutter.xcframework/ios-arm64_x86_64-simulator\"", 786 | "$(inherited)", 787 | ); 788 | GCC_PREFIX_HEADER = "Target Support Files/url_launcher_ios/url_launcher_ios-prefix.pch"; 789 | INFOPLIST_FILE = "Target Support Files/url_launcher_ios/url_launcher_ios-Info.plist"; 790 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 791 | LD_RUNPATH_SEARCH_PATHS = ( 792 | "$(inherited)", 793 | "@executable_path/Frameworks", 794 | "@loader_path/Frameworks", 795 | ); 796 | MODULEMAP_FILE = "Target Support Files/url_launcher_ios/url_launcher_ios.modulemap"; 797 | ONLY_ACTIVE_ARCH = NO; 798 | OTHER_LDFLAGS = ( 799 | "$(inherited)", 800 | "-framework", 801 | Flutter, 802 | ); 803 | PRODUCT_MODULE_NAME = url_launcher_ios; 804 | PRODUCT_NAME = url_launcher_ios; 805 | SDKROOT = iphoneos; 806 | SKIP_INSTALL = YES; 807 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 808 | SWIFT_VERSION = 5.0; 809 | TARGETED_DEVICE_FAMILY = "1,2"; 810 | "VALID_ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; 811 | VERSIONING_SYSTEM = "apple-generic"; 812 | VERSION_INFO_PREFIX = ""; 813 | }; 814 | name = Debug; 815 | }; 816 | 903A0004D3E6651EFD5D2E16214D101B /* Release */ = { 817 | isa = XCBuildConfiguration; 818 | buildSettings = { 819 | ALWAYS_SEARCH_USER_PATHS = NO; 820 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 821 | CLANG_ANALYZER_NONNULL = YES; 822 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 823 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 824 | CLANG_CXX_LIBRARY = "libc++"; 825 | CLANG_ENABLE_MODULES = YES; 826 | CLANG_ENABLE_OBJC_ARC = YES; 827 | CLANG_ENABLE_OBJC_WEAK = YES; 828 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 829 | CLANG_WARN_BOOL_CONVERSION = YES; 830 | CLANG_WARN_COMMA = YES; 831 | CLANG_WARN_CONSTANT_CONVERSION = YES; 832 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 833 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 834 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 835 | CLANG_WARN_EMPTY_BODY = YES; 836 | CLANG_WARN_ENUM_CONVERSION = YES; 837 | CLANG_WARN_INFINITE_RECURSION = YES; 838 | CLANG_WARN_INT_CONVERSION = YES; 839 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 840 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 841 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 842 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 843 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 844 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 845 | CLANG_WARN_STRICT_PROTOTYPES = YES; 846 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 847 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 848 | CLANG_WARN_UNREACHABLE_CODE = YES; 849 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 850 | COPY_PHASE_STRIP = NO; 851 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 852 | ENABLE_NS_ASSERTIONS = NO; 853 | ENABLE_STRICT_OBJC_MSGSEND = YES; 854 | GCC_C_LANGUAGE_STANDARD = gnu11; 855 | GCC_NO_COMMON_BLOCKS = YES; 856 | GCC_PREPROCESSOR_DEFINITIONS = ( 857 | "POD_CONFIGURATION_RELEASE=1", 858 | "$(inherited)", 859 | ); 860 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 861 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 862 | GCC_WARN_UNDECLARED_SELECTOR = YES; 863 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 864 | GCC_WARN_UNUSED_FUNCTION = YES; 865 | GCC_WARN_UNUSED_VARIABLE = YES; 866 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 867 | MTL_ENABLE_DEBUG_INFO = NO; 868 | MTL_FAST_MATH = YES; 869 | PRODUCT_NAME = "$(TARGET_NAME)"; 870 | STRIP_INSTALLED_PRODUCT = NO; 871 | SWIFT_COMPILATION_MODE = wholemodule; 872 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 873 | SWIFT_VERSION = 5.0; 874 | SYMROOT = "${SRCROOT}/../build"; 875 | }; 876 | name = Release; 877 | }; 878 | 9498D2532E60DBDF41603C51B60E35E8 /* Profile */ = { 879 | isa = XCBuildConfiguration; 880 | baseConfigurationReference = 2143AD908044CDE272850B246F3A9EB5 /* Flutter.release.xcconfig */; 881 | buildSettings = { 882 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 883 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 884 | CLANG_ENABLE_OBJC_WEAK = NO; 885 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 886 | LD_RUNPATH_SEARCH_PATHS = ( 887 | "$(inherited)", 888 | "@executable_path/Frameworks", 889 | ); 890 | SDKROOT = iphoneos; 891 | TARGETED_DEVICE_FAMILY = "1,2"; 892 | VALIDATE_PRODUCT = YES; 893 | }; 894 | name = Profile; 895 | }; 896 | 9B6B60BE14F99BB732F5537C441456E1 /* Profile */ = { 897 | isa = XCBuildConfiguration; 898 | baseConfigurationReference = DAB7F28FAAA9E32A93A47FA53F621AB1 /* url_launcher_ios.release.xcconfig */; 899 | buildSettings = { 900 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 901 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 902 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 903 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 904 | CURRENT_PROJECT_VERSION = 1; 905 | DYLIB_COMPATIBILITY_VERSION = 1; 906 | DYLIB_CURRENT_VERSION = 1; 907 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 908 | "EXCLUDED_ARCHS[sdk=iphoneos*]" = "$(inherited) armv7"; 909 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "$(inherited) i386"; 910 | "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]" = ( 911 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64\"", 912 | "$(inherited)", 913 | ); 914 | "FRAMEWORK_SEARCH_PATHS[sdk=iphonesimulator*]" = ( 915 | "\"/Users/thruthesky/bin/flutter/bin/cache/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64_x86_64-simulator\"", 916 | "$(inherited)", 917 | ); 918 | GCC_PREFIX_HEADER = "Target Support Files/url_launcher_ios/url_launcher_ios-prefix.pch"; 919 | INFOPLIST_FILE = "Target Support Files/url_launcher_ios/url_launcher_ios-Info.plist"; 920 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 921 | LD_RUNPATH_SEARCH_PATHS = ( 922 | "$(inherited)", 923 | "@executable_path/Frameworks", 924 | "@loader_path/Frameworks", 925 | ); 926 | MODULEMAP_FILE = "Target Support Files/url_launcher_ios/url_launcher_ios.modulemap"; 927 | OTHER_LDFLAGS = ( 928 | "$(inherited)", 929 | "-framework", 930 | Flutter, 931 | ); 932 | PRODUCT_MODULE_NAME = url_launcher_ios; 933 | PRODUCT_NAME = url_launcher_ios; 934 | SDKROOT = iphoneos; 935 | SKIP_INSTALL = YES; 936 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 937 | SWIFT_VERSION = 5.0; 938 | TARGETED_DEVICE_FAMILY = "1,2"; 939 | VALIDATE_PRODUCT = YES; 940 | "VALID_ARCHS[sdk=iphonesimulator*]" = "$(ARCHS_STANDARD)"; 941 | VERSIONING_SYSTEM = "apple-generic"; 942 | VERSION_INFO_PREFIX = ""; 943 | }; 944 | name = Profile; 945 | }; 946 | A045C7A6D99F4F60840B1F19D32848E6 /* Debug */ = { 947 | isa = XCBuildConfiguration; 948 | baseConfigurationReference = B463674953AE6F038D749FAD6C191891 /* Flutter.debug.xcconfig */; 949 | buildSettings = { 950 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 951 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 952 | CLANG_ENABLE_OBJC_WEAK = NO; 953 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 954 | LD_RUNPATH_SEARCH_PATHS = ( 955 | "$(inherited)", 956 | "@executable_path/Frameworks", 957 | ); 958 | ONLY_ACTIVE_ARCH = NO; 959 | SDKROOT = iphoneos; 960 | TARGETED_DEVICE_FAMILY = "1,2"; 961 | }; 962 | name = Debug; 963 | }; 964 | B4EFE046ACF8F37157F6E322C7FCFC28 /* Debug */ = { 965 | isa = XCBuildConfiguration; 966 | buildSettings = { 967 | ALWAYS_SEARCH_USER_PATHS = NO; 968 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 969 | CLANG_ANALYZER_NONNULL = YES; 970 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 971 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 972 | CLANG_CXX_LIBRARY = "libc++"; 973 | CLANG_ENABLE_MODULES = YES; 974 | CLANG_ENABLE_OBJC_ARC = YES; 975 | CLANG_ENABLE_OBJC_WEAK = YES; 976 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 977 | CLANG_WARN_BOOL_CONVERSION = YES; 978 | CLANG_WARN_COMMA = YES; 979 | CLANG_WARN_CONSTANT_CONVERSION = YES; 980 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 981 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 982 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 983 | CLANG_WARN_EMPTY_BODY = YES; 984 | CLANG_WARN_ENUM_CONVERSION = YES; 985 | CLANG_WARN_INFINITE_RECURSION = YES; 986 | CLANG_WARN_INT_CONVERSION = YES; 987 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 988 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 989 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 990 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 991 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 992 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 993 | CLANG_WARN_STRICT_PROTOTYPES = YES; 994 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 995 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 996 | CLANG_WARN_UNREACHABLE_CODE = YES; 997 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 998 | COPY_PHASE_STRIP = NO; 999 | DEBUG_INFORMATION_FORMAT = dwarf; 1000 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1001 | ENABLE_TESTABILITY = YES; 1002 | GCC_C_LANGUAGE_STANDARD = gnu11; 1003 | GCC_DYNAMIC_NO_PIC = NO; 1004 | GCC_NO_COMMON_BLOCKS = YES; 1005 | GCC_OPTIMIZATION_LEVEL = 0; 1006 | GCC_PREPROCESSOR_DEFINITIONS = ( 1007 | "POD_CONFIGURATION_DEBUG=1", 1008 | "DEBUG=1", 1009 | "$(inherited)", 1010 | ); 1011 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1012 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1013 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1014 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1015 | GCC_WARN_UNUSED_FUNCTION = YES; 1016 | GCC_WARN_UNUSED_VARIABLE = YES; 1017 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 1018 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 1019 | MTL_FAST_MATH = YES; 1020 | ONLY_ACTIVE_ARCH = YES; 1021 | PRODUCT_NAME = "$(TARGET_NAME)"; 1022 | STRIP_INSTALLED_PRODUCT = NO; 1023 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 1024 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1025 | SWIFT_VERSION = 5.0; 1026 | SYMROOT = "${SRCROOT}/../build"; 1027 | }; 1028 | name = Debug; 1029 | }; 1030 | DCF364D2CA5F270CAD355FD2FAFE3B13 /* Profile */ = { 1031 | isa = XCBuildConfiguration; 1032 | buildSettings = { 1033 | ALWAYS_SEARCH_USER_PATHS = NO; 1034 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 1035 | CLANG_ANALYZER_NONNULL = YES; 1036 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1037 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1038 | CLANG_CXX_LIBRARY = "libc++"; 1039 | CLANG_ENABLE_MODULES = YES; 1040 | CLANG_ENABLE_OBJC_ARC = YES; 1041 | CLANG_ENABLE_OBJC_WEAK = YES; 1042 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1043 | CLANG_WARN_BOOL_CONVERSION = YES; 1044 | CLANG_WARN_COMMA = YES; 1045 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1046 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1047 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1048 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1049 | CLANG_WARN_EMPTY_BODY = YES; 1050 | CLANG_WARN_ENUM_CONVERSION = YES; 1051 | CLANG_WARN_INFINITE_RECURSION = YES; 1052 | CLANG_WARN_INT_CONVERSION = YES; 1053 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1054 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1055 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1056 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1057 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 1058 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1059 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1060 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1061 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1062 | CLANG_WARN_UNREACHABLE_CODE = YES; 1063 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1064 | COPY_PHASE_STRIP = NO; 1065 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1066 | ENABLE_NS_ASSERTIONS = NO; 1067 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1068 | GCC_C_LANGUAGE_STANDARD = gnu11; 1069 | GCC_NO_COMMON_BLOCKS = YES; 1070 | GCC_PREPROCESSOR_DEFINITIONS = ( 1071 | "POD_CONFIGURATION_PROFILE=1", 1072 | "$(inherited)", 1073 | ); 1074 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1075 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1076 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1077 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1078 | GCC_WARN_UNUSED_FUNCTION = YES; 1079 | GCC_WARN_UNUSED_VARIABLE = YES; 1080 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 1081 | MTL_ENABLE_DEBUG_INFO = NO; 1082 | MTL_FAST_MATH = YES; 1083 | PRODUCT_NAME = "$(TARGET_NAME)"; 1084 | STRIP_INSTALLED_PRODUCT = NO; 1085 | SWIFT_COMPILATION_MODE = wholemodule; 1086 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 1087 | SWIFT_VERSION = 5.0; 1088 | SYMROOT = "${SRCROOT}/../build"; 1089 | }; 1090 | name = Profile; 1091 | }; 1092 | /* End XCBuildConfiguration section */ 1093 | 1094 | /* Begin XCConfigurationList section */ 1095 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 1096 | isa = XCConfigurationList; 1097 | buildConfigurations = ( 1098 | B4EFE046ACF8F37157F6E322C7FCFC28 /* Debug */, 1099 | DCF364D2CA5F270CAD355FD2FAFE3B13 /* Profile */, 1100 | 903A0004D3E6651EFD5D2E16214D101B /* Release */, 1101 | ); 1102 | defaultConfigurationIsVisible = 0; 1103 | defaultConfigurationName = Release; 1104 | }; 1105 | 7A89E4A4D6E464861B7EA2FCA373B67F /* Build configuration list for PBXNativeTarget "url_launcher_ios" */ = { 1106 | isa = XCConfigurationList; 1107 | buildConfigurations = ( 1108 | 84D798D6A5C4F89004A7D95C2A05A21A /* Debug */, 1109 | 9B6B60BE14F99BB732F5537C441456E1 /* Profile */, 1110 | 5DC85DDD82C4F8CD007F4637CEE932F6 /* Release */, 1111 | ); 1112 | defaultConfigurationIsVisible = 0; 1113 | defaultConfigurationName = Release; 1114 | }; 1115 | 94078A06C17E946ADC1F2C06726219E5 /* Build configuration list for PBXAggregateTarget "Flutter" */ = { 1116 | isa = XCConfigurationList; 1117 | buildConfigurations = ( 1118 | A045C7A6D99F4F60840B1F19D32848E6 /* Debug */, 1119 | 9498D2532E60DBDF41603C51B60E35E8 /* Profile */, 1120 | 123B0D65A35211FC43B8BEE770443D25 /* Release */, 1121 | ); 1122 | defaultConfigurationIsVisible = 0; 1123 | defaultConfigurationName = Release; 1124 | }; 1125 | EF7023EC6D1AD8640E942883C152B08C /* Build configuration list for PBXNativeTarget "Pods-Runner" */ = { 1126 | isa = XCConfigurationList; 1127 | buildConfigurations = ( 1128 | 1753484A064BD2DDF8936BD022F2A683 /* Debug */, 1129 | 58A635DDE1A58ED5433FF9AE32BEBB02 /* Profile */, 1130 | 2E26C48A39B9B419F13A47556E00FB0F /* Release */, 1131 | ); 1132 | defaultConfigurationIsVisible = 0; 1133 | defaultConfigurationName = Release; 1134 | }; 1135 | /* End XCConfigurationList section */ 1136 | }; 1137 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 1138 | } 1139 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Pods.xcodeproj/xcuserdata/thruthesky.xcuserdatad/xcschemes/Flutter.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Pods.xcodeproj/xcuserdata/thruthesky.xcuserdatad/xcschemes/Pods-Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Pods.xcodeproj/xcuserdata/thruthesky.xcuserdatad/xcschemes/url_launcher_ios.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Pods.xcodeproj/xcuserdata/thruthesky.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Flutter.xcscheme 8 | 9 | isShown 10 | 11 | 12 | Pods-Runner.xcscheme 13 | 14 | isShown 15 | 16 | 17 | url_launcher_ios.xcscheme 18 | 19 | isShown 20 | 21 | 22 | 23 | SuppressBuildableAutocreation 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Flutter/Flutter.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Flutter 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../Flutter 8 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Flutter/Flutter.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Flutter 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../Flutter 8 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## url_launcher_ios 5 | 6 | Copyright 2013 The Flutter Authors. All rights reserved. 7 | 8 | Redistribution and use in source and binary forms, with or without modification, 9 | are permitted provided that the following conditions are met: 10 | 11 | * Redistributions of source code must retain the above copyright 12 | notice, this list of conditions and the following disclaimer. 13 | * Redistributions in binary form must reproduce the above 14 | copyright notice, this list of conditions and the following 15 | disclaimer in the documentation and/or other materials provided 16 | with the distribution. 17 | * Neither the name of Google Inc. nor the names of its 18 | contributors may be used to endorse or promote products derived 19 | from this software without specific prior written permission. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 22 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 25 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 28 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | 32 | Generated by CocoaPods - https://cocoapods.org 33 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright 2013 The Flutter Authors. All rights reserved. 18 | 19 | Redistribution and use in source and binary forms, with or without modification, 20 | are permitted provided that the following conditions are met: 21 | 22 | * Redistributions of source code must retain the above copyright 23 | notice, this list of conditions and the following disclaimer. 24 | * Redistributions in binary form must reproduce the above 25 | copyright notice, this list of conditions and the following 26 | disclaimer in the documentation and/or other materials provided 27 | with the distribution. 28 | * Neither the name of Google Inc. nor the names of its 29 | contributors may be used to endorse or promote products derived 30 | from this software without specific prior written permission. 31 | 32 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 33 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 34 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 35 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 36 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 37 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 38 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 39 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 40 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 41 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 | 43 | License 44 | BSD 45 | Title 46 | url_launcher_ios 47 | Type 48 | PSGroupSpecifier 49 | 50 | 51 | FooterText 52 | Generated by CocoaPods - https://cocoapods.org 53 | Title 54 | 55 | Type 56 | PSGroupSpecifier 57 | 58 | 59 | StringsTable 60 | Acknowledgements 61 | Title 62 | Acknowledgements 63 | 64 | 65 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Runner : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Runner 5 | @end 6 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Profile-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Profile-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" 23 | 24 | 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 28 | 29 | # Copies and strips a vendored framework 30 | install_framework() 31 | { 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 33 | local source="${BUILT_PRODUCTS_DIR}/$1" 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 36 | elif [ -r "$1" ]; then 37 | local source="$1" 38 | fi 39 | 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 41 | 42 | if [ -L "${source}" ]; then 43 | echo "Symlinked..." 44 | source="$(readlink "${source}")" 45 | fi 46 | 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do 50 | echo "Installing $f" 51 | install_bcsymbolmap "$f" "$destination" 52 | rm "$f" 53 | done 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" 55 | fi 56 | 57 | # Use filter instead of exclude so missing patterns don't throw errors. 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 60 | 61 | local basename 62 | basename="$(basename -s .framework "$1")" 63 | binary="${destination}/${basename}.framework/${basename}" 64 | 65 | if ! [ -r "$binary" ]; then 66 | binary="${destination}/${basename}" 67 | elif [ -L "${binary}" ]; then 68 | echo "Destination binary is symlinked..." 69 | dirname="$(dirname "${binary}")" 70 | binary="${dirname}/$(readlink "${binary}")" 71 | fi 72 | 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 75 | strip_invalid_archs "$binary" 76 | fi 77 | 78 | # Resign the code if required by the build settings to avoid unstable apps 79 | code_sign_if_enabled "${destination}/$(basename "$1")" 80 | 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 83 | local swift_runtime_libs 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 85 | for lib in $swift_runtime_libs; do 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 88 | code_sign_if_enabled "${destination}/${lib}" 89 | done 90 | fi 91 | } 92 | # Copies and strips a vendored dSYM 93 | install_dsym() { 94 | local source="$1" 95 | warn_missing_arch=${2:-true} 96 | if [ -r "$source" ]; then 97 | # Copy the dSYM into the targets temp dir. 98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 100 | 101 | local basename 102 | basename="$(basename -s .dSYM "$source")" 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 105 | 106 | # Strip invalid architectures from the dSYM. 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 108 | strip_invalid_archs "$binary" "$warn_missing_arch" 109 | fi 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then 111 | # Move the stripped file into its final destination. 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 114 | else 115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 116 | mkdir -p "${DWARF_DSYM_FOLDER_PATH}" 117 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 118 | fi 119 | fi 120 | } 121 | 122 | # Used as a return value for each invocation of `strip_invalid_archs` function. 123 | STRIP_BINARY_RETVAL=0 124 | 125 | # Strip invalid architectures 126 | strip_invalid_archs() { 127 | binary="$1" 128 | warn_missing_arch=${2:-true} 129 | # Get architectures for current target binary 130 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 131 | # Intersect them with the architectures we are building for 132 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 133 | # If there are no archs supported by this binary then warn the user 134 | if [[ -z "$intersected_archs" ]]; then 135 | if [[ "$warn_missing_arch" == "true" ]]; then 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 137 | fi 138 | STRIP_BINARY_RETVAL=1 139 | return 140 | fi 141 | stripped="" 142 | for arch in $binary_archs; do 143 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 144 | # Strip non-valid architectures in-place 145 | lipo -remove "$arch" -output "$binary" "$binary" 146 | stripped="$stripped $arch" 147 | fi 148 | done 149 | if [[ "$stripped" ]]; then 150 | echo "Stripped $binary of architectures:$stripped" 151 | fi 152 | STRIP_BINARY_RETVAL=0 153 | } 154 | 155 | # Copies the bcsymbolmap files of a vendored framework 156 | install_bcsymbolmap() { 157 | local bcsymbolmap_path="$1" 158 | local destination="${BUILT_PRODUCTS_DIR}" 159 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 160 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 161 | } 162 | 163 | # Signs a framework with the provided identity 164 | code_sign_if_enabled() { 165 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 166 | # Use the current code_sign_identity 167 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 168 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 169 | 170 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 171 | code_sign_cmd="$code_sign_cmd &" 172 | fi 173 | echo "$code_sign_cmd" 174 | eval "$code_sign_cmd" 175 | fi 176 | } 177 | 178 | if [[ "$CONFIGURATION" == "Debug" ]]; then 179 | install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework" 180 | fi 181 | if [[ "$CONFIGURATION" == "Profile" ]]; then 182 | install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework" 183 | fi 184 | if [[ "$CONFIGURATION" == "Release" ]]; then 185 | install_framework "${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework" 186 | fi 187 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 188 | wait 189 | fi 190 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_RunnerVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_RunnerVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/url_launcher_ios" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/url_launcher_ios/url_launcher_ios.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "url_launcher_ios" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Runner { 2 | umbrella header "Pods-Runner-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/url_launcher_ios" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/url_launcher_ios/url_launcher_ios.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "url_launcher_ios" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/url_launcher_ios" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/url_launcher_ios/url_launcher_ios.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "url_launcher_ios" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/url_launcher_ios/url_launcher_ios-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.0.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/url_launcher_ios/url_launcher_ios-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_url_launcher_ios : NSObject 3 | @end 4 | @implementation PodsDummy_url_launcher_ios 5 | @end 6 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/url_launcher_ios/url_launcher_ios-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/url_launcher_ios/url_launcher_ios-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "FLTURLLauncherPlugin.h" 14 | 15 | FOUNDATION_EXPORT double url_launcher_iosVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char url_launcher_iosVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/url_launcher_ios/url_launcher_ios.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/url_launcher_ios 3 | DEFINES_MODULE = YES 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.symlinks/plugins/url_launcher_ios/ios 9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/url_launcher_ios/url_launcher_ios.modulemap: -------------------------------------------------------------------------------- 1 | framework module url_launcher_ios { 2 | umbrella header "url_launcher_ios-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /exmaple/ios/Pods/Target Support Files/url_launcher_ios/url_launcher_ios.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/url_launcher_ios 3 | DEFINES_MODULE = YES 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.symlinks/plugins/url_launcher_ios/ios 9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /exmaple/ios/Runner/GeneratedPluginRegistrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GeneratedPluginRegistrant_h 8 | #define GeneratedPluginRegistrant_h 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GeneratedPluginRegistrant : NSObject 15 | + (void)registerWithRegistry:(NSObject*)registry; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | #endif /* GeneratedPluginRegistrant_h */ 20 | -------------------------------------------------------------------------------- /exmaple/ios/Runner/GeneratedPluginRegistrant.m: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #import "GeneratedPluginRegistrant.h" 8 | 9 | #if __has_include() 10 | #import 11 | #else 12 | @import url_launcher_ios; 13 | #endif 14 | 15 | @implementation GeneratedPluginRegistrant 16 | 17 | + (void)registerWithRegistry:(NSObject*)registry { 18 | [FLTURLLauncherPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTURLLauncherPlugin"]]; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /exmaple/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.10.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | characters: 21 | dependency: transitive 22 | description: 23 | name: characters 24 | sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.2.1" 28 | clock: 29 | dependency: transitive 30 | description: 31 | name: clock 32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.1.1" 36 | collection: 37 | dependency: transitive 38 | description: 39 | name: collection 40 | sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.17.0" 44 | cupertino_icons: 45 | dependency: "direct main" 46 | description: 47 | name: cupertino_icons 48 | sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.0.5" 52 | fake_async: 53 | dependency: transitive 54 | description: 55 | name: fake_async 56 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.3.1" 60 | flutter: 61 | dependency: "direct main" 62 | description: flutter 63 | source: sdk 64 | version: "0.0.0" 65 | flutter_linkify: 66 | dependency: transitive 67 | description: 68 | name: flutter_linkify 69 | sha256: c89fe74de985ec22f23d3538d2249add085a4f37ac1c29fd79e1a207efb81d63 70 | url: "https://pub.dev" 71 | source: hosted 72 | version: "5.0.2" 73 | flutter_lints: 74 | dependency: "direct dev" 75 | description: 76 | name: flutter_lints 77 | sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c 78 | url: "https://pub.dev" 79 | source: hosted 80 | version: "2.0.1" 81 | flutter_test: 82 | dependency: "direct dev" 83 | description: flutter 84 | source: sdk 85 | version: "0.0.0" 86 | flutter_web_plugins: 87 | dependency: transitive 88 | description: flutter 89 | source: sdk 90 | version: "0.0.0" 91 | flutterflow_widgets: 92 | dependency: "direct main" 93 | description: 94 | path: ".." 95 | relative: true 96 | source: path 97 | version: "0.0.4" 98 | js: 99 | dependency: transitive 100 | description: 101 | name: js 102 | sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" 103 | url: "https://pub.dev" 104 | source: hosted 105 | version: "0.6.5" 106 | linkify: 107 | dependency: transitive 108 | description: 109 | name: linkify 110 | sha256: bdfbdafec6cdc9cd0ebb333a868cafc046714ad508e48be8095208c54691d959 111 | url: "https://pub.dev" 112 | source: hosted 113 | version: "4.1.0" 114 | lints: 115 | dependency: transitive 116 | description: 117 | name: lints 118 | sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" 119 | url: "https://pub.dev" 120 | source: hosted 121 | version: "2.0.1" 122 | matcher: 123 | dependency: transitive 124 | description: 125 | name: matcher 126 | sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" 127 | url: "https://pub.dev" 128 | source: hosted 129 | version: "0.12.13" 130 | material_color_utilities: 131 | dependency: transitive 132 | description: 133 | name: material_color_utilities 134 | sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 135 | url: "https://pub.dev" 136 | source: hosted 137 | version: "0.2.0" 138 | meta: 139 | dependency: transitive 140 | description: 141 | name: meta 142 | sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" 143 | url: "https://pub.dev" 144 | source: hosted 145 | version: "1.8.0" 146 | path: 147 | dependency: transitive 148 | description: 149 | name: path 150 | sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b 151 | url: "https://pub.dev" 152 | source: hosted 153 | version: "1.8.2" 154 | plugin_platform_interface: 155 | dependency: transitive 156 | description: 157 | name: plugin_platform_interface 158 | sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" 159 | url: "https://pub.dev" 160 | source: hosted 161 | version: "2.1.4" 162 | sky_engine: 163 | dependency: transitive 164 | description: flutter 165 | source: sdk 166 | version: "0.0.99" 167 | source_span: 168 | dependency: transitive 169 | description: 170 | name: source_span 171 | sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 172 | url: "https://pub.dev" 173 | source: hosted 174 | version: "1.9.1" 175 | stack_trace: 176 | dependency: transitive 177 | description: 178 | name: stack_trace 179 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 180 | url: "https://pub.dev" 181 | source: hosted 182 | version: "1.11.0" 183 | stream_channel: 184 | dependency: transitive 185 | description: 186 | name: stream_channel 187 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 188 | url: "https://pub.dev" 189 | source: hosted 190 | version: "2.1.1" 191 | string_scanner: 192 | dependency: transitive 193 | description: 194 | name: string_scanner 195 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 196 | url: "https://pub.dev" 197 | source: hosted 198 | version: "1.2.0" 199 | term_glyph: 200 | dependency: transitive 201 | description: 202 | name: term_glyph 203 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 204 | url: "https://pub.dev" 205 | source: hosted 206 | version: "1.2.1" 207 | test_api: 208 | dependency: transitive 209 | description: 210 | name: test_api 211 | sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 212 | url: "https://pub.dev" 213 | source: hosted 214 | version: "0.4.16" 215 | url_launcher: 216 | dependency: transitive 217 | description: 218 | name: url_launcher 219 | sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" 220 | url: "https://pub.dev" 221 | source: hosted 222 | version: "6.1.10" 223 | url_launcher_android: 224 | dependency: transitive 225 | description: 226 | name: url_launcher_android 227 | sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8 228 | url: "https://pub.dev" 229 | source: hosted 230 | version: "6.0.26" 231 | url_launcher_ios: 232 | dependency: transitive 233 | description: 234 | name: url_launcher_ios 235 | sha256: "3dedc66ca3c0bef9e6a93c0999aee102556a450afcc1b7bcfeace7a424927d92" 236 | url: "https://pub.dev" 237 | source: hosted 238 | version: "6.1.3" 239 | url_launcher_linux: 240 | dependency: transitive 241 | description: 242 | name: url_launcher_linux 243 | sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" 244 | url: "https://pub.dev" 245 | source: hosted 246 | version: "3.0.4" 247 | url_launcher_macos: 248 | dependency: transitive 249 | description: 250 | name: url_launcher_macos 251 | sha256: "0ef2b4f97942a16523e51256b799e9aa1843da6c60c55eefbfa9dbc2dcb8331a" 252 | url: "https://pub.dev" 253 | source: hosted 254 | version: "3.0.4" 255 | url_launcher_platform_interface: 256 | dependency: transitive 257 | description: 258 | name: url_launcher_platform_interface 259 | sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" 260 | url: "https://pub.dev" 261 | source: hosted 262 | version: "2.1.2" 263 | url_launcher_web: 264 | dependency: transitive 265 | description: 266 | name: url_launcher_web 267 | sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" 268 | url: "https://pub.dev" 269 | source: hosted 270 | version: "2.0.16" 271 | url_launcher_windows: 272 | dependency: transitive 273 | description: 274 | name: url_launcher_windows 275 | sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd 276 | url: "https://pub.dev" 277 | source: hosted 278 | version: "3.0.5" 279 | vector_math: 280 | dependency: transitive 281 | description: 282 | name: vector_math 283 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 284 | url: "https://pub.dev" 285 | source: hosted 286 | version: "2.1.4" 287 | sdks: 288 | dart: ">=2.18.1 <3.0.0" 289 | flutter: ">=3.3.0" 290 | -------------------------------------------------------------------------------- /lib/flutterflow_widgets.dart: -------------------------------------------------------------------------------- 1 | export 'src/linkify_text/linkify_text.dart'; 2 | export 'src/custom_popup/custom_popup.dart'; 3 | export 'src/custom_popup/custom_icon_popup.dart'; 4 | export 'src/display_media/display_media.dart'; 5 | export 'src/safe_area/safe_area_top.dart'; 6 | export 'src/safe_area/safe_area_bottom.dart'; 7 | export 'src/show_modal_top_sheet/show_modal_top_sheet.dart'; 8 | export 'src/snackbar/snackbar.dart'; 9 | export 'src/url_preview/url_preview.dart'; 10 | export 'src/url_preview/url_preview.model.dart'; 11 | export 'src/custom_calendar/custom_calendar.dart'; 12 | export 'src/icon_label_column/icon_label_column.dart'; 13 | export 'src/text/text_with_label.dart'; 14 | -------------------------------------------------------------------------------- /lib/src/custom_calendar/custom_calendar.dart: -------------------------------------------------------------------------------- 1 | import 'dart:collection'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:intl/intl.dart'; 5 | 6 | import 'package:table_calendar/table_calendar.dart'; 7 | 8 | /// CustomCalendar 9 | /// 10 | /// Displays a calendar with events. 11 | class CustomCalendar extends StatefulWidget { 12 | const CustomCalendar({ 13 | Key? key, 14 | this.locale = 'en_US', 15 | this.events = const {}, 16 | required this.onDaySelected, 17 | }) : super(key: key); 18 | 19 | final String locale; 20 | final Map events; 21 | 22 | final Function(List?) onDaySelected; 23 | @override 24 | createState() => _CustomCalendarState(); 25 | } 26 | 27 | class _CustomCalendarState extends State { 28 | DateTime? _selectedDay; 29 | 30 | DateTime? _focusedDay; 31 | 32 | CalendarFormat _calendarFormat = CalendarFormat.month; 33 | 34 | LinkedHashMap? calendarEvents; 35 | 36 | loadEvents(DateTime day) { 37 | /// collect by dates 38 | final Map> byDates = {}; 39 | for (final date in widget.events.keys) { 40 | final key = DateTime(date.year, date.month, date.day); 41 | if (byDates[key] == null) { 42 | byDates[key] = []; 43 | } 44 | byDates[key]!.add(widget.events[date]); 45 | } 46 | 47 | /// convert to LinkedHashMap 48 | calendarEvents = LinkedHashMap>( 49 | equals: isSameDay, 50 | hashCode: getHashCode, 51 | )..addAll(byDates); 52 | 53 | return calendarEvents?[day] ?? []; 54 | } 55 | 56 | /// 날짜 hashcode 57 | int getHashCode(DateTime key) { 58 | return key.day * 1000000 + key.month * 10000 + key.year; 59 | } 60 | 61 | @override 62 | Widget build(BuildContext context) { 63 | return TableCalendar( 64 | locale: widget.locale, 65 | firstDay: DateTime.utc(2022, 01, 01), 66 | lastDay: DateTime.utc(DateTime.now().year + 2), 67 | focusedDay: _focusedDay ?? DateTime.now(), 68 | selectedDayPredicate: (day) { 69 | return isSameDay(_selectedDay, day); 70 | }, 71 | onDaySelected: (selectedDay, focusedDay) { 72 | setState(() { 73 | _selectedDay = selectedDay; 74 | _focusedDay = focusedDay; 75 | }); 76 | widget.onDaySelected(calendarEvents?[selectedDay]); 77 | }, 78 | calendarFormat: _calendarFormat, 79 | onFormatChanged: (format) { 80 | setState(() { 81 | _calendarFormat = format; 82 | }); 83 | }, 84 | onPageChanged: (focusedDay) { 85 | _focusedDay = focusedDay; 86 | }, 87 | eventLoader: (dt) => loadEvents(dt), 88 | calendarStyle: const CalendarStyle( 89 | markersAlignment: Alignment(.6, .9), 90 | ), 91 | calendarBuilders: CalendarBuilders( 92 | dowBuilder: (context, day) { 93 | if (day.weekday == DateTime.sunday) { 94 | final text = DateFormat.E().format(day); 95 | 96 | return Center( 97 | child: Text( 98 | text, 99 | style: const TextStyle(color: Colors.red), 100 | ), 101 | ); 102 | } 103 | return null; 104 | }, 105 | markerBuilder: (context, date, List event) { 106 | if (event.isEmpty) { 107 | return null; 108 | } 109 | return Container( 110 | height: 16, 111 | width: 16, 112 | decoration: BoxDecoration( 113 | color: Colors.red.shade500, 114 | shape: BoxShape.circle, 115 | ), 116 | child: Align( 117 | alignment: Alignment.center, 118 | child: Text( 119 | event.length.toString(), 120 | style: const TextStyle(fontSize: 8, color: Colors.white), 121 | ), 122 | ), 123 | ); 124 | }, 125 | ), 126 | ); 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /lib/src/custom_popup/custom_icon_popup.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | /// [CustomIconPopup] is a widget that shows a popup when the icon is tapped. 4 | /// 5 | class CustomIconPopup extends StatelessWidget { 6 | const CustomIconPopup({ 7 | Key? key, 8 | required this.icon, 9 | required this.popup, 10 | this.iconPadding = 0, 11 | this.dx = 0, 12 | this.dy = 16, 13 | }) : super(key: key); 14 | 15 | final Widget icon; 16 | final Widget popup; 17 | final double iconPadding; 18 | final double dx; 19 | final double dy; 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return PopupMenuButton( 24 | padding: const EdgeInsets.all(0), 25 | offset: Offset(dx, dy), 26 | elevation: 0, 27 | color: Colors.transparent, 28 | itemBuilder: (context) { 29 | return [ 30 | PopupMenuItem( 31 | enabled: true, 32 | padding: const EdgeInsets.all(0), 33 | child: Column( 34 | mainAxisSize: MainAxisSize.min, 35 | mainAxisAlignment: MainAxisAlignment.start, 36 | crossAxisAlignment: CrossAxisAlignment.start, 37 | children: [popup], 38 | ), 39 | ), 40 | ]; 41 | }, 42 | child: Padding( 43 | padding: EdgeInsets.all(iconPadding), 44 | child: icon, 45 | ), 46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /lib/src/custom_popup/custom_popup.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | /// [CustomPopup] is a widget that shows a popup when the [child] is tapped. 4 | /// 5 | class CustomPopup extends StatelessWidget { 6 | const CustomPopup({ 7 | Key? key, 8 | required this.child, 9 | required this.popup, 10 | this.dx = 0, 11 | this.dy = 16, 12 | this.tooltip = '', 13 | }) : super(key: key); 14 | 15 | final Widget child; 16 | final Widget popup; 17 | final double dx; 18 | final double dy; 19 | final String tooltip; 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return PopupMenuButton( 24 | tooltip: tooltip, 25 | padding: const EdgeInsets.all(0), 26 | offset: Offset(dx, dy), 27 | elevation: 0, 28 | color: Colors.transparent, 29 | itemBuilder: (context) { 30 | return [ 31 | PopupMenuItem( 32 | enabled: true, 33 | padding: const EdgeInsets.all(0), 34 | child: Column( 35 | mainAxisSize: MainAxisSize.min, 36 | mainAxisAlignment: MainAxisAlignment.start, 37 | crossAxisAlignment: CrossAxisAlignment.start, 38 | children: [popup], 39 | ), 40 | ), 41 | ]; 42 | }, 43 | child: child, 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/src/display_media/display_media.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:chewie/chewie.dart'; 3 | // import 'package:fireflow/fireflow.dart'; 4 | import 'package:flutter/foundation.dart'; 5 | import 'package:flutter/services.dart'; 6 | import 'package:video_player/video_player.dart'; 7 | import 'package:flutter/material.dart'; 8 | import 'package:mime_type/mime_type.dart'; 9 | import 'package:path/path.dart' as p; 10 | 11 | const _kSupportedVideoMimes = {'video/mp4', 'video/mpeg'}; 12 | 13 | bool _isVideoPath(String path) => 14 | _kSupportedVideoMimes.contains(mime(path.split('?').first)); 15 | 16 | bool _isImagePath(String path) => 17 | mime(path.split('?').first)?.startsWith('image/') ?? false; 18 | 19 | class FlutterFlowMediaDisplay extends StatelessWidget { 20 | const FlutterFlowMediaDisplay({ 21 | Key? key, 22 | required this.path, 23 | required this.imageBuilder, 24 | required this.videoPlayerBuilder, 25 | required this.fileBuilder, 26 | }) : super(key: key); 27 | 28 | final String path; 29 | final Widget Function(String) imageBuilder; 30 | final Widget Function(String) videoPlayerBuilder; 31 | final Widget Function(String) fileBuilder; 32 | 33 | @override 34 | Widget build(BuildContext context) { 35 | if (_isVideoPath(path)) { 36 | return videoPlayerBuilder(path); 37 | } else if (_isImagePath(path)) { 38 | return imageBuilder(path); 39 | } else { 40 | return fileBuilder(path); 41 | } 42 | 43 | // return _isVideoPath(path) ? videoPlayerBuilder(path) : imageBuilder(path); 44 | } 45 | } 46 | 47 | const kDefaultAspectRatio = 16 / 9; 48 | 49 | enum VideoType { 50 | asset, 51 | network, 52 | } 53 | 54 | Set _videoPlayers = {}; 55 | 56 | class FlutterFlowVideoPlayer extends StatefulWidget { 57 | const FlutterFlowVideoPlayer({ 58 | Key? key, 59 | required this.path, 60 | this.videoType = VideoType.network, 61 | this.width, 62 | this.height, 63 | this.aspectRatio, 64 | this.autoPlay = false, 65 | this.looping = false, 66 | this.showControls = true, 67 | this.allowFullScreen = true, 68 | this.allowPlaybackSpeedMenu = false, 69 | this.lazyLoad = false, 70 | }) : super(key: key); 71 | 72 | final String path; 73 | final VideoType videoType; 74 | final double? width; 75 | final double? height; 76 | final double? aspectRatio; 77 | final bool autoPlay; 78 | final bool looping; 79 | final bool showControls; 80 | final bool allowFullScreen; 81 | final bool allowPlaybackSpeedMenu; 82 | final bool lazyLoad; 83 | 84 | @override 85 | State createState() => _FlutterFlowVideoPlayerState(); 86 | } 87 | 88 | class _FlutterFlowVideoPlayerState extends State { 89 | VideoPlayerController? _videoPlayerController; 90 | ChewieController? _chewieController; 91 | bool _loggedError = false; 92 | 93 | @override 94 | void initState() { 95 | super.initState(); 96 | initializePlayer(); 97 | } 98 | 99 | @override 100 | void dispose() { 101 | _videoPlayers.remove(_videoPlayerController); 102 | _videoPlayerController?.dispose(); 103 | _chewieController?.dispose(); 104 | super.dispose(); 105 | } 106 | 107 | double get width => widget.width == null || widget.width! >= double.infinity 108 | ? MediaQuery.of(context).size.width 109 | : widget.width!; 110 | 111 | double get height => 112 | widget.height == null || widget.height! >= double.infinity 113 | ? width / aspectRatio 114 | : widget.height!; 115 | 116 | double get aspectRatio => 117 | _chewieController?.videoPlayerController.value.aspectRatio ?? 118 | kDefaultAspectRatio; 119 | 120 | Future initializePlayer() async { 121 | _videoPlayerController = widget.videoType == VideoType.network 122 | ? VideoPlayerController.network(widget.path) 123 | : VideoPlayerController.asset(widget.path); 124 | if (kIsWeb && widget.autoPlay) { 125 | // Browsers generally don't allow autoplay unless it's muted. 126 | // Ideally this should be configurable, but for now we just automatically 127 | // mute on web. 128 | // See https://pub.dev/packages/video_player_web#autoplay 129 | _videoPlayerController!.setVolume(0); 130 | } 131 | if (!widget.lazyLoad) { 132 | await _videoPlayerController?.initialize(); 133 | } 134 | _chewieController = ChewieController( 135 | videoPlayerController: _videoPlayerController!, 136 | deviceOrientationsOnEnterFullScreen: [ 137 | DeviceOrientation.landscapeLeft, 138 | DeviceOrientation.landscapeRight, 139 | ], 140 | deviceOrientationsAfterFullScreen: [DeviceOrientation.portraitUp], 141 | aspectRatio: widget.aspectRatio, 142 | autoPlay: widget.autoPlay, 143 | looping: widget.looping, 144 | showControls: widget.showControls, 145 | allowFullScreen: widget.allowFullScreen, 146 | allowPlaybackSpeedChanging: widget.allowPlaybackSpeedMenu, 147 | ); 148 | 149 | _videoPlayers.add(_videoPlayerController!); 150 | _videoPlayerController!.addListener( 151 | () { 152 | if (_videoPlayerController!.value.hasError && !_loggedError) { 153 | _loggedError = true; 154 | } 155 | // Stop all other players when one video is playing. 156 | if (_videoPlayerController!.value.isPlaying) { 157 | for (var otherPlayer in _videoPlayers) { 158 | if (otherPlayer != _videoPlayerController && 159 | otherPlayer.value.isPlaying) { 160 | setState(() { 161 | otherPlayer.pause(); 162 | }); 163 | } 164 | } 165 | } 166 | }, 167 | ); 168 | 169 | setState(() {}); 170 | } 171 | 172 | @override 173 | Widget build(BuildContext context) => FittedBox( 174 | fit: BoxFit.cover, 175 | child: SizedBox( 176 | height: height, 177 | width: width, 178 | child: _chewieController != null && 179 | (widget.lazyLoad || 180 | _chewieController! 181 | .videoPlayerController.value.isInitialized) 182 | ? Chewie(controller: _chewieController!) 183 | : (_chewieController != null && 184 | _chewieController!.videoPlayerController.value.hasError) 185 | ? const Text('Error playing video') 186 | : Column( 187 | mainAxisAlignment: MainAxisAlignment.center, 188 | children: const [ 189 | CircularProgressIndicator(), 190 | SizedBox(height: 20), 191 | Text('Loading'), 192 | ], 193 | ), 194 | ), 195 | ); 196 | } 197 | 198 | /// Display Media 199 | /// 200 | /// It displays any kinds of files based on the given [url] string. It can be 201 | /// used for the other pair of [UploadMedia] widget. 202 | /// 203 | /// The [width] and [height] are respected. You may pass `Inf` to adjust its 204 | /// size by parent. 205 | /// 206 | /// Images are displayed with [CachedNetworkImage]. It means, it will cache 207 | /// the image and display a placeholder while loading. 208 | /// 209 | /// Videos are displayed with [Chewie]. It will not display the controller 210 | /// if the width is less than 160. 211 | /// 212 | class DisplayMedia extends StatefulWidget { 213 | const DisplayMedia({ 214 | Key? key, 215 | this.width, 216 | this.height, 217 | required this.url, 218 | }) : super(key: key); 219 | 220 | final double? width; 221 | final double? height; 222 | final String url; 223 | 224 | @override 225 | UploadedMediaState createState() => UploadedMediaState(); 226 | } 227 | 228 | class UploadedMediaState extends State { 229 | @override 230 | Widget build(BuildContext context) { 231 | return Container( 232 | key: ValueKey(widget.url), 233 | child: FlutterFlowMediaDisplay( 234 | path: widget.url, 235 | imageBuilder: (path) => CachedNetworkImage( 236 | imageUrl: path, 237 | placeholder: (context, url) => 238 | const CircularProgressIndicator.adaptive(), 239 | errorWidget: (context, url, error) => const Icon(Icons.error), 240 | width: MediaQuery.of(context).size.width, 241 | fit: BoxFit.cover, 242 | ), 243 | videoPlayerBuilder: (path) => FlutterFlowVideoPlayer( 244 | path: path, 245 | width: widget.width, 246 | height: widget.height, 247 | autoPlay: false, 248 | looping: true, 249 | showControls: (widget.width ?? double.infinity) > 160, 250 | allowFullScreen: true, 251 | allowPlaybackSpeedMenu: false, 252 | ), 253 | fileBuilder: (path) => SizedBox( 254 | width: widget.width, 255 | height: widget.height, 256 | // color: Colors.blue, 257 | child: Stack( 258 | children: [ 259 | Align( 260 | alignment: Alignment.center, 261 | child: LayoutBuilder(builder: (context, constraint) { 262 | return Icon(Icons.insert_drive_file, 263 | size: constraint.biggest.height); 264 | }), 265 | ), 266 | SizedBox( 267 | width: widget.width, 268 | height: widget.height, 269 | child: Align( 270 | child: Padding( 271 | padding: const EdgeInsets.only(top: 36.0), 272 | child: Column( 273 | mainAxisSize: MainAxisSize.min, 274 | children: [ 275 | Text( 276 | path.split('.').last.split('?').first.toUpperCase(), 277 | style: const TextStyle( 278 | color: Colors.white, fontSize: 24), 279 | ), 280 | Text( 281 | p.basename( 282 | path.replaceAll('%2F', '/').split('?').first), 283 | style: 284 | const TextStyle(fontSize: 6, color: Colors.white), 285 | textAlign: TextAlign.center, 286 | ) 287 | ], 288 | ), 289 | ), 290 | ), 291 | ), 292 | ], 293 | ), 294 | ), 295 | ), 296 | ); 297 | } 298 | } 299 | -------------------------------------------------------------------------------- /lib/src/icon_label_column/icon_label_column.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class IconLabelColumn extends StatelessWidget { 4 | const IconLabelColumn({ 5 | Key? key, 6 | required this.icon, 7 | required this.label, 8 | this.color = Colors.white, 9 | this.labelSize = 12, 10 | this.spacing = 6, 11 | }) : super(key: key); 12 | 13 | final IconData icon; 14 | final String label; 15 | final Color color; 16 | final double labelSize; 17 | final double spacing; 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Column( 22 | mainAxisSize: MainAxisSize.min, 23 | children: [ 24 | Icon( 25 | icon, 26 | color: color, 27 | size: 24, 28 | ), 29 | SizedBox(height: spacing), 30 | Text( 31 | label, 32 | style: TextStyle( 33 | fontFamily: 'Poppins', 34 | color: Colors.white, 35 | fontSize: labelSize, 36 | ), 37 | ), 38 | ], 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/src/linkify_text/linkify_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_linkify/flutter_linkify.dart'; 3 | import 'package:url_launcher/url_launcher_string.dart'; 4 | 5 | class LinkifyText extends StatelessWidget { 6 | const LinkifyText({ 7 | Key? key, 8 | required this.text, 9 | this.style, 10 | }) : super(key: key); 11 | final String text; 12 | final TextStyle? style; 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | return Linkify( 17 | options: const LinkifyOptions(humanize: false), 18 | onOpen: (link) async { 19 | if (await canLaunchUrlString(link.url)) { 20 | await launchUrlString(link.url); 21 | } else { 22 | throw 'Could not launch $link'; 23 | } 24 | }, 25 | text: text, 26 | style: style, 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/src/safe_area/safe_area_bottom.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SafeAreaBottom extends StatelessWidget { 4 | const SafeAreaBottom({ 5 | Key? key, 6 | this.width, 7 | this.height, 8 | }) : super(key: key); 9 | 10 | final double? width; 11 | final double? height; 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return Container( 16 | width: width ?? 5, 17 | height: MediaQuery.of(context).viewPadding.bottom, 18 | color: Colors.transparent, 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/src/safe_area/safe_area_top.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SafeAreaTop extends StatelessWidget { 4 | const SafeAreaTop({ 5 | Key? key, 6 | this.width, 7 | this.height, 8 | }) : super(key: key); 9 | 10 | final double? width; 11 | final double? height; 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return Container( 16 | width: width ?? 5, 17 | height: MediaQuery.of(context).viewPadding.top, 18 | color: Colors.transparent, 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/src/show_modal_top_sheet/show_modal_top_sheet.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | /// show a modal on top. 4 | /// 5 | /// showModalTopSheet is a custom action that shows a modal top sheet. 6 | /// It can be used to display a snackbar on top. 7 | Future showModalTopSheet(BuildContext context, Widget child, 8 | {bool barrierDismissible = true}) { 9 | return showGeneralDialog( 10 | context: context, 11 | barrierDismissible: barrierDismissible, 12 | transitionDuration: const Duration(milliseconds: 250), 13 | barrierLabel: MaterialLocalizations.of(context).dialogLabel, 14 | barrierColor: Colors.black.withOpacity(0.5), 15 | pageBuilder: (context, _, __) => child, 16 | transitionBuilder: (context, animation, secondaryAnimation, child) { 17 | return SlideTransition( 18 | position: CurvedAnimation(parent: animation, curve: Curves.easeOutCubic) 19 | .drive( 20 | Tween(begin: const Offset(0, -1.0), end: Offset.zero)), 21 | child: Column( 22 | children: [ 23 | Material( 24 | child: Column( 25 | mainAxisSize: MainAxisSize.min, 26 | children: [child], 27 | ), 28 | ) 29 | ], 30 | ), 31 | ); 32 | }, 33 | ); 34 | } 35 | -------------------------------------------------------------------------------- /lib/src/snackbar/snackbar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CustomStyleArrow extends CustomPainter { 4 | CustomStyleArrow({ 5 | required this.color, 6 | }); 7 | final Color color; 8 | @override 9 | void paint(Canvas canvas, Size size) { 10 | final Paint paint = Paint() 11 | ..color = color 12 | ..strokeWidth = 1 13 | ..style = PaintingStyle.fill; 14 | const double triangleH = 5; 15 | const double triangleW = 10.0; 16 | final double width = size.width; 17 | final double height = size.height; 18 | 19 | final Path trianglePath = Path() 20 | ..moveTo(width / 2 - triangleW / 2, height) 21 | ..lineTo(width / 2, triangleH + height) 22 | ..lineTo(width / 2 + triangleW / 2, height) 23 | ..lineTo(width / 2 - triangleW / 2, height); 24 | canvas.drawPath(trianglePath, paint); 25 | final BorderRadius borderRadius = BorderRadius.circular(8); 26 | final Rect rect = Rect.fromLTRB(0, 0, width, height); 27 | final RRect outer = borderRadius.toRRect(rect); 28 | canvas.drawRRect(outer, paint); 29 | } 30 | 31 | @override 32 | bool shouldRepaint(CustomPainter oldDelegate) => false; 33 | } 34 | 35 | /// Show the snackbar 36 | showSnackBar(BuildContext context, SnackBar snackBarContent) { 37 | ScaffoldMessenger.of(context) 38 | ..hideCurrentSnackBar() 39 | ..showSnackBar(snackBarContent); 40 | } 41 | 42 | /// Create the snackbar content 43 | SnackBar snackBarContent({ 44 | required BuildContext context, 45 | required String title, 46 | required String message, 47 | Color backgroundColor = Colors.black, 48 | Icon icon = const Icon(Icons.check_circle, color: Colors.amber, size: 28), 49 | Color closeButtonColor = Colors.amber, 50 | Color arrowBackgroundColor = Colors.white, 51 | int? seconds, 52 | }) { 53 | Widget content = Stack( 54 | clipBehavior: Clip.none, 55 | children: [ 56 | Container( 57 | margin: const EdgeInsets.only(top: 20), 58 | decoration: BoxDecoration( 59 | color: backgroundColor, 60 | borderRadius: BorderRadius.circular(10), 61 | ), 62 | child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ 63 | const SizedBox( 64 | width: 16, 65 | ), 66 | Expanded( 67 | child: Column( 68 | mainAxisAlignment: MainAxisAlignment.center, 69 | crossAxisAlignment: CrossAxisAlignment.start, 70 | children: [ 71 | const SizedBox(height: 24), 72 | Text( 73 | title, 74 | style: const TextStyle( 75 | color: Colors.white, 76 | fontSize: 14, 77 | fontWeight: FontWeight.bold), 78 | ), 79 | const SizedBox(height: 8), 80 | Text( 81 | message, 82 | style: const TextStyle(color: Colors.white, fontSize: 13), 83 | ), 84 | const SizedBox(height: 16), 85 | ], 86 | ), 87 | ), 88 | IconButton( 89 | onPressed: () { 90 | ScaffoldMessenger.of(context).hideCurrentSnackBar(); 91 | }, 92 | icon: Icon( 93 | Icons.close, 94 | color: closeButtonColor, 95 | ), 96 | ), 97 | ]), 98 | ), 99 | Positioned( 100 | left: 16, 101 | top: -8, 102 | child: CustomPaint( 103 | painter: CustomStyleArrow(color: arrowBackgroundColor), 104 | child: Container( 105 | padding: const EdgeInsets.all(4), 106 | child: icon, 107 | ), 108 | ), 109 | ), 110 | ], 111 | ); 112 | 113 | return SnackBar( 114 | backgroundColor: Colors.transparent, 115 | behavior: SnackBarBehavior.floating, 116 | elevation: 0, 117 | duration: Duration(seconds: seconds ?? 10), 118 | content: content, 119 | ); 120 | } 121 | 122 | /// Show a snackbar with success icon. 123 | /// 124 | /// showModalTopSheet is a custom action that shows a modal top sheet. 125 | /// It can be used to display a snackbar on top. 126 | /// 127 | /// [context] is the context of the widget that is calling the action. It is 128 | /// optional. If you don't initialize the AppService, you must pass the context 129 | /// here. And the [context] will be set to the AppService. 130 | /// 131 | /// [title] is the title of the snackbar. 132 | /// 133 | /// [message] is the message of the snackbar. 134 | snackBarSuccess({ 135 | required BuildContext context, 136 | required String title, 137 | required String message, 138 | int? seconds, 139 | }) { 140 | showSnackBar( 141 | context, 142 | snackBarContent( 143 | context: context, 144 | title: title, 145 | message: message, 146 | backgroundColor: Colors.black, 147 | closeButtonColor: Colors.amber, 148 | icon: const Icon(Icons.check_circle, color: Colors.green, size: 28), 149 | arrowBackgroundColor: Colors.white, 150 | seconds: seconds, 151 | ), 152 | ); 153 | } 154 | 155 | /// Show a snackbar with error icon. 156 | /// 157 | /// See [snackBarSuccess] for more information. 158 | snackBarWarning({ 159 | required BuildContext context, 160 | required String title, 161 | required String message, 162 | int? seconds, 163 | }) { 164 | showSnackBar( 165 | context, 166 | snackBarContent( 167 | context: context, 168 | title: title, 169 | message: message, 170 | backgroundColor: Colors.amber.shade700, 171 | closeButtonColor: Colors.white, 172 | icon: Icon(Icons.error, color: Colors.amber.shade800, size: 28), 173 | arrowBackgroundColor: Colors.white, 174 | seconds: seconds, 175 | ), 176 | ); 177 | } 178 | 179 | /// Show a snackbar with error icon. 180 | /// 181 | /// It's just an alias of [snackBarWarning]. 182 | snackBarError({ 183 | required BuildContext context, 184 | required String title, 185 | required String message, 186 | int? seconds, 187 | }) { 188 | snackBarWarning( 189 | title: title, 190 | message: message, 191 | seconds: seconds, 192 | context: context, 193 | ); 194 | } 195 | -------------------------------------------------------------------------------- /lib/src/text/text_with_label.dart: -------------------------------------------------------------------------------- 1 | // generate a stateless widget named TextWithLabel with a text and label 2 | import 'package:flutter/material.dart'; 3 | 4 | class TextWithLabel extends StatelessWidget { 5 | const TextWithLabel({ 6 | Key? key, 7 | required this.label, 8 | required this.text, 9 | }) : super(key: key); 10 | 11 | final String label; 12 | final String text; 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | return Column( 17 | crossAxisAlignment: CrossAxisAlignment.start, 18 | children: [ 19 | Text( 20 | label, 21 | style: Theme.of(context).textTheme.bodySmall, 22 | ), 23 | Text(text), 24 | ], 25 | ); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/src/url_preview/url_preview.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutterflow_widgets/flutterflow_widgets.dart'; 4 | import 'package:url_launcher/url_launcher_string.dart'; 5 | 6 | /// [UrlPreview] is a widget that shows a preview of a URL. 7 | /// 8 | /// [text] is the text that contains the URL. The first URL in the text is 9 | /// used to generate the preview. 10 | /// 11 | /// [descriptionLength] is the length of the description. 12 | /// 13 | /// [builder] is a builder function that takes the preview widget as [child] 14 | /// parameter. You can customize the preview widget by using the [builder]. 15 | /// 16 | class UrlPreview extends StatefulWidget { 17 | const UrlPreview({ 18 | Key? key, 19 | this.text, 20 | this.descriptionLength, 21 | required this.builder, 22 | }) : super(key: key); 23 | 24 | final String? text; 25 | final int? descriptionLength; 26 | final Widget Function(Widget) builder; 27 | 28 | @override 29 | createState() => _UrlPreviewState(); 30 | } 31 | 32 | class _UrlPreviewState extends State { 33 | final model = UrlPreviewModel(); 34 | @override 35 | void initState() { 36 | super.initState(); 37 | init(); 38 | } 39 | 40 | init() async { 41 | await model.load(widget.text); 42 | setState(() {}); 43 | } 44 | 45 | @override 46 | Widget build(BuildContext context) { 47 | if (widget.text == null || 48 | widget.text!.isEmpty || 49 | model.firstLink == null || 50 | model.firstLink!.isEmpty || 51 | model.html == null || 52 | model.html!.isEmpty) { 53 | return const SizedBox.shrink(); 54 | } 55 | 56 | final child = 57 | Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ 58 | if (model.image != null) CachedNetworkImage(imageUrl: model.image!), 59 | if (model.title != null) ...[ 60 | const SizedBox(height: 8), 61 | Text( 62 | model.title!, 63 | style: const TextStyle(fontWeight: FontWeight.w500, fontSize: 14), 64 | ), 65 | ], 66 | if (model.description != null) ...[ 67 | const SizedBox(height: 8), 68 | Text( 69 | model.description!.length > (widget.descriptionLength ?? 100) 70 | ? '${model.description!.substring(0, widget.descriptionLength ?? 100)}...' 71 | : model.description!, 72 | style: TextStyle(fontSize: 13, color: Colors.grey.shade800), 73 | ), 74 | ], 75 | ]); 76 | return GestureDetector( 77 | onTap: () async { 78 | if (await canLaunchUrlString(model.firstLink!)) { 79 | await launchUrlString(model.firstLink!); 80 | } else { 81 | throw 'Could not launch ${model..firstLink}'; 82 | } 83 | }, 84 | child: widget.builder(child), 85 | ); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /lib/src/url_preview/url_preview.model.dart: -------------------------------------------------------------------------------- 1 | import 'package:html/dom.dart'; 2 | import 'package:html/parser.dart'; 3 | 4 | import 'package:http/http.dart'; 5 | import 'package:linkify/linkify.dart'; 6 | import 'package:shared_preferences/shared_preferences.dart'; 7 | import 'package:crypto/crypto.dart'; 8 | 9 | class UrlPreviewModel { 10 | /// The input text that may contain a URL. 11 | String? text; 12 | 13 | String? firstLink; 14 | 15 | /// HTML 16 | /// 17 | /// The body of the URL. This is used to extract the meta data. 18 | String? html; 19 | 20 | String? siteName; 21 | String? title; 22 | String? description; 23 | String? image; 24 | 25 | UrlPreviewModel({ 26 | this.siteName, 27 | this.title, 28 | this.description, 29 | this.image, 30 | }); 31 | 32 | Future load(String? text) async { 33 | this.text = text; 34 | firstLink = getFirstLink(); 35 | if (firstLink == null || firstLink!.isEmpty) { 36 | return; 37 | } 38 | html = await getUrlContent(); 39 | if (html != null) { 40 | parseHtml(html!); 41 | } 42 | } 43 | 44 | bool get hasData { 45 | if (firstLink == null || 46 | firstLink!.isEmpty || 47 | html == null || 48 | html!.isEmpty) { 49 | return false; 50 | } else { 51 | return true; 52 | } 53 | } 54 | 55 | parseHtml(String body) { 56 | final Document doc = parse(body); 57 | 58 | siteName = getOGTag(doc, 'og:site_name'); 59 | title = getOGTag(doc, 'og:title') ?? getTag(doc, 'title'); 60 | description = 61 | getOGTag(doc, 'og:description') ?? getMeta(doc, 'description'); 62 | image = getOGTag(doc, 'og:image'); 63 | } 64 | 65 | String? getOGTag(Document document, String parameter) { 66 | final metaTags = document.getElementsByTagName("meta"); 67 | if (metaTags.isEmpty) return null; 68 | for (var meta in metaTags) { 69 | if (meta.attributes['property'] == parameter) { 70 | return meta.attributes['content']?.replaceAll('\n', " "); 71 | } 72 | } 73 | return null; 74 | } 75 | 76 | String? getTag(Document document, String tag) { 77 | final metaTags = document.getElementsByTagName(tag); 78 | if (metaTags.isEmpty) return null; 79 | for (var meta in metaTags) { 80 | return meta.text.replaceAll('\n', " "); 81 | } 82 | return null; 83 | } 84 | 85 | String? getMeta(Document document, String parameter) { 86 | final metaTags = document.getElementsByTagName("meta"); 87 | if (metaTags.isEmpty) return null; 88 | for (var meta in metaTags) { 89 | if (meta.attributes['name'] == parameter) { 90 | return meta.attributes['content']?.replaceAll('\n', " "); 91 | } 92 | } 93 | return null; 94 | } 95 | 96 | /// Attempts to extract link from a string. 97 | /// 98 | /// If no link is found, then return null. 99 | String? getFirstLink() { 100 | List elements = linkify( 101 | text!, 102 | options: const LinkifyOptions( 103 | humanize: false, 104 | ), 105 | ); 106 | 107 | for (final e in elements) { 108 | if (e is LinkableElement) { 109 | return e.url; 110 | } 111 | } 112 | return null; 113 | } 114 | 115 | Future getUrlContent() async { 116 | final md5Key = md5.convert(firstLink!.codeUnits).toString(); 117 | 118 | // Obtain shared preferences. 119 | final prefs = await SharedPreferences.getInstance(); 120 | String? html = prefs.getString(md5Key); 121 | if (html != null) { 122 | return html; 123 | } 124 | 125 | final response = await get(Uri.parse(firstLink!)); 126 | 127 | final contentType = response.headers['content-type']; 128 | if (contentType == null || !contentType.contains('text/html')) { 129 | return Future.value(''); 130 | } 131 | 132 | html = response.body; 133 | // Save an String value to 'action' key. 134 | await prefs.setString(md5Key, html); 135 | return Future.value(html); 136 | } 137 | 138 | @override 139 | String toString() { 140 | return 'UrlPreviewModel{siteName: $siteName, title: $title, description: $description, image: $image}'; 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutterflow_widgets 2 | description: Easy to use custom widget & action library for the FlutterFlow deveopers. 3 | version: 0.0.53 4 | homepage: https://github.com/thruthesky/flutterflow_widgets 5 | 6 | environment: 7 | sdk: ">=3.3.3 <4.0.0" 8 | flutter: ">=1.17.0" 9 | 10 | dependencies: 11 | flutter: 12 | sdk: flutter 13 | 14 | flutter_localizations: 15 | sdk: flutter 16 | 17 | # Add links to text 18 | flutter_linkify: ^6.0.0 19 | 20 | # Get links from text 21 | linkify: ^5.0.0 22 | 23 | # Open links 24 | url_launcher: 6.1.10 25 | 26 | cached_network_image: 3.2.1 27 | 28 | mime_type: 1.0.0 29 | chewie: ^1.5.0 30 | 31 | video_player: 2.6.0 32 | video_player_android: 2.4.3 33 | video_player_avfoundation: 2.4.2 34 | video_player_platform_interface: 6.2.0 35 | video_player_web: 2.3.1 36 | 37 | path: ^1.8.3 38 | 39 | # url preview 40 | http: ^0.13.5 41 | html: ^0.15.1 42 | 43 | # md5 for url preview 44 | crypto: ^3.0.2 45 | 46 | # local storage for url preview 47 | shared_preferences: 2.0.15 48 | 49 | # for CustomCalendar with the same version of FF 50 | table_calendar: ^3.0.8 51 | intl: ^0.19.0 52 | 53 | dev_dependencies: 54 | flutter_test: 55 | sdk: flutter 56 | flutter_lints: ^2.0.1 57 | -------------------------------------------------------------------------------- /res/img/calendar-action.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/calendar-action.jpg -------------------------------------------------------------------------------- /res/img/calendar-appstate.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/calendar-appstate.jpg -------------------------------------------------------------------------------- /res/img/calendar-display.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/calendar-display.jpg -------------------------------------------------------------------------------- /res/img/calendar-document.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/calendar-document.jpg -------------------------------------------------------------------------------- /res/img/calendar-schema.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/calendar-schema.jpg -------------------------------------------------------------------------------- /res/img/calendar-title.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/calendar-title.jpg -------------------------------------------------------------------------------- /res/img/custom-popup.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/custom-popup.gif -------------------------------------------------------------------------------- /res/img/ffw-calendar-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/ffw-calendar-2.jpg -------------------------------------------------------------------------------- /res/img/ffw-calendar-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/ffw-calendar-3.jpg -------------------------------------------------------------------------------- /res/img/ffw-calendar-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/ffw-calendar-5.jpg -------------------------------------------------------------------------------- /res/img/ffw-link-preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/ffw-link-preview.jpg -------------------------------------------------------------------------------- /res/img/icon-label-column.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/icon-label-column.jpg -------------------------------------------------------------------------------- /res/img/snackbar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/snackbar.gif -------------------------------------------------------------------------------- /res/img/url-preview-and-linkify-text-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/thruthesky/flutterflow_widgets/2c8a0f6e7f13641b040ca5eb36413ced226b5ca5/res/img/url-preview-and-linkify-text-2.jpg --------------------------------------------------------------------------------