Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 840a81f09e | |||
|
|
a2bad0f139 | ||
|
|
22f2de1bbe | ||
|
|
b77bcea769 | ||
| ada6040514 | |||
| 3c05534262 | |||
| 3caa52d9f8 |
@@ -21,7 +21,7 @@ android {
|
|||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
applicationId = "com.citycards_customer.citycards_customer"
|
applicationId = "com.citycard.customer"
|
||||||
// You can update the following values to match your application needs.
|
// You can update the following values to match your application needs.
|
||||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||||
minSdk = flutter.minSdkVersion
|
minSdk = flutter.minSdkVersion
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
6
android/app/src/main/res/drawable/launch_background.xml
Normal file
6
android/app/src/main/res/drawable/launch_background.xml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
BIN
assets/gif/itinenary_animation_for_citycards.mp4
Normal file
BIN
assets/gif/itinenary_animation_for_citycards.mp4
Normal file
Binary file not shown.
BIN
assets/logo/logo_white_resized.png
Normal file
BIN
assets/logo/logo_white_resized.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
BIN
assets/logo/logoframe.png
Normal file
BIN
assets/logo/logoframe.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
3
devtools_options.yaml
Normal file
3
devtools_options.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
description: This file stores settings for Dart & Flutter DevTools.
|
||||||
|
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
|
||||||
|
extensions:
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# Uncomment this line to define a global platform for your project
|
# Uncomment this line to define a global platform for your project
|
||||||
# platform :ios, '13.0'
|
platform :ios, '16.0'
|
||||||
|
|
||||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|||||||
99
ios/Podfile.lock
Normal file
99
ios/Podfile.lock
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
PODS:
|
||||||
|
- Flutter (1.0.0)
|
||||||
|
- flutter_angle (0.3.8):
|
||||||
|
- Flutter
|
||||||
|
- FlutterAngle (~> 0.0.8)
|
||||||
|
- FlutterMacOS
|
||||||
|
- flutter_native_splash (2.4.3):
|
||||||
|
- Flutter
|
||||||
|
- FlutterAngle (0.0.8)
|
||||||
|
- geolocator_apple (1.2.0):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- Google-Maps-iOS-Utils (6.1.0):
|
||||||
|
- GoogleMaps (~> 9.0)
|
||||||
|
- google_maps_flutter_ios (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- Google-Maps-iOS-Utils (< 7.0, >= 5.0)
|
||||||
|
- GoogleMaps (< 10.0, >= 8.4)
|
||||||
|
- GoogleMaps (9.4.0):
|
||||||
|
- GoogleMaps/Maps (= 9.4.0)
|
||||||
|
- GoogleMaps/Maps (9.4.0)
|
||||||
|
- image_picker_ios (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- package_info_plus (0.4.5):
|
||||||
|
- Flutter
|
||||||
|
- path_provider_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- shared_preferences_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- three_js_sensors (0.1.2):
|
||||||
|
- Flutter
|
||||||
|
- video_player_avfoundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- Flutter (from `Flutter`)
|
||||||
|
- flutter_angle (from `.symlinks/plugins/flutter_angle/darwin`)
|
||||||
|
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
|
||||||
|
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
|
||||||
|
- google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`)
|
||||||
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
|
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||||
|
- three_js_sensors (from `.symlinks/plugins/three_js_sensors/ios`)
|
||||||
|
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
|
||||||
|
|
||||||
|
SPEC REPOS:
|
||||||
|
trunk:
|
||||||
|
- FlutterAngle
|
||||||
|
- Google-Maps-iOS-Utils
|
||||||
|
- GoogleMaps
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
Flutter:
|
||||||
|
:path: Flutter
|
||||||
|
flutter_angle:
|
||||||
|
:path: ".symlinks/plugins/flutter_angle/darwin"
|
||||||
|
flutter_native_splash:
|
||||||
|
:path: ".symlinks/plugins/flutter_native_splash/ios"
|
||||||
|
geolocator_apple:
|
||||||
|
:path: ".symlinks/plugins/geolocator_apple/darwin"
|
||||||
|
google_maps_flutter_ios:
|
||||||
|
:path: ".symlinks/plugins/google_maps_flutter_ios/ios"
|
||||||
|
image_picker_ios:
|
||||||
|
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||||
|
package_info_plus:
|
||||||
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
|
path_provider_foundation:
|
||||||
|
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||||
|
shared_preferences_foundation:
|
||||||
|
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||||
|
three_js_sensors:
|
||||||
|
:path: ".symlinks/plugins/three_js_sensors/ios"
|
||||||
|
video_player_avfoundation:
|
||||||
|
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||||
|
flutter_angle: 7b1a2b3e733221bf2e0325e42fc3edf95b5d44c4
|
||||||
|
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
|
||||||
|
FlutterAngle: c810891af800750361b1d0e7cc944f2338d5ae18
|
||||||
|
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
|
||||||
|
Google-Maps-iOS-Utils: 0a484b05ed21d88c9f9ebbacb007956edd508a96
|
||||||
|
google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264
|
||||||
|
GoogleMaps: 0608099d4870cac8754bdba9b6953db543432438
|
||||||
|
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
|
||||||
|
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
||||||
|
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
|
||||||
|
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
|
||||||
|
three_js_sensors: f516b092803411e05b1e3dc7625efa36acd8f455
|
||||||
|
video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: 1857a7cdb7dfafe45f2b0e9a9af44644190f7506
|
||||||
|
|
||||||
|
COCOAPODS: 1.16.2
|
||||||
@@ -7,10 +7,12 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
00C1AB7B0C8F1922F3F1AE65 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54C8901E9D1856D980DFFE46 /* Pods_Runner.framework */; };
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||||
|
81D638B66EB4658C8192CA0D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 445696AB37183A7C63CB7E98 /* Pods_RunnerTests.framework */; };
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||||
@@ -45,6 +47,10 @@
|
|||||||
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||||
|
445696AB37183A7C63CB7E98 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
4FD33ADDA221C4BBA29FA3D6 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
54C8901E9D1856D980DFFE46 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
626B072D1717B50A277DA3C7 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||||
@@ -55,6 +61,10 @@
|
|||||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
B691822B373AD22ECA93B798 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
C1FCB3EF88270ED76DFA3FBD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
D56ABB8F306EF9F6809C0C1E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
E2E6DC2B6718F55E3BF165E7 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@@ -62,6 +72,15 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
00C1AB7B0C8F1922F3F1AE65 /* Pods_Runner.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
CF8A29BE993C0C902CB143AF /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
81D638B66EB4658C8192CA0D /* Pods_RunnerTests.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -76,6 +95,28 @@
|
|||||||
path = RunnerTests;
|
path = RunnerTests;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
5D45FB84C63476582408C414 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
54C8901E9D1856D980DFFE46 /* Pods_Runner.framework */,
|
||||||
|
445696AB37183A7C63CB7E98 /* Pods_RunnerTests.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
6D4A73F1E55857ADBD000C6A /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B691822B373AD22ECA93B798 /* Pods-Runner.debug.xcconfig */,
|
||||||
|
4FD33ADDA221C4BBA29FA3D6 /* Pods-Runner.release.xcconfig */,
|
||||||
|
D56ABB8F306EF9F6809C0C1E /* Pods-Runner.profile.xcconfig */,
|
||||||
|
E2E6DC2B6718F55E3BF165E7 /* Pods-RunnerTests.debug.xcconfig */,
|
||||||
|
626B072D1717B50A277DA3C7 /* Pods-RunnerTests.release.xcconfig */,
|
||||||
|
C1FCB3EF88270ED76DFA3FBD /* Pods-RunnerTests.profile.xcconfig */,
|
||||||
|
);
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -94,6 +135,8 @@
|
|||||||
97C146F01CF9000F007C117D /* Runner */,
|
97C146F01CF9000F007C117D /* Runner */,
|
||||||
97C146EF1CF9000F007C117D /* Products */,
|
97C146EF1CF9000F007C117D /* Products */,
|
||||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||||
|
6D4A73F1E55857ADBD000C6A /* Pods */,
|
||||||
|
5D45FB84C63476582408C414 /* Frameworks */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@@ -128,8 +171,10 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
BC66FA7BADCD3982DC87655E /* [CP] Check Pods Manifest.lock */,
|
||||||
331C807D294A63A400263BE5 /* Sources */,
|
331C807D294A63A400263BE5 /* Sources */,
|
||||||
331C807F294A63A400263BE5 /* Resources */,
|
331C807F294A63A400263BE5 /* Resources */,
|
||||||
|
CF8A29BE993C0C902CB143AF /* Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@@ -145,12 +190,15 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
3825EC0F330C0B58EA2A8981 /* [CP] Check Pods Manifest.lock */,
|
||||||
9740EEB61CF901F6004384FC /* Run Script */,
|
9740EEB61CF901F6004384FC /* Run Script */,
|
||||||
97C146EA1CF9000F007C117D /* Sources */,
|
97C146EA1CF9000F007C117D /* Sources */,
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||||
97C146EC1CF9000F007C117D /* Resources */,
|
97C146EC1CF9000F007C117D /* Resources */,
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||||
|
41FC0A605EBADE26C841287E /* [CP] Embed Pods Frameworks */,
|
||||||
|
D10E98BB568B7005161E1ABD /* [CP] Copy Pods Resources */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@@ -222,6 +270,28 @@
|
|||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
3825EC0F330C0B58EA2A8981 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
alwaysOutOfDate = 1;
|
alwaysOutOfDate = 1;
|
||||||
@@ -238,6 +308,23 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||||
};
|
};
|
||||||
|
41FC0A605EBADE26C841287E /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
alwaysOutOfDate = 1;
|
alwaysOutOfDate = 1;
|
||||||
@@ -253,6 +340,45 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||||
};
|
};
|
||||||
|
BC66FA7BADCD3982DC87655E /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
D10E98BB568B7005161E1ABD /* [CP] Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Copy Pods Resources";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
@@ -361,24 +487,35 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = A89AY6VY4F;
|
DEVELOPMENT_TEAM = A89AY6VY4F;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
|
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||||
|
SUPPORTS_MACCATALYST = NO;
|
||||||
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||||
|
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
};
|
};
|
||||||
name = Profile;
|
name = Profile;
|
||||||
};
|
};
|
||||||
331C8088294A63A400263BE5 /* Debug */ = {
|
331C8088294A63A400263BE5 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = E2E6DC2B6718F55E3BF165E7 /* Pods-RunnerTests.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@@ -396,6 +533,7 @@
|
|||||||
};
|
};
|
||||||
331C8089294A63A400263BE5 /* Release */ = {
|
331C8089294A63A400263BE5 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 626B072D1717B50A277DA3C7 /* Pods-RunnerTests.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@@ -411,6 +549,7 @@
|
|||||||
};
|
};
|
||||||
331C808A294A63A400263BE5 /* Profile */ = {
|
331C808A294A63A400263BE5 /* Profile */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = C1FCB3EF88270ED76DFA3FBD /* Pods-RunnerTests.profile.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@@ -475,7 +614,7 @@
|
|||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
@@ -526,6 +665,7 @@
|
|||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SUPPORTED_PLATFORMS = iphoneos;
|
SUPPORTED_PLATFORMS = iphoneos;
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
@@ -541,19 +681,29 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = A89AY6VY4F;
|
DEVELOPMENT_TEAM = A89AY6VY4F;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
|
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||||
|
SUPPORTS_MACCATALYST = NO;
|
||||||
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||||
|
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
@@ -564,18 +714,28 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = A89AY6VY4F;
|
DEVELOPMENT_TEAM = A89AY6VY4F;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
|
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||||
|
SUPPORTS_MACCATALYST = NO;
|
||||||
|
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||||
|
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
|
|||||||
3
ios/Runner.xcworkspace/contents.xcworkspacedata
generated
3
ios/Runner.xcworkspace/contents.xcworkspacedata
generated
@@ -4,4 +4,7 @@
|
|||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Runner.xcodeproj">
|
location = "group:Runner.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
<true/>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<key>CFBundleDisplayName</key>
|
<key>CFBundleDisplayName</key>
|
||||||
@@ -17,17 +19,29 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
<string>1.0.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
<string>3</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>NSCameraUsageDescription</key>
|
||||||
|
<string>We need access to your camera for taking photos for profile and to build a postcard.</string>
|
||||||
|
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
|
||||||
|
<string>Citycard customer needs your location to find the closest place you can visit.</string>
|
||||||
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
|
<string>Citycard customer needs your location to find the closest place you can visit.</string>
|
||||||
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
|
<string>We need access to your camera for taking photos for profile and to build a postcard.</string>
|
||||||
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
|
<true/>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>UIMainStoryboardFile</key>
|
||||||
<string>Main</string>
|
<string>Main</string>
|
||||||
|
<key>UIStatusBarHidden</key>
|
||||||
|
<false/>
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
<array>
|
<array>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
@@ -41,11 +55,5 @@
|
|||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIStatusBarHidden</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'package:citycards_customer/common_packages/common_app_texts.dart';
|
||||||
|
|
||||||
import '../models/attraction_model.dart';
|
import '../models/attraction_model.dart';
|
||||||
|
|
||||||
class AttractionsRepository {
|
class AttractionsRepository {
|
||||||
@@ -8,7 +10,7 @@ class AttractionsRepository {
|
|||||||
location: "Krong Siem Reap",
|
location: "Krong Siem Reap",
|
||||||
price: "\$25",
|
price: "\$25",
|
||||||
image: "assets/dummy/dummy_1.jpg",
|
image: "assets/dummy/dummy_1.jpg",
|
||||||
tags: ["Unlimited Card", "Flexi Card"],
|
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
|
||||||
isBookingRequired: false,
|
isBookingRequired: false,
|
||||||
description:
|
description:
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
||||||
@@ -28,7 +30,7 @@ class AttractionsRepository {
|
|||||||
location: "Krong Siem Reap",
|
location: "Krong Siem Reap",
|
||||||
price: "\$25",
|
price: "\$25",
|
||||||
image: "assets/dummy/dummy_3.jpg",
|
image: "assets/dummy/dummy_3.jpg",
|
||||||
tags: ["Unlimited Card", "Flexi Card"],
|
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
|
||||||
isBookingRequired: false,
|
isBookingRequired: false,
|
||||||
description:
|
description:
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
||||||
@@ -38,7 +40,7 @@ class AttractionsRepository {
|
|||||||
location: "Krong Siem Reap",
|
location: "Krong Siem Reap",
|
||||||
price: "\$25",
|
price: "\$25",
|
||||||
image: "assets/dummy/dummy_4.jpg",
|
image: "assets/dummy/dummy_4.jpg",
|
||||||
tags: ["Flexi Card"],
|
tags: ["${CommonAppText.selectiveCard} Card"],
|
||||||
isBookingRequired: false,
|
isBookingRequired: false,
|
||||||
description:
|
description:
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
||||||
@@ -48,7 +50,7 @@ class AttractionsRepository {
|
|||||||
location: "Krong Siem Reap",
|
location: "Krong Siem Reap",
|
||||||
price: "\$25",
|
price: "\$25",
|
||||||
image: "assets/dummy/dummy_5.jpg",
|
image: "assets/dummy/dummy_5.jpg",
|
||||||
tags: ["Unlimited Card", "Flexi Card"],
|
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
|
||||||
isBookingRequired: false,
|
isBookingRequired: false,
|
||||||
description:
|
description:
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
||||||
@@ -63,7 +65,7 @@ class AttractionsRepository {
|
|||||||
location: "Krong Siem Reap",
|
location: "Krong Siem Reap",
|
||||||
price: "\$25",
|
price: "\$25",
|
||||||
image: "assets/dummy/dummy_1.jpg",
|
image: "assets/dummy/dummy_1.jpg",
|
||||||
tags: ["Unlimited Card", "Flexi Card"],
|
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
|
||||||
isBookingRequired: true,
|
isBookingRequired: true,
|
||||||
description:
|
description:
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
||||||
@@ -83,7 +85,7 @@ class AttractionsRepository {
|
|||||||
location: "Krong Siem Reap",
|
location: "Krong Siem Reap",
|
||||||
price: "\$25",
|
price: "\$25",
|
||||||
image: "assets/dummy/dummy_3.jpg",
|
image: "assets/dummy/dummy_3.jpg",
|
||||||
tags: ["Unlimited Card", "Flexi Card"],
|
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
|
||||||
isBookingRequired: true,
|
isBookingRequired: true,
|
||||||
description:
|
description:
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
||||||
@@ -93,7 +95,7 @@ class AttractionsRepository {
|
|||||||
location: "Krong Siem Reap",
|
location: "Krong Siem Reap",
|
||||||
price: "\$25",
|
price: "\$25",
|
||||||
image: "assets/dummy/dummy_4.jpg",
|
image: "assets/dummy/dummy_4.jpg",
|
||||||
tags: ["Flexi Card"],
|
tags: ["${CommonAppText.selectiveCard} Card"],
|
||||||
isBookingRequired: true,
|
isBookingRequired: true,
|
||||||
description:
|
description:
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
||||||
@@ -103,7 +105,7 @@ class AttractionsRepository {
|
|||||||
location: "Krong Siem Reap",
|
location: "Krong Siem Reap",
|
||||||
price: "\$25",
|
price: "\$25",
|
||||||
image: "assets/dummy/dummy_5.jpg",
|
image: "assets/dummy/dummy_5.jpg",
|
||||||
tags: ["Unlimited Card", "Flexi Card"],
|
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
|
||||||
isBookingRequired: true,
|
isBookingRequired: true,
|
||||||
description:
|
description:
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
|
import '../../common_packages/common_app_texts.dart';
|
||||||
import '../../core/route_constants.dart';
|
import '../../core/route_constants.dart';
|
||||||
import '../models/attraction_model.dart';
|
import '../models/attraction_model.dart';
|
||||||
|
|
||||||
@@ -86,13 +87,13 @@ class AttractionCard extends StatelessWidget {
|
|||||||
vertical: 4,
|
vertical: 4,
|
||||||
),
|
),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: tag == "Flexi Card"
|
color: tag == "${CommonAppText.selectiveCard} Card"
|
||||||
? const Color(0xffF95FAF).withOpacity(0.1)
|
? const Color(0xffF95FAF).withOpacity(0.1)
|
||||||
: const Color(
|
: const Color(
|
||||||
0xffF95F62,
|
0xffF95F62,
|
||||||
).withOpacity(0.1),
|
).withOpacity(0.1),
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: tag == "Flexi Card"
|
color: tag == "${CommonAppText.selectiveCard} Card"
|
||||||
? const Color(0xffF95FAF)
|
? const Color(0xffF95FAF)
|
||||||
: const Color(0xffF95F62),
|
: const Color(0xffF95F62),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import 'package:citycards_customer/core/route_constants.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import '../../common_packages/common_app_texts.dart';
|
||||||
|
|
||||||
class BuyPassView extends StatelessWidget {
|
class BuyPassView extends StatelessWidget {
|
||||||
BuyPassView({super.key});
|
BuyPassView({super.key});
|
||||||
|
|
||||||
@@ -68,9 +70,9 @@ class BuyPassView extends StatelessWidget {
|
|||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
PassCardView(themeColor: Color(0xFFF95FAF)),
|
PassCardView(themeColor: Color(0xFFF97316)),
|
||||||
SizedBox(width: 12.w),
|
SizedBox(width: 12.w),
|
||||||
PassCardView(themeColor: Color(0xFF1E8AF6)),
|
PassCardView(themeColor: Color(0xFF1E8AF6),),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -203,6 +205,8 @@ class BuyPassView extends StatelessWidget {
|
|||||||
text: offer["description"] ?? "",
|
text: offer["description"] ?? "",
|
||||||
color: Colors.black.withOpacity(.6),
|
color: Colors.black.withOpacity(.6),
|
||||||
size: 12.sp,
|
size: 12.sp,
|
||||||
|
maxLines: 2,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -215,7 +219,7 @@ class BuyPassView extends StatelessWidget {
|
|||||||
Center(
|
Center(
|
||||||
child: PaymentCard(
|
child: PaymentCard(
|
||||||
city: 'Melbourne',
|
city: 'Melbourne',
|
||||||
tag: 'Flexi Card',
|
tag: '${CommonAppText.selectiveCard} Card',
|
||||||
oldPrice: 120,
|
oldPrice: 120,
|
||||||
newPrice: 90,
|
newPrice: 90,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import '../../common_packages/common_app_texts.dart';
|
||||||
|
|
||||||
class FeatureTable extends StatelessWidget {
|
class FeatureTable extends StatelessWidget {
|
||||||
const FeatureTable({super.key});
|
const FeatureTable({super.key});
|
||||||
|
|
||||||
@@ -66,7 +68,7 @@ class FeatureTable extends StatelessWidget {
|
|||||||
padding: EdgeInsets.symmetric(vertical: 6.h),
|
padding: EdgeInsets.symmetric(vertical: 6.h),
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
'Flexi',
|
'${CommonAppText.selectiveCard}',
|
||||||
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 16.sp),
|
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 16.sp),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import 'package:citycards_customer/common_packages/custom_text.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import '../../common_packages/common_app_texts.dart';
|
||||||
|
|
||||||
class PassCardView extends StatelessWidget {
|
class PassCardView extends StatelessWidget {
|
||||||
final Color? themeColor;
|
final Color? themeColor;
|
||||||
final String? city;
|
final String? city;
|
||||||
@@ -26,140 +28,138 @@ class PassCardView extends StatelessWidget {
|
|||||||
border: Border.all(color:( themeColor ?? Color(0xFFF95FAF)).withOpacity(0.24)),
|
border: Border.all(color:( themeColor ?? Color(0xFFF95FAF)).withOpacity(0.24)),
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
),
|
),
|
||||||
child: Expanded(
|
child: Row(
|
||||||
child: Row(
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
children: [
|
||||||
children: [
|
Row(
|
||||||
Row(
|
children: [
|
||||||
children: [
|
ClipRRect(
|
||||||
ClipRRect(
|
|
||||||
borderRadius: BorderRadius.only(
|
|
||||||
topLeft: Radius.circular(8.r),
|
|
||||||
bottomLeft: Radius.circular(8.r)
|
|
||||||
),
|
|
||||||
child: Image.asset(
|
|
||||||
"assets/images/card_banner.png",
|
|
||||||
scale: 4,
|
|
||||||
width: 103.w,
|
|
||||||
height:140.h,
|
|
||||||
fit: BoxFit.cover,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(width: 6.66.w),
|
|
||||||
Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
CustomText(
|
|
||||||
text: "Melbourne",
|
|
||||||
weight: FontWeight.w500,
|
|
||||||
size: 16.sp,
|
|
||||||
),
|
|
||||||
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
"From ",
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.black.withOpacity(0.6),
|
|
||||||
fontSize: 11.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
"\$80",
|
|
||||||
style: TextStyle(
|
|
||||||
color:themeColor,
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
fontSize: 24.sp,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
" /Adult",
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.black.withOpacity(0.8),
|
|
||||||
fontSize: 11.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
"and ",
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.black.withOpacity(0.6),
|
|
||||||
fontSize: 11.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
"\$10",
|
|
||||||
style: TextStyle(
|
|
||||||
color: themeColor,
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
fontSize: 24.sp,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
" /child",
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.black.withOpacity(0.8),
|
|
||||||
fontSize: 11.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(
|
|
||||||
width: 193.w,
|
|
||||||
child: CustomText(
|
|
||||||
text:
|
|
||||||
"Dive into an extensive selection of thrilling destinations!",
|
|
||||||
color: Color(0xFF000000).withOpacity(0.6),
|
|
||||||
size: 11.sp,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
|
|
||||||
Container(
|
|
||||||
width: 35.w,
|
|
||||||
height: 140.h,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: themeColor,
|
|
||||||
borderRadius: BorderRadius.only(
|
borderRadius: BorderRadius.only(
|
||||||
bottomRight: Radius.circular(8.r),
|
topLeft: Radius.circular(8.r),
|
||||||
topRight: Radius.circular(8.r),
|
bottomLeft: Radius.circular(8.r)
|
||||||
|
),
|
||||||
|
child: Image.asset(
|
||||||
|
"assets/images/card_banner.png",
|
||||||
|
scale: 4,
|
||||||
|
width: 103.w,
|
||||||
|
height:140.h,
|
||||||
|
fit: BoxFit.cover,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
child: RotatedBox(
|
SizedBox(width: 6.66.w),
|
||||||
quarterTurns: -1,
|
Column(
|
||||||
child: Center(
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
child: RichText(
|
children: [
|
||||||
text: TextSpan(
|
CustomText(
|
||||||
children: [
|
text: "Melbourne",
|
||||||
TextSpan(
|
weight: FontWeight.w500,
|
||||||
text: "Flexi ",
|
size: 16.sp,
|
||||||
style: TextStyle(color: Colors.white, fontSize: 16.sp),
|
),
|
||||||
|
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"From ",
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black.withOpacity(0.6),
|
||||||
|
fontSize: 11.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
),
|
),
|
||||||
TextSpan(
|
),
|
||||||
text: "Card",
|
Text(
|
||||||
style: TextStyle(color: Colors.white, fontSize: 12.sp),
|
"\$80",
|
||||||
|
style: TextStyle(
|
||||||
|
color:themeColor,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
fontSize: 24.sp,
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
|
Text(
|
||||||
|
" /Adult",
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black.withOpacity(0.8),
|
||||||
|
fontSize: 11.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"and ",
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black.withOpacity(0.6),
|
||||||
|
fontSize: 11.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"\$10",
|
||||||
|
style: TextStyle(
|
||||||
|
color: themeColor,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
fontSize: 24.sp,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
" /child",
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black.withOpacity(0.8),
|
||||||
|
fontSize: 11.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(
|
||||||
|
width: 193.w,
|
||||||
|
child: CustomText(
|
||||||
|
text:
|
||||||
|
"Dive into an extensive selection of thrilling destinations!",
|
||||||
|
color: Color(0xFF000000).withOpacity(0.6),
|
||||||
|
size: 11.sp,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
Container(
|
||||||
|
width: 35.w,
|
||||||
|
height: 140.h,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: themeColor,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomRight: Radius.circular(8.r),
|
||||||
|
topRight: Radius.circular(8.r),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: RotatedBox(
|
||||||
|
quarterTurns: -1,
|
||||||
|
child: Center(
|
||||||
|
child: RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: "${CommonAppText.selectiveCard} ",
|
||||||
|
style: TextStyle(color: Colors.white, fontSize: 16.sp),
|
||||||
|
),
|
||||||
|
TextSpan(
|
||||||
|
text: "Card",
|
||||||
|
style: TextStyle(color: Colors.white, fontSize: 12.sp),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
),
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import 'package:citycards_customer/common_packages/custom_text.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import '../../checkout/widget/login_email_bottomsheet.dart';
|
||||||
|
import '../../common_packages/common_app_texts.dart';
|
||||||
import '../blocs/pass_bloc.dart';
|
import '../blocs/pass_bloc.dart';
|
||||||
|
|
||||||
class MyPassesPage extends StatelessWidget {
|
class MyPassesPage extends StatelessWidget {
|
||||||
@@ -23,14 +25,13 @@ class MyPassesPage extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
SizedBox(height: 22.h),
|
SizedBox(height: 22.h),
|
||||||
Container(
|
Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: Color(0xFFF95FAF).withOpacity(0.2),
|
color: Color(0xFFF95FAF).withOpacity(0.2),
|
||||||
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
),
|
),
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
|
||||||
),
|
|
||||||
child: Expanded(
|
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
@@ -154,7 +155,7 @@ class MyPassesPage extends StatelessWidget {
|
|||||||
width: 35.w,
|
width: 35.w,
|
||||||
height: 123.h,
|
height: 123.h,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Color(0xFFF95FAF),
|
color: Color(0xFFF97316),
|
||||||
borderRadius: BorderRadius.only(
|
borderRadius: BorderRadius.only(
|
||||||
bottomRight: Radius.circular(8.r),
|
bottomRight: Radius.circular(8.r),
|
||||||
topRight: Radius.circular(8.r),
|
topRight: Radius.circular(8.r),
|
||||||
@@ -167,7 +168,7 @@ class MyPassesPage extends StatelessWidget {
|
|||||||
text: TextSpan(
|
text: TextSpan(
|
||||||
children: [
|
children: [
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: "Flexi ",
|
text: "${CommonAppText.selectiveCard} ",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 16.sp,
|
fontSize: 16.sp,
|
||||||
@@ -189,8 +190,6 @@ class MyPassesPage extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 15.h),
|
SizedBox(height: 15.h),
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.symmetric(
|
padding: EdgeInsets.symmetric(
|
||||||
@@ -336,7 +335,19 @@ class MyPassesPage extends StatelessWidget {
|
|||||||
SizedBox(height: 150.h,),
|
SizedBox(height: 150.h,),
|
||||||
|
|
||||||
CustomFilledButton(
|
CustomFilledButton(
|
||||||
onTap: () {},
|
onTap: () {
|
||||||
|
showModalBottomSheet(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
context: context,
|
||||||
|
isScrollControlled: true,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.vertical(
|
||||||
|
top: Radius.circular(12.r),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
builder: (_) => const LoginEmailBottomsheet(),
|
||||||
|
);
|
||||||
|
},
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
label: "Proceed to Checkout",
|
label: "Proceed to Checkout",
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:citycards_customer/common_packages/custom_text.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import '../../checkout/widget/login_email_bottomsheet.dart';
|
||||||
import '../blocs/postcard_bloc.dart';
|
import '../blocs/postcard_bloc.dart';
|
||||||
|
|
||||||
class MyPostCardsPage extends StatelessWidget {
|
class MyPostCardsPage extends StatelessWidget {
|
||||||
@@ -156,7 +157,19 @@ class MyPostCardsPage extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
SizedBox(height: 60.h),
|
SizedBox(height: 60.h),
|
||||||
CustomFilledButton(
|
CustomFilledButton(
|
||||||
onTap: () {},
|
onTap: () {
|
||||||
|
showModalBottomSheet(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
context: context,
|
||||||
|
isScrollControlled: true,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.vertical(
|
||||||
|
top: Radius.circular(12.r),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
builder: (_) => const LoginEmailBottomsheet(),
|
||||||
|
);
|
||||||
|
},
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
label: "Proceed to Checkout",
|
label: "Proceed to Checkout",
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import 'package:citycards_customer/common_packages/custom_dashed_line.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import '../../common_packages/common_app_texts.dart';
|
||||||
|
|
||||||
class CheckoutView extends StatelessWidget {
|
class CheckoutView extends StatelessWidget {
|
||||||
const CheckoutView({super.key});
|
const CheckoutView({super.key});
|
||||||
|
|
||||||
@@ -40,13 +42,13 @@ class CheckoutView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
|
|
||||||
SizedBox(height: 22.h),
|
SizedBox(height: 22.h),
|
||||||
Container(
|
Expanded(
|
||||||
decoration: BoxDecoration(
|
child: Container(
|
||||||
color: Colors.white,
|
decoration: BoxDecoration(
|
||||||
border: Border.all(color: Color(0xFFF95FAF).withOpacity(0.2)),
|
color: Colors.white,
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
border: Border.all(color: Color(0xFFF95FAF).withOpacity(0.2)),
|
||||||
),
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
child: Expanded(
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
@@ -167,7 +169,7 @@ class CheckoutView extends StatelessWidget {
|
|||||||
width: 35.w,
|
width: 35.w,
|
||||||
height: 123.h,
|
height: 123.h,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Color(0xFFF95FAF),
|
color: Color(0xFFF97316),
|
||||||
borderRadius: BorderRadius.only(
|
borderRadius: BorderRadius.only(
|
||||||
bottomRight: Radius.circular(8.r),
|
bottomRight: Radius.circular(8.r),
|
||||||
topRight: Radius.circular(8.r),
|
topRight: Radius.circular(8.r),
|
||||||
@@ -180,7 +182,7 @@ class CheckoutView extends StatelessWidget {
|
|||||||
text: TextSpan(
|
text: TextSpan(
|
||||||
children: [
|
children: [
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: "Flexi ",
|
text: "${CommonAppText.selectiveCard} ",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 16.sp,
|
fontSize: 16.sp,
|
||||||
@@ -204,7 +206,7 @@ class CheckoutView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
SizedBox(height: 15.h),
|
SizedBox(height: 10.h),
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h),
|
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
|
|||||||
@@ -19,93 +19,95 @@ class LoginEmailBottomsheet extends StatelessWidget {
|
|||||||
right: 20.h,
|
right: 20.h,
|
||||||
bottom: MediaQuery.of(context).viewInsets.bottom,
|
bottom: MediaQuery.of(context).viewInsets.bottom,
|
||||||
),
|
),
|
||||||
child: SingleChildScrollView(
|
child: SafeArea(
|
||||||
child: Column(
|
child: SingleChildScrollView(
|
||||||
mainAxisSize: MainAxisSize.min, // shrink to fit content
|
child: Column(
|
||||||
children: [
|
mainAxisSize: MainAxisSize.min, // shrink to fit content
|
||||||
Image.asset("assets/logo/logo_city_cards_orange.png", scale: 4),
|
children: [
|
||||||
SizedBox(height: 8.h),
|
Image.asset("assets/logo/logo_city_cards_orange.png", scale: 4),
|
||||||
CustomText(text: "Get Started", size: 18.sp, weight: FontWeight.w500),
|
SizedBox(height: 8.h),
|
||||||
SizedBox(height: 42.h),
|
CustomText(text: "Get Started", size: 18.sp, weight: FontWeight.w500),
|
||||||
CustomText(
|
SizedBox(height: 42.h),
|
||||||
text: "Enter your email to begin your CityCards journey",
|
CustomText(
|
||||||
size: 14.sp,
|
text: "Enter your email to begin your CityCards journey",
|
||||||
color: const Color(0xFF000000).withOpacity(.6),
|
size: 14.sp,
|
||||||
),
|
color: const Color(0xFF000000).withOpacity(.6),
|
||||||
SizedBox(height: 12.h),
|
|
||||||
|
|
||||||
TextField(
|
|
||||||
decoration: InputDecoration(
|
|
||||||
filled: true,
|
|
||||||
contentPadding: EdgeInsets.symmetric(vertical: 6.h),
|
|
||||||
fillColor: const Color(0xFFFFF5F5),
|
|
||||||
enabledBorder: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
|
|
||||||
borderRadius: BorderRadius.circular(8.sp),
|
|
||||||
),
|
|
||||||
focusedBorder: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
|
|
||||||
borderRadius: BorderRadius.circular(8.sp),
|
|
||||||
),
|
|
||||||
prefixIcon: const Icon(Icons.email_outlined, color: Color(0xFFF95F62)),
|
|
||||||
hintText: "john.doe@gmail.com",
|
|
||||||
hintStyle: TextStyle(
|
|
||||||
color: const Color(0xFF000000).withOpacity(0.6),
|
|
||||||
fontSize: 12.sp,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
SizedBox(height: 12.h),
|
||||||
|
|
||||||
SizedBox(height: 38.h),
|
TextField(
|
||||||
CustomFilledButton(
|
decoration: InputDecoration(
|
||||||
onTap: () {
|
filled: true,
|
||||||
Navigator.pop(context);
|
contentPadding: EdgeInsets.symmetric(vertical: 6.h),
|
||||||
showModalBottomSheet(
|
fillColor: const Color(0xFFFFF5F5),
|
||||||
context: context,
|
enabledBorder: OutlineInputBorder(
|
||||||
backgroundColor: Colors.white,
|
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
|
||||||
isScrollControlled: true,
|
borderRadius: BorderRadius.circular(8.sp),
|
||||||
shape: RoundedRectangleBorder(
|
),
|
||||||
borderRadius: BorderRadius.vertical(
|
focusedBorder: OutlineInputBorder(
|
||||||
top: Radius.circular(12.r),
|
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
|
||||||
),
|
borderRadius: BorderRadius.circular(8.sp),
|
||||||
|
),
|
||||||
|
prefixIcon: const Icon(Icons.email_outlined, color: Color(0xFFF95F62)),
|
||||||
|
hintText: "john.doe@gmail.com",
|
||||||
|
hintStyle: TextStyle(
|
||||||
|
color: const Color(0xFF000000).withOpacity(0.6),
|
||||||
|
fontSize: 12.sp,
|
||||||
),
|
),
|
||||||
builder: (_) => VerifyOtpBottomsheet(),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
label: "Continue",
|
|
||||||
width: double.infinity,
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 20.h),
|
|
||||||
InkWell(
|
|
||||||
onTap: (){
|
|
||||||
Navigator.of(context).pushNamed(RouteConstants.createAcct);
|
|
||||||
},
|
|
||||||
child: Text.rich(
|
|
||||||
TextSpan(
|
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: "Already have an account?",
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.black.withOpacity(0.6),
|
|
||||||
fontSize: 12.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TextSpan(
|
|
||||||
text: " Sign in",
|
|
||||||
style: TextStyle(
|
|
||||||
color: const Color(0xFFF95F62),
|
|
||||||
fontSize: 12.sp,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
SizedBox(height: 15.h),
|
SizedBox(height: 38.h),
|
||||||
],
|
CustomFilledButton(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.pop(context);
|
||||||
|
showModalBottomSheet(
|
||||||
|
context: context,
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
isScrollControlled: true,
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.vertical(
|
||||||
|
top: Radius.circular(12.r),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
builder: (_) => VerifyOtpBottomsheet(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
label: "Continue",
|
||||||
|
width: double.infinity,
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 20.h),
|
||||||
|
InkWell(
|
||||||
|
onTap: (){
|
||||||
|
Navigator.of(context).pushNamed(RouteConstants.createAcct);
|
||||||
|
},
|
||||||
|
child: Text.rich(
|
||||||
|
TextSpan(
|
||||||
|
children: [
|
||||||
|
TextSpan(
|
||||||
|
text: "Already have an account?",
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black.withOpacity(0.6),
|
||||||
|
fontSize: 12.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextSpan(
|
||||||
|
text: " Sign in",
|
||||||
|
style: TextStyle(
|
||||||
|
color: const Color(0xFFF95F62),
|
||||||
|
fontSize: 12.sp,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 15.h),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
3
lib/common_packages/common_app_texts.dart
Normal file
3
lib/common_packages/common_app_texts.dart
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
class CommonAppText {
|
||||||
|
static const String selectiveCard = "Selective";
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ import '../attractions/views/attractions_page_view.dart';
|
|||||||
import '../buy_a_pass/view/buy_pass_view.dart';
|
import '../buy_a_pass/view/buy_pass_view.dart';
|
||||||
import '../checkout/view/checkout_view.dart';
|
import '../checkout/view/checkout_view.dart';
|
||||||
import '../create_account/create_account_view.dart';
|
import '../create_account/create_account_view.dart';
|
||||||
|
import '../intro_screens/views/intro_screen_view.dart';
|
||||||
import '../itinerary_creation/bloc/itinerary_detail_bloc.dart';
|
import '../itinerary_creation/bloc/itinerary_detail_bloc.dart';
|
||||||
import '../itinerary_creation/bloc/itinerary_steps_selection_bloc.dart';
|
import '../itinerary_creation/bloc/itinerary_steps_selection_bloc.dart';
|
||||||
import '../itinerary_creation/views/itinerary_creation_view.dart';
|
import '../itinerary_creation/views/itinerary_creation_view.dart';
|
||||||
@@ -39,6 +40,11 @@ Widget buildOffstageNavigator(
|
|||||||
case '/':
|
case '/':
|
||||||
return MaterialPageRoute(builder: (_) => child);
|
return MaterialPageRoute(builder: (_) => child);
|
||||||
|
|
||||||
|
case RouteConstants.intro:
|
||||||
|
return MaterialPageRoute(builder: (_){
|
||||||
|
return IntroScreensView();
|
||||||
|
});
|
||||||
|
|
||||||
// 🔹 Attractions Page
|
// 🔹 Attractions Page
|
||||||
case RouteConstants.attractionsPage:
|
case RouteConstants.attractionsPage:
|
||||||
final args = settings.arguments as String;
|
final args = settings.arguments as String;
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ class CreateAccountView extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
@@ -110,7 +109,7 @@ class CreateAccountView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
SizedBox(height: 36.h),
|
SizedBox(height: 16.h),
|
||||||
CustomFilledButton(
|
CustomFilledButton(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
onTap: (){}, label: "Create Account")
|
onTap: (){}, label: "Create Account")
|
||||||
|
|||||||
112
lib/home/model/city_list_model.dart
Normal file
112
lib/home/model/city_list_model.dart
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
class CityList {
|
||||||
|
List<Cities>? cities;
|
||||||
|
List<UpcomingCities>? upcomingCities;
|
||||||
|
|
||||||
|
CityList({this.cities, this.upcomingCities});
|
||||||
|
|
||||||
|
CityList.fromJson(Map<String, dynamic> json) {
|
||||||
|
if (json['cities'] != null) {
|
||||||
|
cities = <Cities>[];
|
||||||
|
json['cities'].forEach((v) {
|
||||||
|
cities!.add(new Cities.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (json['upcomingCities'] != null) {
|
||||||
|
upcomingCities = <UpcomingCities>[];
|
||||||
|
json['upcomingCities'].forEach((v) {
|
||||||
|
upcomingCities!.add(new UpcomingCities.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
if (this.cities != null) {
|
||||||
|
data['cities'] = this.cities!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
if (this.upcomingCities != null) {
|
||||||
|
data['upcomingCities'] =
|
||||||
|
this.upcomingCities!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Cities {
|
||||||
|
int? id;
|
||||||
|
String? cityName;
|
||||||
|
String? tagLine;
|
||||||
|
String? bannerImage;
|
||||||
|
int? indivisualTicketAmt;
|
||||||
|
int? cityCardTicketAmt;
|
||||||
|
int? saveAmount;
|
||||||
|
String? saveLabel;
|
||||||
|
List<UpcomingCities>? upcomingCities;
|
||||||
|
|
||||||
|
Cities(
|
||||||
|
{this.id,
|
||||||
|
this.cityName,
|
||||||
|
this.tagLine,
|
||||||
|
this.bannerImage,
|
||||||
|
this.indivisualTicketAmt,
|
||||||
|
this.cityCardTicketAmt,
|
||||||
|
this.saveAmount,
|
||||||
|
this.saveLabel,
|
||||||
|
this.upcomingCities});
|
||||||
|
|
||||||
|
Cities.fromJson(Map<String, dynamic> json) {
|
||||||
|
id = json['id'];
|
||||||
|
cityName = json['cityName'];
|
||||||
|
tagLine = json['tagLine'];
|
||||||
|
bannerImage = json['bannerImage'];
|
||||||
|
indivisualTicketAmt = json['indivisualTicketAmt'];
|
||||||
|
cityCardTicketAmt = json['cityCardTicketAmt'];
|
||||||
|
saveAmount = json['saveAmount'];
|
||||||
|
saveLabel = json['saveLabel'];
|
||||||
|
if (json['upcomingCities'] != null) {
|
||||||
|
upcomingCities = <UpcomingCities>[];
|
||||||
|
json['upcomingCities'].forEach((v) {
|
||||||
|
upcomingCities!.add(new UpcomingCities.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['id'] = this.id;
|
||||||
|
data['cityName'] = this.cityName;
|
||||||
|
data['tagLine'] = this.tagLine;
|
||||||
|
data['bannerImage'] = this.bannerImage;
|
||||||
|
data['indivisualTicketAmt'] = this.indivisualTicketAmt;
|
||||||
|
data['cityCardTicketAmt'] = this.cityCardTicketAmt;
|
||||||
|
data['saveAmount'] = this.saveAmount;
|
||||||
|
data['saveLabel'] = this.saveLabel;
|
||||||
|
if (this.upcomingCities != null) {
|
||||||
|
data['upcomingCities'] =
|
||||||
|
this.upcomingCities!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UpcomingCities {
|
||||||
|
int? id;
|
||||||
|
String? cityName;
|
||||||
|
String? imgPathName;
|
||||||
|
|
||||||
|
UpcomingCities({this.id, this.cityName, this.imgPathName});
|
||||||
|
|
||||||
|
UpcomingCities.fromJson(Map<String, dynamic> json) {
|
||||||
|
id = json['id'];
|
||||||
|
cityName = json['cityName'];
|
||||||
|
imgPathName = json['imgPathName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['id'] = this.id;
|
||||||
|
data['cityName'] = this.cityName;
|
||||||
|
data['imgPathName'] = this.imgPathName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,15 +1,17 @@
|
|||||||
import 'package:citycards_customer/home/widgets/e_sim_offer_section.dart';
|
import 'package:citycards_customer/home/widgets/e_sim_offer_section.dart';
|
||||||
import 'package:citycards_customer/home/widgets/hotel_offers_section.dart';
|
import 'package:citycards_customer/home/widgets/hotel_offers_section.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
|
|
||||||
|
import '../../common_bloc/bottom_navigation_bloc.dart';
|
||||||
import '../../common_packages/app_bar.dart';
|
import '../../common_packages/app_bar.dart';
|
||||||
import '../../core/route_constants.dart';
|
import '../../core/route_constants.dart';
|
||||||
import '../widgets/attractions_list.dart';
|
import '../widgets/attractions_list.dart';
|
||||||
import '../widgets/get_your_pass_card.dart';
|
import '../widgets/get_your_pass_card.dart';
|
||||||
import '../widgets/gradient_container_bg.dart';
|
import '../widgets/gradient_container_bg.dart';
|
||||||
import '../widgets/journey_cards_listview.dart';
|
import '../widgets/itineary_animation.dart';
|
||||||
import '../widgets/pass_card_list.dart';
|
import '../widgets/pass_card_list.dart';
|
||||||
|
|
||||||
class RegisteredUserHomePage extends StatefulWidget {
|
class RegisteredUserHomePage extends StatefulWidget {
|
||||||
@@ -21,11 +23,6 @@ class RegisteredUserHomePage extends StatefulWidget {
|
|||||||
|
|
||||||
class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
||||||
final List<Map<String, String>> attractions = [
|
final List<Map<String, String>> attractions = [
|
||||||
{
|
|
||||||
'title': 'Long-Tail Boat Charter',
|
|
||||||
'subtitle': 'Lorem ipsum dolor sit amet...',
|
|
||||||
'image': 'assets/images/clock.png',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
'title': 'Koh Rong Samloemr',
|
'title': 'Koh Rong Samloemr',
|
||||||
'subtitle': 'Lorem ipsum dolor sit amet...',
|
'subtitle': 'Lorem ipsum dolor sit amet...',
|
||||||
@@ -41,6 +38,11 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
'subtitle': 'Lorem ipsum dolor sit amet...',
|
'subtitle': 'Lorem ipsum dolor sit amet...',
|
||||||
'image': 'assets/images/koh_rong.png',
|
'image': 'assets/images/koh_rong.png',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'title': 'Long-Tail Boat Charter',
|
||||||
|
'subtitle': 'Lorem ipsum dolor sit amet...',
|
||||||
|
'image': 'assets/images/clock.png',
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -51,7 +53,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
"assets/images/chicago.png",
|
"assets/images/chicago.png",
|
||||||
height: 300,
|
height: 300.h,
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
),
|
),
|
||||||
@@ -69,7 +71,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
isProfilePage: false,
|
isProfilePage: false,
|
||||||
showDivider: false,
|
showDivider: false,
|
||||||
),
|
),
|
||||||
SizedBox(height: 70.h),
|
SizedBox(height: 60.h),
|
||||||
Text(
|
Text(
|
||||||
"Melbourne",
|
"Melbourne",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@@ -78,7 +80,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
fontSize: 44,
|
fontSize: 44,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 4),
|
SizedBox(height: 4.h),
|
||||||
Text(
|
Text(
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
||||||
"Cras posuere, nisl id dictum consequat, elit enim tincidunt magna...",
|
"Cras posuere, nisl id dictum consequat, elit enim tincidunt magna...",
|
||||||
@@ -88,7 +90,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
SizedBox(height: 12.h),
|
||||||
|
|
||||||
// Category tags
|
// Category tags
|
||||||
Wrap(
|
Wrap(
|
||||||
@@ -101,7 +103,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
const SizedBox(height: 40),
|
SizedBox(height: 60.h),
|
||||||
|
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
@@ -152,9 +154,53 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
InwardCurvedContainer(
|
InwardCurvedContainer(
|
||||||
child: Stack(children: [DreamJourneySection()]),
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
SizedBox(height: 40.h),
|
||||||
|
const ItineraryVideo(),
|
||||||
|
SizedBox(height: 20.h),
|
||||||
|
|
||||||
|
// 🔘 Button section
|
||||||
|
Container(
|
||||||
|
margin: const EdgeInsets.symmetric(horizontal: 16),
|
||||||
|
child: SizedBox(
|
||||||
|
width: 200,
|
||||||
|
child: ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
context.read<NavigationBloc>().add(NavigationTabChanged(1));
|
||||||
|
// Navigator.of(
|
||||||
|
// context,
|
||||||
|
// ).pushNamed(RouteConstants.buyPass);
|
||||||
|
},
|
||||||
|
style: ElevatedButton.styleFrom(
|
||||||
|
backgroundColor: const Color(0xffF95F62),
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 14),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(30),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Create my iternary",
|
||||||
|
style: GoogleFonts.poppins(
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
fontSize: 14.sp,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(width: 4),
|
||||||
|
Icon(Icons.arrow_forward, color: Colors.white),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 10),
|
|
||||||
ESimOfferSection(),
|
ESimOfferSection(),
|
||||||
HotelOffersSection(),
|
HotelOffersSection(),
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
@@ -167,7 +213,9 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
children: [
|
children: [
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.of(context).pushNamed(RouteConstants.searchOffer);
|
Navigator.of(
|
||||||
|
context,
|
||||||
|
).pushNamed(RouteConstants.searchOffer);
|
||||||
},
|
},
|
||||||
child: _buildFeatureCard(
|
child: _buildFeatureCard(
|
||||||
image: "assets/images/claim_offers_bg.jpg",
|
image: "assets/images/claim_offers_bg.jpg",
|
||||||
@@ -199,7 +247,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
return Container(
|
return Container(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
|
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Color(0xffF95F62),
|
color: Color(0xffFFFFFF).withOpacity(0.29),
|
||||||
borderRadius: BorderRadius.circular(20),
|
borderRadius: BorderRadius.circular(20),
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
|
import '../../core/route_constants.dart';
|
||||||
|
|
||||||
class AttractionsListView extends StatefulWidget {
|
class AttractionsListView extends StatefulWidget {
|
||||||
final List<Map<String, String>> attractions;
|
final List<Map<String, String>> attractions;
|
||||||
@@ -38,69 +39,74 @@ class _AttractionsListViewState extends State<AttractionsListView> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Column(
|
return InkWell(
|
||||||
children: [
|
onTap: (){
|
||||||
SizedBox(
|
Navigator.of(context).pushNamed(RouteConstants.attractionDetails);
|
||||||
height: 240,
|
},
|
||||||
child: ListView.builder(
|
child: Column(
|
||||||
controller: _scrollController,
|
children: [
|
||||||
scrollDirection: Axis.horizontal,
|
SizedBox(
|
||||||
padding: const EdgeInsets.only(left: 16),
|
height: 240,
|
||||||
itemCount: widget.attractions.length,
|
child: ListView.builder(
|
||||||
itemBuilder: (context, index) {
|
controller: _scrollController,
|
||||||
final item = widget.attractions[index];
|
scrollDirection: Axis.horizontal,
|
||||||
return Container(
|
padding: const EdgeInsets.only(right: 16),
|
||||||
alignment: Alignment.center,
|
itemCount: widget.attractions.length,
|
||||||
margin: const EdgeInsets.only(right: 16),
|
itemBuilder: (context, index) {
|
||||||
padding: const EdgeInsets.all(4),
|
final item = widget.attractions[index];
|
||||||
decoration: BoxDecoration(
|
return Container(
|
||||||
border: Border.all(
|
alignment: Alignment.center,
|
||||||
color: const Color(0xFFF95F62).withOpacity(0.24),
|
margin: const EdgeInsets.only(right: 16),
|
||||||
),
|
padding: const EdgeInsets.all(4),
|
||||||
borderRadius: BorderRadius.circular(16),
|
|
||||||
),
|
|
||||||
child: Container(
|
|
||||||
height: 232,
|
|
||||||
width: 161,
|
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(
|
||||||
|
color: const Color(0xFFF95F62).withOpacity(0.24),
|
||||||
|
),
|
||||||
borderRadius: BorderRadius.circular(16),
|
borderRadius: BorderRadius.circular(16),
|
||||||
image: DecorationImage(
|
),
|
||||||
image: AssetImage(item['image']!),
|
child: Container(
|
||||||
fit: BoxFit.cover,
|
height: 232,
|
||||||
|
width: 161,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(16),
|
||||||
|
image: DecorationImage(
|
||||||
|
image: AssetImage(item['image']!),
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
alignment: Alignment.bottomLeft,
|
||||||
|
padding: const EdgeInsets.all(12),
|
||||||
|
child: Text(
|
||||||
|
item['title']!,
|
||||||
|
style: GoogleFonts.poppins(
|
||||||
|
color: Colors.white,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontSize: 14,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
alignment: Alignment.bottomLeft,
|
);
|
||||||
padding: const EdgeInsets.all(12),
|
},
|
||||||
child: Text(
|
),
|
||||||
item['title']!,
|
|
||||||
style: GoogleFonts.poppins(
|
|
||||||
color: Colors.white,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
fontSize: 14,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
),
|
const SizedBox(height: 20),
|
||||||
const SizedBox(height: 20),
|
Align(
|
||||||
Align(
|
alignment: Alignment.center,
|
||||||
alignment: Alignment.center,
|
child: SizedBox(
|
||||||
child: SizedBox(
|
width: 200,
|
||||||
width: 200,
|
child: ClipRRect(
|
||||||
child: ClipRRect(
|
borderRadius: BorderRadius.circular(10),
|
||||||
borderRadius: BorderRadius.circular(10),
|
child: LinearProgressIndicator(
|
||||||
child: LinearProgressIndicator(
|
value: _scrollProgress,
|
||||||
value: _scrollProgress,
|
minHeight: 6,
|
||||||
minHeight: 6,
|
backgroundColor: const Color(0xffFEE7E7),
|
||||||
backgroundColor: const Color(0xffFEE7E7),
|
color: const Color(0xffF95F62),
|
||||||
color: const Color(0xffF95F62),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class ESimOfferSection extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
|
||||||
padding: const EdgeInsets.all(10),
|
padding: const EdgeInsets.all(10),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(20),
|
borderRadius: BorderRadius.circular(20),
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
|
|
||||||
import '../../core/route_constants.dart';
|
import '../../core/route_constants.dart';
|
||||||
@@ -10,15 +11,14 @@ class GetYourPassCard extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
margin: const EdgeInsets.symmetric(horizontal: 14, vertical: 0),
|
margin: EdgeInsets.symmetric(horizontal: 14.w, vertical: 0),
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20),
|
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: const Color(0xFFFFF1F1),
|
color: const Color(0xFFFFF1F1),
|
||||||
borderRadius: BorderRadius.circular(40),
|
borderRadius: BorderRadius.circular(40.r),
|
||||||
border: Border.all(color: Color(0xffFDCDCE))
|
border: Border.all(color: const Color(0xffFDCDCE))
|
||||||
),
|
),
|
||||||
child: Column(
|
child: Column(
|
||||||
|
|
||||||
children: [
|
children: [
|
||||||
// ===== Left Section =====
|
// ===== Left Section =====
|
||||||
Row(
|
Row(
|
||||||
@@ -27,7 +27,7 @@ class GetYourPassCard extends StatelessWidget {
|
|||||||
Text(
|
Text(
|
||||||
"Get your Pass",
|
"Get your Pass",
|
||||||
style: GoogleFonts.poppins(
|
style: GoogleFonts.poppins(
|
||||||
fontSize: 18,
|
fontSize: 18.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
),
|
),
|
||||||
@@ -37,37 +37,38 @@ class GetYourPassCard extends StatelessWidget {
|
|||||||
Navigator.of(context).pushNamed(RouteConstants.buyPass);
|
Navigator.of(context).pushNamed(RouteConstants.buyPass);
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: const EdgeInsets.all(8),
|
padding: EdgeInsets.all(8.r),
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
color: Color(0xffF95F62),
|
color: Color(0xffF95F62),
|
||||||
shape: BoxShape.circle,
|
shape: BoxShape.circle,
|
||||||
),
|
),
|
||||||
child: const Icon(
|
child: Icon(
|
||||||
Icons.arrow_forward,
|
Icons.arrow_forward,
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
size: 18,
|
size: 18.sp,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
const SizedBox(
|
SizedBox(height: 7.h),
|
||||||
height: 7,
|
|
||||||
),
|
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
AttractionsAvatarStack(imagePath: 'assets/images/get_your_pass_bg.jpg',),
|
AttractionsAvatarStack(
|
||||||
const SizedBox(width: 8),
|
imagePath: 'assets/images/get_your_pass_bg.jpg',
|
||||||
|
),
|
||||||
|
SizedBox(width: 8.w),
|
||||||
Text(
|
Text(
|
||||||
"Attractions",
|
"Attractions",
|
||||||
style: GoogleFonts.poppins(
|
style: GoogleFonts.poppins(
|
||||||
fontSize: 13,
|
fontSize: 13.sp,
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
fontWeight: FontWeight.w400
|
fontWeight: FontWeight.w400
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -78,7 +79,7 @@ class GetYourPassCard extends StatelessWidget {
|
|||||||
Text(
|
Text(
|
||||||
"From",
|
"From",
|
||||||
style: GoogleFonts.poppins(
|
style: GoogleFonts.poppins(
|
||||||
fontSize: 12,
|
fontSize: 12.sp,
|
||||||
color: Colors.black87,
|
color: Colors.black87,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -88,7 +89,7 @@ class GetYourPassCard extends StatelessWidget {
|
|||||||
TextSpan(
|
TextSpan(
|
||||||
text: "\$20",
|
text: "\$20",
|
||||||
style: GoogleFonts.poppins(
|
style: GoogleFonts.poppins(
|
||||||
fontSize: 14,
|
fontSize: 14.sp,
|
||||||
fontWeight: FontWeight.w700,
|
fontWeight: FontWeight.w700,
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
),
|
),
|
||||||
@@ -96,7 +97,7 @@ class GetYourPassCard extends StatelessWidget {
|
|||||||
TextSpan(
|
TextSpan(
|
||||||
text: " /Adult",
|
text: " /Adult",
|
||||||
style: GoogleFonts.poppins(
|
style: GoogleFonts.poppins(
|
||||||
fontSize: 13,
|
fontSize: 13.sp,
|
||||||
color: Colors.black87,
|
color: Colors.black87,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -116,10 +117,10 @@ class GetYourPassCard extends StatelessWidget {
|
|||||||
class AttractionsAvatarStack extends StatelessWidget {
|
class AttractionsAvatarStack extends StatelessWidget {
|
||||||
const AttractionsAvatarStack({
|
const AttractionsAvatarStack({
|
||||||
super.key,
|
super.key,
|
||||||
required this.imagePath, // from your assets/figma
|
required this.imagePath,
|
||||||
this.size = 35, // circle diameter
|
this.size = 35,
|
||||||
this.count = 4, // total circles including the last “16+”
|
this.count = 4,
|
||||||
this.overlap = 8, // how much they overlap
|
this.overlap = 8,
|
||||||
this.moreText = '16+',
|
this.moreText = '16+',
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -131,10 +132,13 @@ class AttractionsAvatarStack extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final step = size - overlap; // horizontal step between circles
|
final responsiveSize = size.r;
|
||||||
|
final responsiveOverlap = overlap.r;
|
||||||
|
final step = responsiveSize - responsiveOverlap;
|
||||||
|
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
width: size + (count - 1) * step,
|
width: responsiveSize + (count - 1) * step,
|
||||||
height: size,
|
height: responsiveSize,
|
||||||
child: Stack(
|
child: Stack(
|
||||||
clipBehavior: Clip.none,
|
clipBehavior: Clip.none,
|
||||||
children: List.generate(count, (i) {
|
children: List.generate(count, (i) {
|
||||||
@@ -144,7 +148,7 @@ class AttractionsAvatarStack extends StatelessWidget {
|
|||||||
return Positioned(
|
return Positioned(
|
||||||
left: left,
|
left: left,
|
||||||
child: _AvatarCircle(
|
child: _AvatarCircle(
|
||||||
size: size,
|
size: responsiveSize,
|
||||||
imagePath: imagePath,
|
imagePath: imagePath,
|
||||||
showOverlayText: isLast,
|
showOverlayText: isLast,
|
||||||
overlayText: moreText,
|
overlayText: moreText,
|
||||||
@@ -174,10 +178,10 @@ class _AvatarCircle extends StatelessWidget {
|
|||||||
return Container(
|
return Container(
|
||||||
width: size,
|
width: size,
|
||||||
height: size,
|
height: size,
|
||||||
padding: const EdgeInsets.all(1.5), // white ring thickness
|
padding: EdgeInsets.all(1.5.r),
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
shape: BoxShape.circle,
|
shape: BoxShape.circle,
|
||||||
color: Colors.white, // ring color
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
child: ClipOval(
|
child: ClipOval(
|
||||||
child: Stack(
|
child: Stack(
|
||||||
@@ -190,9 +194,9 @@ class _AvatarCircle extends StatelessWidget {
|
|||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: Text(
|
child: Text(
|
||||||
overlayText,
|
overlayText,
|
||||||
style: const TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 11,
|
fontSize: 11.sp,
|
||||||
fontWeight: FontWeight.w700,
|
fontWeight: FontWeight.w700,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -203,4 +207,3 @@ class _AvatarCircle extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
class InwardCurvedContainer extends StatelessWidget {
|
class InwardCurvedContainer extends StatelessWidget {
|
||||||
final Widget child;
|
final Widget child;
|
||||||
@@ -10,14 +11,14 @@ class InwardCurvedContainer extends StatelessWidget {
|
|||||||
clipper: InwardAndBottomConvexClipper(),
|
clipper: InwardAndBottomConvexClipper(),
|
||||||
child: Container(
|
child: Container(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
height: 700,
|
height: 450.h,
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
gradient: LinearGradient(
|
gradient: LinearGradient(
|
||||||
begin: Alignment.topLeft,
|
begin: Alignment.topLeft,
|
||||||
end: Alignment.bottomRight,
|
end: Alignment.bottomRight,
|
||||||
colors: [
|
colors: [
|
||||||
Color(0xFFFFF5F5),
|
Color(0xFFFFF5F5),
|
||||||
Color(0xFFFDCDCE),
|
Color(0xFFFEF5F8),
|
||||||
Color(0xFFFFF5F5),
|
Color(0xFFFFF5F5),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
44
lib/home/widgets/itineary_animation.dart
Normal file
44
lib/home/widgets/itineary_animation.dart
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:video_player/video_player.dart';
|
||||||
|
|
||||||
|
class ItineraryVideo extends StatefulWidget {
|
||||||
|
const ItineraryVideo({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<ItineraryVideo> createState() => _ItineraryVideoState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ItineraryVideoState extends State<ItineraryVideo> {
|
||||||
|
late VideoPlayerController _controller;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_controller = VideoPlayerController.asset(
|
||||||
|
'assets/gif/itinenary_animation_for_citycards.mp4',
|
||||||
|
)
|
||||||
|
..initialize().then((_) {
|
||||||
|
_controller.setLooping(true);
|
||||||
|
_controller.play();
|
||||||
|
setState(() {});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_controller.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Center(
|
||||||
|
child: _controller.value.isInitialized
|
||||||
|
? AspectRatio(
|
||||||
|
aspectRatio: _controller.value.aspectRatio,
|
||||||
|
child: VideoPlayer(_controller),
|
||||||
|
)
|
||||||
|
: const CircularProgressIndicator(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
|
|
||||||
|
import '../../common_packages/common_app_texts.dart';
|
||||||
import '../../core/route_constants.dart';
|
import '../../core/route_constants.dart';
|
||||||
|
|
||||||
class ChooseYourPassSection extends StatefulWidget {
|
class ChooseYourPassSection extends StatefulWidget {
|
||||||
@@ -20,7 +21,7 @@ class _ChooseYourPassSectionState extends State<ChooseYourPassSection> {
|
|||||||
|
|
||||||
final List<Map<String, dynamic>> passes = [
|
final List<Map<String, dynamic>> passes = [
|
||||||
{
|
{
|
||||||
"title": "Chicago-\nFLEXI CARD",
|
"title": "Chicago-\n${CommonAppText.selectiveCard} CARD",
|
||||||
"price": "\$50",
|
"price": "\$50",
|
||||||
"color": const Color(0xffF95FAF),
|
"color": const Color(0xffF95FAF),
|
||||||
"bgColor": const Color(0xFFFDE7F1),
|
"bgColor": const Color(0xFFFDE7F1),
|
||||||
|
|||||||
@@ -19,156 +19,158 @@ class IntroScreensView extends StatelessWidget {
|
|||||||
return BlocProvider(
|
return BlocProvider(
|
||||||
create: (_) => IntroScreensCubit(),
|
create: (_) => IntroScreensCubit(),
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
body: BlocBuilder<IntroScreensCubit, IntroScreensState>(
|
body: SafeArea(
|
||||||
builder: (context, state) {
|
child: BlocBuilder<IntroScreensCubit, IntroScreensState>(
|
||||||
return Stack(
|
builder: (context, state) {
|
||||||
children: [
|
return Stack(
|
||||||
// Background PageView
|
children: [
|
||||||
PageView.builder(
|
// Background PageView
|
||||||
controller: _pageController,
|
PageView.builder(
|
||||||
itemCount: pages.length,
|
controller: _pageController,
|
||||||
onPageChanged: (index) =>
|
itemCount: pages.length,
|
||||||
context.read<IntroScreensCubit>().updatePage(index),
|
onPageChanged: (index) =>
|
||||||
itemBuilder: (context, index) {
|
context.read<IntroScreensCubit>().updatePage(index),
|
||||||
final page = pages[index];
|
itemBuilder: (context, index) {
|
||||||
return Stack(
|
final page = pages[index];
|
||||||
fit: StackFit.expand,
|
return Stack(
|
||||||
children: [
|
fit: StackFit.expand,
|
||||||
Image.asset(page.image, fit: BoxFit.cover),
|
children: [
|
||||||
Container(
|
Image.asset(page.image, fit: BoxFit.cover),
|
||||||
decoration: BoxDecoration(
|
Container(
|
||||||
gradient: LinearGradient(
|
decoration: BoxDecoration(
|
||||||
begin: Alignment.topCenter,
|
gradient: LinearGradient(
|
||||||
end: Alignment.bottomCenter,
|
begin: Alignment.topCenter,
|
||||||
colors: [Color(0xFF00000000), Color(0xFF000000)],
|
end: Alignment.bottomCenter,
|
||||||
|
colors: [Color(0xFF00000000), Color(0xFF000000)],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
);
|
||||||
);
|
},
|
||||||
},
|
),
|
||||||
),
|
|
||||||
|
|
||||||
// Skip Button (Only first 2 pages)
|
// Skip Button (Only first 2 pages)
|
||||||
if (state.currentPage < pages.length - 1)
|
if (state.currentPage < pages.length - 1)
|
||||||
Positioned(
|
Positioned(
|
||||||
top: 50,
|
top: 50,
|
||||||
right: 20,
|
right: 20,
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: (){
|
onTap: (){
|
||||||
Navigator.pushReplacementNamed(context,RouteConstants.home);
|
Navigator.pushReplacementNamed(context,RouteConstants.home);
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 48.h,
|
height: 48.h,
|
||||||
width: 92.w,
|
width: 92.w,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(16.r),
|
borderRadius: BorderRadius.circular(16.r),
|
||||||
border: Border.all(color: Colors.white),
|
border: Border.all(color: Colors.white),
|
||||||
),
|
),
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
'Skip',
|
'Skip',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 16.sp,
|
fontSize: 16.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
|
|
||||||
// Bottom Content
|
// Bottom Content
|
||||||
Align(
|
Align(
|
||||||
alignment: Alignment.bottomCenter,
|
alignment: Alignment.bottomCenter,
|
||||||
child: GlassMorphismContainer(
|
child: GlassMorphismContainer(
|
||||||
blurIntensity: 0.5,
|
blurIntensity: 0.5,
|
||||||
padding: EdgeInsets.symmetric(
|
padding: EdgeInsets.symmetric(
|
||||||
horizontal: 24.w,
|
horizontal: 24.w,
|
||||||
vertical: 17.h,
|
vertical: 17.h,
|
||||||
),
|
),
|
||||||
margin: const EdgeInsets.all(20),
|
margin: const EdgeInsets.all(20),
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
pages[state.currentPage].title,
|
pages[state.currentPage].title,
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.white,
|
|
||||||
fontSize: 24.sp,
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
),
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
SizedBox(height: 8.h),
|
|
||||||
Text(
|
|
||||||
pages[state.currentPage].description,
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.white,
|
|
||||||
fontSize: 14.sp,
|
|
||||||
),
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
SizedBox(height: 24.h),
|
|
||||||
|
|
||||||
// Dots Indicator
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: List.generate(
|
|
||||||
pages.length,
|
|
||||||
(index) => Container(
|
|
||||||
margin: const EdgeInsets.symmetric(
|
|
||||||
horizontal: 4.0,
|
|
||||||
),
|
|
||||||
width: 36.w,
|
|
||||||
height: 12.h,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: state.currentPage == index
|
|
||||||
? Color(0xFFF95F62)
|
|
||||||
: Color(0xFFF95F62).withOpacity(0.42),
|
|
||||||
borderRadius: BorderRadius.circular(12),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 24.h),
|
|
||||||
ElevatedButton(
|
|
||||||
style: ElevatedButton.styleFrom(
|
|
||||||
backgroundColor: Color(0xFFF95F62),
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(16.r),
|
|
||||||
),
|
|
||||||
minimumSize: const Size(double.infinity, 52),
|
|
||||||
),
|
|
||||||
onPressed: () {
|
|
||||||
if (state.currentPage == pages.length - 1) {
|
|
||||||
Navigator.pushReplacementNamed(context, '/home');
|
|
||||||
} else {
|
|
||||||
_pageController.nextPage(
|
|
||||||
duration: const Duration(milliseconds: 400),
|
|
||||||
curve: Curves.easeInOut,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: Text(
|
|
||||||
state.currentPage == pages.length - 1
|
|
||||||
? "Let's Get Started"
|
|
||||||
: 'Continue',
|
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 20.sp,
|
fontSize: 24.sp,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
SizedBox(height: 8.h),
|
||||||
|
Text(
|
||||||
|
pages[state.currentPage].description,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontSize: 14.sp,
|
||||||
|
),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
SizedBox(height: 24.h),
|
||||||
|
|
||||||
|
// Dots Indicator
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: List.generate(
|
||||||
|
pages.length,
|
||||||
|
(index) => Container(
|
||||||
|
margin: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 4.0,
|
||||||
|
),
|
||||||
|
width: 36.w,
|
||||||
|
height: 12.h,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: state.currentPage == index
|
||||||
|
? Color(0xFFF95F62)
|
||||||
|
: Color(0xFFF95F62).withOpacity(0.42),
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
SizedBox(height: 24.h),
|
||||||
],
|
ElevatedButton(
|
||||||
|
style: ElevatedButton.styleFrom(
|
||||||
|
backgroundColor: Color(0xFFF95F62),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(16.r),
|
||||||
|
),
|
||||||
|
minimumSize: const Size(double.infinity, 52),
|
||||||
|
),
|
||||||
|
onPressed: () {
|
||||||
|
if (state.currentPage == pages.length - 1) {
|
||||||
|
Navigator.pushReplacementNamed(context, '/home');
|
||||||
|
} else {
|
||||||
|
_pageController.nextPage(
|
||||||
|
duration: const Duration(milliseconds: 400),
|
||||||
|
curve: Curves.easeInOut,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
state.currentPage == pages.length - 1
|
||||||
|
? "Let's Get Started"
|
||||||
|
: 'Continue',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontSize: 20.sp,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
);
|
||||||
);
|
},
|
||||||
},
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -36,28 +36,29 @@ class _DietarySelectionViewState extends State<DietarySelectionView> {
|
|||||||
Text(
|
Text(
|
||||||
"👋 Hello! We'd love to know more about you. Do you follow any dietary preferences?",
|
"👋 Hello! We'd love to know more about you. Do you follow any dietary preferences?",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Color(0xFF101828),
|
color: const Color(0xFF101828),
|
||||||
fontSize: 24.sp,
|
fontSize: 20.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
),
|
),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
SizedBox(height: 12.h),
|
SizedBox(height: 10.h),
|
||||||
CustomText(
|
CustomText(
|
||||||
text: "Select all that apply",
|
text: "Select all that apply",
|
||||||
size: 14.sp,
|
size: 12.sp,
|
||||||
color: const Color(0xFF6A7282),
|
color: const Color(0xFF6A7282),
|
||||||
),
|
),
|
||||||
SizedBox(height: 38.h),
|
SizedBox(height: 32.h),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 350.h,
|
height: 320.h,
|
||||||
child: BlocBuilder<AddItineraryDetailBloc, ItineraryDetailState>(
|
child: BlocBuilder<AddItineraryDetailBloc, ItineraryDetailState>(
|
||||||
builder: (context, sate) {
|
builder: (context, sate) {
|
||||||
return GridView.builder(
|
return GridView.builder(
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
mainAxisSpacing: 12,
|
mainAxisSpacing: 10.h,
|
||||||
crossAxisSpacing: 16,
|
crossAxisSpacing: 14.w,
|
||||||
crossAxisCount: 2,
|
crossAxisCount: 2,
|
||||||
childAspectRatio: 1.7,
|
childAspectRatio: 1.7,
|
||||||
),
|
),
|
||||||
@@ -72,12 +73,15 @@ class _DietarySelectionViewState extends State<DietarySelectionView> {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
width: 168.w,
|
width: 150.w,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
borderRadius: BorderRadius.circular(24),
|
borderRadius: BorderRadius.circular(20.r),
|
||||||
border: isSelected
|
border: isSelected
|
||||||
? Border.all(color: Color(0xFFF95F62))
|
? Border.all(
|
||||||
|
color: const Color(0xFFF95F62),
|
||||||
|
width: 1.5.w,
|
||||||
|
)
|
||||||
: Border.all(color: Colors.transparent),
|
: Border.all(color: Colors.transparent),
|
||||||
),
|
),
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
@@ -85,11 +89,15 @@ class _DietarySelectionViewState extends State<DietarySelectionView> {
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Image.asset(item["icon"] ?? "", scale: 4),
|
Image.asset(
|
||||||
SizedBox(height: 8),
|
item["icon"] ?? "",
|
||||||
|
width: 40.w,
|
||||||
|
height: 40.h,
|
||||||
|
),
|
||||||
|
SizedBox(height: 6.h),
|
||||||
CustomText(
|
CustomText(
|
||||||
text: item["name"] ?? "",
|
text: item["name"] ?? "",
|
||||||
size: 16.sp,
|
size: 14.sp,
|
||||||
weight: FontWeight.w500,
|
weight: FontWeight.w500,
|
||||||
color: const Color(0xFF364153),
|
color: const Color(0xFF364153),
|
||||||
),
|
),
|
||||||
@@ -103,7 +111,7 @@ class _DietarySelectionViewState extends State<DietarySelectionView> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
SizedBox(height: 41.h),
|
SizedBox(height: 36.h),
|
||||||
CustomFilledButton(
|
CustomFilledButton(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
context.read<ItineraryStepNavigationBloc>().add(
|
context.read<ItineraryStepNavigationBloc>().add(
|
||||||
|
|||||||
6
lib/networkApiServices/api_urls.dart
Normal file
6
lib/networkApiServices/api_urls.dart
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
class ApiUrls {
|
||||||
|
|
||||||
|
static const baseUrl = "https://devapi.citycards.betadelivery.com";
|
||||||
|
|
||||||
|
static const cityList = "$baseUrl/mobile/city_list";
|
||||||
|
}
|
||||||
192
lib/networkApiServices/network_api_services.dart
Normal file
192
lib/networkApiServices/network_api_services.dart
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
|
class NetworkApiService {
|
||||||
|
static final NetworkApiService _instance = NetworkApiService._internal();
|
||||||
|
late Dio _dio;
|
||||||
|
|
||||||
|
factory NetworkApiService() {
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkApiService._internal() {
|
||||||
|
_dio = Dio(
|
||||||
|
BaseOptions(
|
||||||
|
connectTimeout: const Duration(seconds: 30),
|
||||||
|
receiveTimeout: const Duration(seconds: 30),
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Accept': 'application/json',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Add interceptors
|
||||||
|
_dio.interceptors.add(
|
||||||
|
InterceptorsWrapper(
|
||||||
|
onRequest: (options, handler) {
|
||||||
|
// Add token if available
|
||||||
|
// String? token = "use token here from local shared preference";
|
||||||
|
// if (token != null) {
|
||||||
|
// options.headers['Authorization'] = 'Bearer $token';
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (kDebugMode) {
|
||||||
|
print('REQUEST[${options.method}] => URL: ${options.uri}');
|
||||||
|
}
|
||||||
|
return handler.next(options);
|
||||||
|
},
|
||||||
|
onResponse: (response, handler) {
|
||||||
|
if (kDebugMode) {
|
||||||
|
print('RESPONSE[${response.statusCode}] => DATA: ${response.data}');
|
||||||
|
}
|
||||||
|
return handler.next(response);
|
||||||
|
},
|
||||||
|
onError: (error, handler) {
|
||||||
|
if (kDebugMode) {
|
||||||
|
print('ERROR[${error.response?.statusCode}] => MESSAGE: ${error.message}');
|
||||||
|
}
|
||||||
|
return handler.next(error);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Add logging interceptor in debug mode
|
||||||
|
if (kDebugMode) {
|
||||||
|
_dio.interceptors.add(LogInterceptor(
|
||||||
|
request: true,
|
||||||
|
requestHeader: true,
|
||||||
|
requestBody: true,
|
||||||
|
responseHeader: false,
|
||||||
|
responseBody: true,
|
||||||
|
error: true,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GET API Request
|
||||||
|
Future<Response> getApi({
|
||||||
|
required String url,
|
||||||
|
Map<String, dynamic>? queryParameters,
|
||||||
|
Options? options,
|
||||||
|
CancelToken? cancelToken,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final response = await _dio.get(
|
||||||
|
url,
|
||||||
|
queryParameters: queryParameters,
|
||||||
|
options: options,
|
||||||
|
cancelToken: cancelToken,
|
||||||
|
);
|
||||||
|
return response;
|
||||||
|
} on DioException catch (e) {
|
||||||
|
throw _handleError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// POST API Request
|
||||||
|
Future<Response> postApi({
|
||||||
|
required String url,
|
||||||
|
dynamic data,
|
||||||
|
Map<String, dynamic>? queryParameters,
|
||||||
|
Options? options,
|
||||||
|
CancelToken? cancelToken,
|
||||||
|
ProgressCallback? onSendProgress,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final response = await _dio.post(
|
||||||
|
url,
|
||||||
|
data: data,
|
||||||
|
queryParameters: queryParameters,
|
||||||
|
options: options,
|
||||||
|
cancelToken: cancelToken,
|
||||||
|
onSendProgress: onSendProgress,
|
||||||
|
);
|
||||||
|
return response;
|
||||||
|
} on DioException catch (e) {
|
||||||
|
throw _handleError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PUT API Request (Bonus)
|
||||||
|
Future<Response> putApi({
|
||||||
|
required String url,
|
||||||
|
dynamic data,
|
||||||
|
Map<String, dynamic>? queryParameters,
|
||||||
|
Options? options,
|
||||||
|
CancelToken? cancelToken,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final response = await _dio.put(
|
||||||
|
url,
|
||||||
|
data: data,
|
||||||
|
queryParameters: queryParameters,
|
||||||
|
options: options,
|
||||||
|
cancelToken: cancelToken,
|
||||||
|
);
|
||||||
|
return response;
|
||||||
|
} on DioException catch (e) {
|
||||||
|
throw _handleError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DELETE API Request (Bonus)
|
||||||
|
Future<Response> deleteApi({
|
||||||
|
required String url,
|
||||||
|
dynamic data,
|
||||||
|
Map<String, dynamic>? queryParameters,
|
||||||
|
Options? options,
|
||||||
|
CancelToken? cancelToken,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final response = await _dio.delete(
|
||||||
|
url,
|
||||||
|
data: data,
|
||||||
|
queryParameters: queryParameters,
|
||||||
|
options: options,
|
||||||
|
cancelToken: cancelToken,
|
||||||
|
);
|
||||||
|
return response;
|
||||||
|
} on DioException catch (e) {
|
||||||
|
throw _handleError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error Handler
|
||||||
|
String _handleError(DioException error) {
|
||||||
|
String errorDescription = "";
|
||||||
|
switch (error.type) {
|
||||||
|
case DioExceptionType.connectionTimeout:
|
||||||
|
errorDescription = "Connection timeout. Please try again.";
|
||||||
|
break;
|
||||||
|
case DioExceptionType.sendTimeout:
|
||||||
|
errorDescription = "Send timeout. Please try again.";
|
||||||
|
break;
|
||||||
|
case DioExceptionType.receiveTimeout:
|
||||||
|
errorDescription = "Receive timeout. Please try again.";
|
||||||
|
break;
|
||||||
|
case DioExceptionType.badCertificate:
|
||||||
|
errorDescription = "Bad certificate.";
|
||||||
|
break;
|
||||||
|
case DioExceptionType.badResponse:
|
||||||
|
errorDescription = error.response?.data['message'] ??
|
||||||
|
"Received invalid status code: ${error.response?.statusCode}";
|
||||||
|
break;
|
||||||
|
case DioExceptionType.cancel:
|
||||||
|
errorDescription = "Request was cancelled.";
|
||||||
|
break;
|
||||||
|
case DioExceptionType.connectionError:
|
||||||
|
errorDescription = "No internet connection.";
|
||||||
|
break;
|
||||||
|
case DioExceptionType.unknown:
|
||||||
|
errorDescription = "Something went wrong. Please try again.";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return errorDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update headers (e.g., add token)
|
||||||
|
void updateHeaders(Map<String, dynamic> headers) {
|
||||||
|
_dio.options.headers.addAll(headers);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,8 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
import '../../common_packages/common_app_texts.dart';
|
||||||
|
|
||||||
class SearchOffersWithListing extends StatelessWidget {
|
class SearchOffersWithListing extends StatelessWidget {
|
||||||
SearchOffersWithListing({super.key});
|
SearchOffersWithListing({super.key});
|
||||||
|
|
||||||
@@ -32,7 +34,7 @@ class SearchOffersWithListing extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
child: Icon(Icons.arrow_back)),
|
child: Icon(Icons.arrow_back)),
|
||||||
SizedBox(width: 8.w),
|
SizedBox(width: 8.w),
|
||||||
CustomText(text: "Offers with Flexi Card", size: 12.sp),
|
CustomText(text: "Offers with ${CommonAppText.selectiveCard} Card", size: 12.sp),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
@@ -142,6 +144,8 @@ class SearchOffersWithListing extends StatelessWidget {
|
|||||||
text: offer["description"] ?? "",
|
text: offer["description"] ?? "",
|
||||||
color: Colors.black.withOpacity(.6),
|
color: Colors.black.withOpacity(.6),
|
||||||
size: 12.sp,
|
size: 12.sp,
|
||||||
|
maxLines: 3,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class YourItineraryView extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
"assets/images/trump_house.png",
|
"assets/images/trump_house.png",
|
||||||
height: 155.h,
|
height: 165.h,
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
alignment: Alignment.topCenter,
|
alignment: Alignment.topCenter,
|
||||||
@@ -45,12 +45,7 @@ class YourItineraryView extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
CommonAppBar(isWhiteLogo: true, isProfilePage: false, showDivider: true,),
|
CommonAppBar(isWhiteLogo: true, isProfilePage: false, showDivider: true,),
|
||||||
SizedBox(height: 5.h),
|
SizedBox(height: 10.h),
|
||||||
Divider(
|
|
||||||
height: 0.4.h,
|
|
||||||
color: Colors.white.withOpacity(.3),
|
|
||||||
),
|
|
||||||
SizedBox(height: 26.h),
|
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
@@ -68,7 +63,7 @@ class YourItineraryView extends StatelessWidget {
|
|||||||
"Melbourne Itinerary",
|
"Melbourne Itinerary",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16.sp,
|
fontSize: 16.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w700,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
192
pubspec.lock
192
pubspec.lock
@@ -129,6 +129,30 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.11"
|
version: "0.7.11"
|
||||||
|
dio:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: dio
|
||||||
|
sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "5.9.0"
|
||||||
|
dio_web_adapter:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: dio_web_adapter
|
||||||
|
sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.1"
|
||||||
|
dylib:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: dylib
|
||||||
|
sha256: bf609b3eb6492a3309b3d1dbe8f83a4031de5535dd7686be33487051cc760bb0
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.3"
|
||||||
equatable:
|
equatable:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -206,6 +230,14 @@ packages:
|
|||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_angle:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_angle
|
||||||
|
sha256: "344a6b5ba7fa4893799ba8a98ed1b164e0b92ce77cf98b6c0f276efe1032249e"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.3.8"
|
||||||
flutter_bloc:
|
flutter_bloc:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -557,6 +589,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.1.1"
|
version: "5.1.1"
|
||||||
|
logger:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: logger
|
||||||
|
sha256: a7967e31b703831a893bbc3c3dd11db08126fe5f369b5c648a36f821979f5be3
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.6.2"
|
||||||
lottie:
|
lottie:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -585,10 +625,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.16.0"
|
version: "1.17.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -605,6 +645,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.0"
|
||||||
|
opentype_dart:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: opentype_dart
|
||||||
|
sha256: "4bd96aeed494289a87e92bde20afe60f59648dcef253c0a7159b65ffa23899dc"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.1"
|
||||||
package_info_plus:
|
package_info_plus:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -878,10 +926,106 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
|
sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.6"
|
version: "0.7.7"
|
||||||
|
three_js:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: three_js
|
||||||
|
sha256: "76554d705ee0f7101d969773bc92fbd18d2e0f28ee87a9e41f7c0a86bd76f480"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.6"
|
||||||
|
three_js_advanced_loaders:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_advanced_loaders
|
||||||
|
sha256: "901ee356fba0ffe57547e448ee73aaa351b68a46608cf8f13c798b28980fbd38"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.4"
|
||||||
|
three_js_animations:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_animations
|
||||||
|
sha256: "7f7d708e96301e0fef1ab71ebaef280d5885c081f184e49c6956a22bd51ee444"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.1"
|
||||||
|
three_js_controls:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_controls
|
||||||
|
sha256: "4cc52d53e3bf1cca0d469c5f200b10c5c96954663d551bdb6b0b4278a0dca148"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.2"
|
||||||
|
three_js_core:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_core
|
||||||
|
sha256: "4aa78017f1562cd2c67b3146587eb8c6b75870ca030b0a5263d532d6660c31dd"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.6"
|
||||||
|
three_js_core_loaders:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_core_loaders
|
||||||
|
sha256: "85ca58d66b57b94acb5b4598e97ebd54a1679025f4eaf8cfa2dade4b561b2189"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.1"
|
||||||
|
three_js_curves:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_curves
|
||||||
|
sha256: "9f11f2fa869dc6b1aa01219bd0587b768cc0dcbf0bde5bbb576c5fabcbb3b3c7"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.1"
|
||||||
|
three_js_geometry:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_geometry
|
||||||
|
sha256: "11cbf2661b32fe90d7150c2dddd2846866de6500589e13eb9d682b017c19420a"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.1"
|
||||||
|
three_js_math:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_math
|
||||||
|
sha256: "8687016308b8d6d027a8fb3982eedb7514bbc4cf21145da0116dbd801254aa50"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.5"
|
||||||
|
three_js_sensors:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_sensors
|
||||||
|
sha256: "40874a52c6e617762d324e8149356ccacf90aa65a8904f6e3520e4aba1bff447"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.2"
|
||||||
|
three_js_simple_loaders:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_simple_loaders
|
||||||
|
sha256: "3728e84dd74cf68fbf7b6260d5eda47afbcddc48dd7b127a56fef85d92b87c78"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.2"
|
||||||
|
three_js_text:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: three_js_text
|
||||||
|
sha256: ba5f44e5da00b5f510a24308644da72c5d3b039542da3d1c13b08f7e28066d29
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.0"
|
||||||
timezone:
|
timezone:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -922,6 +1066,46 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.0"
|
version: "2.2.0"
|
||||||
|
video_player:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: video_player
|
||||||
|
sha256: "096bc28ce10d131be80dfb00c223024eb0fba301315a406728ab43dd99c45bdf"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.10.1"
|
||||||
|
video_player_android:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: video_player_android
|
||||||
|
sha256: cf768d02924b91e333e2bc1ff928528f57d686445874f383bafab12d0bdfc340
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.8.17"
|
||||||
|
video_player_avfoundation:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: video_player_avfoundation
|
||||||
|
sha256: "03fc6d07dba2499588d30887329b399c1fe2d68ce4b7fcff0db79f44a2603f69"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.8.6"
|
||||||
|
video_player_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: video_player_platform_interface
|
||||||
|
sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.6.0"
|
||||||
|
video_player_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: video_player_web
|
||||||
|
sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.4.0"
|
||||||
vm_service:
|
vm_service:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ dependencies:
|
|||||||
|
|
||||||
# The following adds the Cupertino Icons font to your application.
|
# The following adds the Cupertino Icons font to your application.
|
||||||
# Use with the CupertinoIcons class for iOS style icons.
|
# Use with the CupertinoIcons class for iOS style icons.
|
||||||
|
three_js: ^0.2.6
|
||||||
google_fonts: ^6.3.2
|
google_fonts: ^6.3.2
|
||||||
flutter_bloc: ^9.1.1
|
flutter_bloc: ^9.1.1
|
||||||
cupertino_icons: ^1.0.8
|
cupertino_icons: ^1.0.8
|
||||||
@@ -50,6 +51,8 @@ dependencies:
|
|||||||
flutter_glass_morphism: ^1.0.2
|
flutter_glass_morphism: ^1.0.2
|
||||||
lottie: ^3.3.2
|
lottie: ^3.3.2
|
||||||
flutter_native_splash: ^2.4.7
|
flutter_native_splash: ^2.4.7
|
||||||
|
video_player: ^2.10.1
|
||||||
|
dio: ^5.9.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|||||||
Reference in New Issue
Block a user