added planner page

This commit is contained in:
mohamadmahdi jebeli 2025-08-19 16:17:23 +03:30
parent 2bedc637f3
commit df2b51aee9
30 changed files with 1866 additions and 290 deletions

View File

@ -24,7 +24,7 @@ android {
applicationId = "com.example.lba" applicationId = "com.example.lba"
// 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 = 24
targetSdk = flutter.targetSdkVersion targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode versionCode = flutter.versionCode
versionName = flutter.versionName versionName = flutter.versionName

View File

@ -8,6 +8,8 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<application <application
android:label="lba" android:label="lba"
android:name="${applicationName}" android:name="${applicationName}"

View File

@ -0,0 +1,8 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26 11.4299V17.4299C26 18.9299 25.5 20.1799 24.62 21.0599C23.75 21.9299 22.5 22.4299 21 22.4299V24.5599C21 25.3599 20.11 25.84 19.45 25.4L15 22.4299H12.88C12.96 22.1299 13 21.8199 13 21.4999C13 20.4799 12.61 19.54 11.97 18.83C11.25 18.01 10.18 17.4999 9 17.4999C7.88 17.4999 6.86 17.96 6.13 18.71C6.04 18.31 6 17.8799 6 17.4299V11.4299C6 8.42993 8 6.42993 11 6.42993H21C24 6.42993 26 8.42993 26 11.4299Z" stroke="#2A2926" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 21.5C13 22.7 12.47 23.77 11.64 24.5C10.93 25.12 10.01 25.5 9 25.5C6.79 25.5 5 23.71 5 21.5C5 20.24 5.58 19.11 6.5 18.38C7.19 17.83 8.06 17.5 9 17.5C11.21 17.5 13 19.29 13 21.5Z" stroke="#2A2926" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.25 20.25V21.75L8 22.5" stroke="#2A2926" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M19.4956 14.5H19.5046" stroke="#2A2926" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15.9955 14.5H16.0045" stroke="#2A2926" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.4955 14.5H12.5045" stroke="#2A2926" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,3 @@
<svg width="41" height="40" viewBox="0 0 41 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.5 3.33337C11.3 3.33337 3.83334 10.8 3.83334 20C3.83334 29.2 11.3 36.6667 20.5 36.6667C29.7 36.6667 37.1667 29.2 37.1667 20C37.1667 10.8 29.7 3.33337 20.5 3.33337ZM26.3833 20.05C26.1333 20.3 25.8167 20.4167 25.5 20.4167C25.1833 20.4167 24.8667 20.3 24.6167 20.05L21.75 17.1834V25.8334C21.75 26.5167 21.1833 27.0834 20.5 27.0834C19.8167 27.0834 19.25 26.5167 19.25 25.8334V17.1834L16.3833 20.05C15.9 20.5334 15.1 20.5334 14.6167 20.05C14.1333 19.5667 14.1333 18.7667 14.6167 18.2834L19.6167 13.2834C20.1 12.8 20.9 12.8 21.3833 13.2834L26.3833 18.2834C26.8667 18.7667 26.8667 19.5667 26.3833 20.05Z" fill="#0E3F66"/>
</svg>

After

Width:  |  Height:  |  Size: 730 B

5
assets/icons/camera2.svg Normal file
View File

@ -0,0 +1,5 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.07 16.5H12.93C15 16.5 15.825 15.2325 15.9225 13.6875L16.3125 7.4925C16.4175 5.8725 15.1275 4.5 13.5 4.5C13.0425 4.5 12.6225 4.2375 12.4125 3.8325L11.8725 2.745C11.5275 2.0625 10.6275 1.5 9.8625 1.5H8.145C7.3725 1.5 6.4725 2.0625 6.1275 2.745L5.5875 3.8325C5.3775 4.2375 4.9575 4.5 4.5 4.5C2.8725 4.5 1.5825 5.8725 1.6875 7.4925L2.0775 13.6875C2.1675 15.2325 3 16.5 5.07 16.5Z" stroke="#2196F3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.875 6H10.125" stroke="#2196F3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9 13.5C10.3425 13.5 11.4375 12.405 11.4375 11.0625C11.4375 9.72 10.3425 8.625 9 8.625C7.6575 8.625 6.5625 9.72 6.5625 11.0625C6.5625 12.405 7.6575 13.5 9 13.5Z" stroke="#2196F3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 887 B

View File

@ -0,0 +1,8 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 21C17.5228 21 22 16.5228 22 11C22 5.47715 17.5228 1 12 1C6.47715 1 2 5.47715 2 11C2 16.5228 6.47715 21 12 21Z" fill="#FFF59D"/>
<path d="M18.5 11C18.5 7.15 15.2 4.1 11.25 4.55C8.25 4.9 5.85 7.3 5.55 10.3C5.3 12.6 6.25 14.65 7.85 15.95C8.55 16.55 9 17.4 9 18.35V18.5H15V18.45C15 17.55 15.4 16.65 16.1 16.05C17.55 14.85 18.5 13.05 18.5 11Z" fill="#FBC02D"/>
<path d="M15.3 10.1L13.8 9.10002C13.65 9.00002 13.4 9.00002 13.25 9.10002L12 9.90002L10.8 9.10002C10.65 9.00002 10.4 9.00002 10.25 9.10002L8.75 10.1C8.65 10.2 8.55 10.3 8.55 10.45C8.55 10.6 8.55 10.75 8.65 10.85L10.55 13.2V18.5H11.55V13C11.55 12.9 11.5 12.8 11.45 12.7L9.8 10.65L10.55 10.15L11.75 10.95C11.9 11.05 12.15 11.05 12.3 10.95L13.5 10.15L14.25 10.65L12.6 12.7C12.55 12.8 12.5 12.9 12.5 13V18.5H13.5V13.2L15.4 10.85C15.5 10.75 15.55 10.6 15.5 10.45C15.45 10.3 15.4 10.15 15.3 10.1Z" fill="#FFF59D"/>
<path d="M12 23.5C12.8284 23.5 13.5 22.8284 13.5 22C13.5 21.1716 12.8284 20.5 12 20.5C11.1716 20.5 10.5 21.1716 10.5 22C10.5 22.8284 11.1716 23.5 12 23.5Z" fill="#5C6BC0"/>
<path d="M13 22.5H11C9.9 22.5 9 21.6 9 20.5V18H15V20.5C15 21.6 14.1 22.5 13 22.5Z" fill="#9FA8DA"/>
<path d="M15 20.5L9.2 21.3C9.35 21.65 9.65 22 10 22.2L14.7 21.55C14.9 21.25 15 20.9 15 20.5ZM9 19.35V20.35L15 19.5V18.5L9 19.35Z" fill="#5C6BC0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,8 @@
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.5291 19V7H21.5291V19C21.5291 20.1 20.6291 21 19.5291 21H4.5291C3.4291 21 2.5291 20.1 2.5291 19Z" fill="#CFD8DC"/>
<path d="M21.5291 5V8H2.5291V5C2.5291 3.9 3.4291 3 4.5291 3H19.5291C20.6291 3 21.5291 3.9 21.5291 5Z" fill="#F44336"/>
<path d="M16.5291 6.5C17.3575 6.5 18.0291 5.82843 18.0291 5C18.0291 4.17157 17.3575 3.5 16.5291 3.5C15.7007 3.5 15.0291 4.17157 15.0291 5C15.0291 5.82843 15.7007 6.5 16.5291 6.5Z" fill="#B71C1C"/>
<path d="M7.5291 6.5C8.35753 6.5 9.0291 5.82843 9.0291 5C9.0291 4.17157 8.35753 3.5 7.5291 3.5C6.70067 3.5 6.0291 4.17157 6.0291 5C6.0291 5.82843 6.70067 6.5 7.5291 6.5Z" fill="#B71C1C"/>
<path d="M16.5291 1.5C15.9791 1.5 15.5291 1.95 15.5291 2.5V5C15.5291 5.55 15.9791 6 16.5291 6C17.0791 6 17.5291 5.55 17.5291 5V2.5C17.5291 1.95 17.0791 1.5 16.5291 1.5ZM7.5291 1.5C6.9791 1.5 6.5291 1.95 6.5291 2.5V5C6.5291 5.55 6.9791 6 7.5291 6C8.0791 6 8.5291 5.55 8.5291 5V2.5C8.5291 1.95 8.0791 1.5 7.5291 1.5ZM6.5291 10.5H9.5291V13.5H6.5291V10.5ZM10.5291 10.5H13.5291V13.5H10.5291V10.5ZM14.5291 10.5H17.5291V13.5H14.5291V10.5ZM6.5291 14.5H9.5291V17.5H6.5291V14.5ZM10.5291 14.5H13.5291V17.5H10.5291V14.5Z" fill="#B0BEC5"/>
<path d="M14.5291 14.5H17.5291V17.5H14.5291V14.5Z" fill="#F44336"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,7 @@
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9 10.8169C10.1046 10.8169 11 9.92146 11 8.81689C11 7.71232 10.1046 6.81689 9 6.81689C7.89543 6.81689 7 7.71232 7 8.81689C7 9.92146 7.89543 10.8169 9 10.8169Z" stroke="#2196F3" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 2.81689H9C4 2.81689 2 4.81689 2 9.81689V15.8169C2 20.8169 4 22.8169 9 22.8169H15C20 22.8169 22 20.8169 22 15.8169V10.8169" stroke="#2196F3" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15.75 5.81689H21.25" stroke="#2196F3" stroke-width="1.5" stroke-linecap="round"/>
<path d="M18.5 8.56689V3.06689" stroke="#2196F3" stroke-width="1.5" stroke-linecap="round"/>
<path d="M2.66992 19.767L7.59992 16.457C8.38992 15.927 9.52992 15.987 10.2399 16.597L10.5699 16.887C11.3499 17.557 12.6099 17.557 13.3899 16.887L17.5499 13.317C18.3299 12.647 19.5899 12.647 20.3699 13.317L21.9999 14.717" stroke="#2196F3" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

4
assets/icons/link-2.svg Normal file
View File

@ -0,0 +1,4 @@
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.57 14.24C19.28 14.53 18.82 14.53 18.54 14.24C18.25 13.95 18.25 13.49 18.54 13.21C20.54 11.21 20.54 7.95998 18.54 5.96998C16.54 3.97998 13.29 3.96998 11.3 5.96998C9.31 7.96998 9.3 11.22 11.3 13.21C11.59 13.5 11.59 13.96 11.3 14.24C11.01 14.53 10.55 14.53 10.27 14.24C7.7 11.67 7.7 7.48998 10.27 4.92998C12.84 2.36998 17.02 2.35998 19.58 4.92998C22.14 7.49998 22.14 11.67 19.57 14.24Z" fill="#0E3F66"/>
<path d="M5.43 9.75998C5.72 9.46998 6.18 9.46998 6.46 9.75998C6.75 10.05 6.75 10.51 6.46 10.79C4.46 12.79 4.46 16.04 6.46 18.03C8.46 20.02 11.71 20.03 13.7 18.03C15.69 16.03 15.7 12.78 13.7 10.79C13.41 10.5 13.41 10.04 13.7 9.75998C13.99 9.46998 14.45 9.46998 14.73 9.75998C17.3 12.33 17.3 16.51 14.73 19.07C12.16 21.63 7.98 21.64 5.42 19.07C2.86 16.5 2.86 12.33 5.43 9.75998Z" fill="#0E3F66"/>
</svg>

After

Width:  |  Height:  |  Size: 912 B

View File

@ -0,0 +1,7 @@
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.5 15.5C14.71 15.5 16.5 13.71 16.5 11.5V6C16.5 3.79 14.71 2 12.5 2C10.29 2 8.5 3.79 8.5 6V11.5C8.5 13.71 10.29 15.5 12.5 15.5Z" stroke="#0E3F66" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4.85001 9.65002V11.35C4.85001 15.57 8.28001 19 12.5 19C16.72 19 20.15 15.57 20.15 11.35V9.65002" stroke="#0E3F66" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11.11 6.43C12.01 6.1 12.99 6.1 13.89 6.43" stroke="#0E3F66" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11.7 8.54995C12.23 8.40995 12.78 8.40995 13.31 8.54995" stroke="#0E3F66" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.5 19V22" stroke="#0E3F66" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 916 B

View File

@ -35,7 +35,7 @@ class _OTPVerificationPageState extends State<OTPVerificationPage> {
} }
void _initializeTimer() { void _initializeTimer() {
_otpTimer.initializeFromExpiry(expiryTimeString: widget.timeDue); _otpTimer.initializeFromExpiry(expiryTime: widget.timeDue);
} }
void _resendOTP() { void _resendOTP() {
@ -80,8 +80,8 @@ class _OTPVerificationPageState extends State<OTPVerificationPage> {
), ),
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
borderSide: borderSide: const BorderSide(
const BorderSide(color: Color.fromARGB(255, 14, 63, 102)), color: Color.fromARGB(255, 14, 63, 102)),
), ),
), ),
onChanged: (value) { onChanged: (value) {
@ -102,7 +102,7 @@ class _OTPVerificationPageState extends State<OTPVerificationPage> {
return BlocListener<AuthBloc, AuthState>( return BlocListener<AuthBloc, AuthState>(
listener: (context, state) { listener: (context, state) {
if (state is AuthSuccess) { if (state is AuthSuccess) {
_otpTimer.initializeFromExpiry(expiryTimeString: state.timeDue); _otpTimer.initializeFromExpiry(expiryTime: state.timeDue);
} }
}, },
child: Scaffold( child: Scaffold(

View File

@ -24,6 +24,10 @@ class $AssetsIconsGen {
/// File path: assets/icons/Line 4.svg /// File path: assets/icons/Line 4.svg
SvgGenImage get line4 => const SvgGenImage('assets/icons/Line 4.svg'); SvgGenImage get line4 => const SvgGenImage('assets/icons/Line 4.svg');
/// File path: assets/icons/MDS-Public-TW-Button (1).svg
SvgGenImage get mDSPublicTWButton1 =>
const SvgGenImage('assets/icons/MDS-Public-TW-Button (1).svg');
/// File path: assets/icons/MDS-Public-TW-Button.svg /// File path: assets/icons/MDS-Public-TW-Button.svg
SvgGenImage get mDSPublicTWButton => SvgGenImage get mDSPublicTWButton =>
const SvgGenImage('assets/icons/MDS-Public-TW-Button.svg'); const SvgGenImage('assets/icons/MDS-Public-TW-Button.svg');
@ -66,6 +70,9 @@ class $AssetsIconsGen {
SvgGenImage get arrowRight => SvgGenImage get arrowRight =>
const SvgGenImage('assets/icons/arrow-right.svg'); const SvgGenImage('assets/icons/arrow-right.svg');
/// File path: assets/icons/arrow-up.svg
SvgGenImage get arrowUp => const SvgGenImage('assets/icons/arrow-up.svg');
/// File path: assets/icons/back.svg /// File path: assets/icons/back.svg
SvgGenImage get back => const SvgGenImage('assets/icons/back.svg'); SvgGenImage get back => const SvgGenImage('assets/icons/back.svg');
@ -77,6 +84,9 @@ class $AssetsIconsGen {
SvgGenImage get calendarTick => SvgGenImage get calendarTick =>
const SvgGenImage('assets/icons/calendar-tick.svg'); const SvgGenImage('assets/icons/calendar-tick.svg');
/// File path: assets/icons/camera2.svg
SvgGenImage get camera2 => const SvgGenImage('assets/icons/camera2.svg');
/// File path: assets/icons/card-add.svg /// File path: assets/icons/card-add.svg
SvgGenImage get cardAdd => const SvgGenImage('assets/icons/card-add.svg'); SvgGenImage get cardAdd => const SvgGenImage('assets/icons/card-add.svg');
@ -120,10 +130,22 @@ class $AssetsIconsGen {
/// File path: assets/icons/favorite.svg /// File path: assets/icons/favorite.svg
SvgGenImage get favorite => const SvgGenImage('assets/icons/favorite.svg'); SvgGenImage get favorite => const SvgGenImage('assets/icons/favorite.svg');
/// File path: assets/icons/flat-color-icons_idea.svg
SvgGenImage get flatColorIconsIdea =>
const SvgGenImage('assets/icons/flat-color-icons_idea.svg');
/// File path: assets/icons/flat-color-icons_planner.svg
SvgGenImage get flatColorIconsPlanner =>
const SvgGenImage('assets/icons/flat-color-icons_planner.svg');
/// File path: assets/icons/fluent-color_location-ripple-16.svg /// File path: assets/icons/fluent-color_location-ripple-16.svg
SvgGenImage get fluentColorLocationRipple16 => SvgGenImage get fluentColorLocationRipple16 =>
const SvgGenImage('assets/icons/fluent-color_location-ripple-16.svg'); const SvgGenImage('assets/icons/fluent-color_location-ripple-16.svg');
/// File path: assets/icons/gallery-add.svg
SvgGenImage get galleryAdd =>
const SvgGenImage('assets/icons/gallery-add.svg');
/// File path: assets/icons/game 2.svg /// File path: assets/icons/game 2.svg
SvgGenImage get game2 => const SvgGenImage('assets/icons/game 2.svg'); SvgGenImage get game2 => const SvgGenImage('assets/icons/game 2.svg');
@ -164,6 +186,9 @@ class $AssetsIconsGen {
/// File path: assets/icons/like.svg /// File path: assets/icons/like.svg
SvgGenImage get like => const SvgGenImage('assets/icons/like.svg'); SvgGenImage get like => const SvgGenImage('assets/icons/like.svg');
/// File path: assets/icons/link-2.svg
SvgGenImage get link2 => const SvgGenImage('assets/icons/link-2.svg');
/// File path: assets/icons/list.svg /// File path: assets/icons/list.svg
SvgGenImage get list => const SvgGenImage('assets/icons/list.svg'); SvgGenImage get list => const SvgGenImage('assets/icons/list.svg');
@ -205,6 +230,10 @@ class $AssetsIconsGen {
SvgGenImage get materialSymbolsLocationWork => SvgGenImage get materialSymbolsLocationWork =>
const SvgGenImage('assets/icons/material-symbols_location-work.svg'); const SvgGenImage('assets/icons/material-symbols_location-work.svg');
/// File path: assets/icons/microphone-2.svg
SvgGenImage get microphone2 =>
const SvgGenImage('assets/icons/microphone-2.svg');
/// File path: assets/icons/nearby.svg /// File path: assets/icons/nearby.svg
SvgGenImage get nearby => const SvgGenImage('assets/icons/nearby.svg'); SvgGenImage get nearby => const SvgGenImage('assets/icons/nearby.svg');
@ -318,6 +347,7 @@ class $AssetsIconsGen {
lBALogo, lBALogo,
line1, line1,
line4, line4,
mDSPublicTWButton1,
mDSPublicTWButton, mDSPublicTWButton,
mDSPublicTWTag, mDSPublicTWTag,
nextButton, nextButton,
@ -330,9 +360,11 @@ class $AssetsIconsGen {
arrowDown, arrowDown,
arrowLeft, arrowLeft,
arrowRight, arrowRight,
arrowUp,
back, back,
calendarTick2, calendarTick2,
calendarTick, calendarTick,
camera2,
cardAdd, cardAdd,
cardPos, cardPos,
category2, category2,
@ -346,7 +378,10 @@ class $AssetsIconsGen {
down, down,
elementEqual, elementEqual,
favorite, favorite,
flatColorIconsIdea,
flatColorIconsPlanner,
fluentColorLocationRipple16, fluentColorLocationRipple16,
galleryAdd,
game2, game2,
gameIconsWinterGloves, gameIconsWinterGloves,
game, game,
@ -358,6 +393,7 @@ class $AssetsIconsGen {
infoPic, infoPic,
ionFastFoodOutline, ionFastFoodOutline,
like, like,
link2,
list, list,
location, location,
mapSelected, mapSelected,
@ -369,6 +405,7 @@ class $AssetsIconsGen {
materialSymbolsLocationOn, materialSymbolsLocationOn,
materialSymbolsLocationOnn, materialSymbolsLocationOnn,
materialSymbolsLocationWork, materialSymbolsLocationWork,
microphone2,
nearby, nearby,
nearby2, nearby2,
next, next,

View File

@ -24,4 +24,5 @@ class LightAppColors{
static const divider = Color.fromARGB(255, 189, 189, 188); static const divider = Color.fromARGB(255, 189, 189, 188);
static const textPrice = Color.fromARGB(255, 85, 84, 81); static const textPrice = Color.fromARGB(255, 85, 84, 81);
static const deliverySelectedButton = Color.fromARGB(255, 237, 247, 238); static const deliverySelectedButton = Color.fromARGB(255, 237, 247, 238);
static const loadingBorder = Color.fromARGB(255, 239, 239, 239);
} }

View File

@ -17,7 +17,8 @@ class OTPVerification extends StatefulWidget {
class _OTPVerificationState extends State<OTPVerification> { class _OTPVerificationState extends State<OTPVerification> {
final List<FocusNode> _focusNodes = List.generate(5, (_) => FocusNode()); final List<FocusNode> _focusNodes = List.generate(5, (_) => FocusNode());
final List<TextEditingController> _controllers = List.generate(5, (_) => TextEditingController()); final List<TextEditingController> _controllers =
List.generate(5, (_) => TextEditingController());
late RemainingTime _otpTimer; late RemainingTime _otpTimer;
@override @override
@ -29,7 +30,7 @@ class _OTPVerificationState extends State<OTPVerification> {
void _initializeTimer() { void _initializeTimer() {
final authCubit = context.read<AuthCubit>(); final authCubit = context.read<AuthCubit>();
_otpTimer.initializeFromExpiry(expiryTimeString: authCubit.timeDue); _otpTimer.initializeFromExpiry(expiryTime: authCubit.timeDue);
} }
void _resendOTP() { void _resendOTP() {
@ -74,7 +75,8 @@ class _OTPVerificationState extends State<OTPVerification> {
), ),
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
borderSide: const BorderSide(color: Color.fromARGB(255, 14, 63, 102)), borderSide: const BorderSide(
color: Color.fromARGB(255, 14, 63, 102)),
), ),
), ),
onChanged: (value) { onChanged: (value) {
@ -109,21 +111,27 @@ class _OTPVerificationState extends State<OTPVerification> {
], ],
), ),
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 24), padding:
const EdgeInsets.symmetric(horizontal: 24, vertical: 24),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Center( Center(
child: Padding( child: Padding(
padding: const EdgeInsets.only(top: 0), padding: const EdgeInsets.only(top: 0),
child: SvgPicture.asset(Assets.images.logo.path, height: height / 5.2), child: SvgPicture.asset(Assets.images.logo.path,
height: height / 5.2),
), ),
), ),
SizedBox(height: height / 20), SizedBox(height: height / 20),
const Text("OTP Verification", style: TextStyle(fontSize: 33, fontWeight: FontWeight.bold)), const Text("OTP Verification",
style: TextStyle(
fontSize: 33, fontWeight: FontWeight.bold)),
const SizedBox(height: 8), const SizedBox(height: 8),
Text("Enter the verification code we just sent to your device.", const Text(
style: TextStyle(fontSize: 17, fontWeight: FontWeight.w500), "Enter the verification code we just sent to your device.",
style:
TextStyle(fontSize: 17, fontWeight: FontWeight.w500),
), ),
const SizedBox(height: 25), const SizedBox(height: 25),
_buildOTPFields(), _buildOTPFields(),
@ -134,10 +142,14 @@ class _OTPVerificationState extends State<OTPVerification> {
child: Button( child: Button(
text: "Verify", text: "Verify",
onPressed: () { onPressed: () {
final otpCode = _controllers.map((c) => c.text).join(); final otpCode =
_controllers.map((c) => c.text).join();
if (otpCode.length == 5) { if (otpCode.length == 5) {
context.read<AuthCubit>().verifyOTP(otpCode); context.read<AuthCubit>().verifyOTP(otpCode);
Navigator.push(context, MaterialPageRoute(builder: (context) => UserInfo())); Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const UserInfo()));
} }
}, },
color: const Color.fromARGB(255, 30, 137, 221), color: const Color.fromARGB(255, 30, 137, 221),
@ -150,22 +162,27 @@ class _OTPVerificationState extends State<OTPVerification> {
Row( Row(
children: [ children: [
const Expanded( const Expanded(
child: Divider(thickness: 1, color: Colors.grey), child:
Divider(thickness: 1, color: Colors.grey),
), ),
ValueListenableBuilder<int>( ValueListenableBuilder<int>(
valueListenable: _otpTimer.remainingSeconds, valueListenable: _otpTimer.remainingSeconds,
builder: (context, seconds, _) { builder: (context, seconds, _) {
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0), padding: const EdgeInsets.symmetric(
horizontal: 8.0),
child: Text( child: Text(
"Resend OTP in ${_otpTimer.formatTime()}", "Resend OTP in ${_otpTimer.formatTime()}",
style: const TextStyle(fontWeight: FontWeight.w500, fontSize: 18), style: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 18),
), ),
); );
}, },
), ),
const Expanded( const Expanded(
child: Divider(thickness: 1, color: Colors.grey), child:
Divider(thickness: 1, color: Colors.grey),
), ),
], ],
), ),
@ -179,7 +196,9 @@ class _OTPVerificationState extends State<OTPVerification> {
"Resend OTP", "Resend OTP",
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
color: canResend ? const Color.fromARGB(255, 0, 0, 0) : Colors.grey, color: canResend
? const Color.fromARGB(255, 0, 0, 0)
: Colors.grey,
), ),
), ),
); );

View File

@ -98,7 +98,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
showGeneralDialog( showGeneralDialog(
context: context, context: context,
barrierDismissible: true, barrierDismissible: true,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, barrierLabel:
MaterialLocalizations.of(context).modalBarrierDismissLabel,
barrierColor: Colors.black.withOpacity(0.1), barrierColor: Colors.black.withOpacity(0.1),
transitionDuration: const Duration(milliseconds: 400), transitionDuration: const Duration(milliseconds: 400),
pageBuilder: (context, animation1, animation2) { pageBuilder: (context, animation1, animation2) {
@ -108,7 +109,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
alignment: Alignment.topRight, alignment: Alignment.topRight,
child: Container( child: Container(
width: 250, width: 250,
margin: const EdgeInsets.only(top: kToolbarHeight + 65, right: 16), margin:
const EdgeInsets.only(top: kToolbarHeight + 65, right: 16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
@ -131,7 +133,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
onTap: () { onTap: () {
setDialogState(() { setDialogState(() {
setState(() { setState(() {
_filters[filterName] = !_filters[filterName]!; _filters[filterName] =
!_filters[filterName]!;
}); });
}); });
}, },
@ -139,13 +142,15 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 18.0, vertical: 12.0), horizontal: 18.0, vertical: 12.0),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
filterName, filterName,
style: TextStyle(fontSize: 16), style: const TextStyle(fontSize: 16),
), ),
_buildCustomCheckbox(_filters[filterName]!), _buildCustomCheckbox(
_filters[filterName]!),
], ],
), ),
), ),
@ -167,7 +172,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
); );
return ScaleTransition( return ScaleTransition(
scale: Tween<double>(begin: 0.8, end: 1.0).animate(curvedAnimation), scale:
Tween<double>(begin: 0.8, end: 1.0).animate(curvedAnimation),
alignment: Alignment.topRight, alignment: Alignment.topRight,
child: FadeTransition( child: FadeTransition(
opacity: curvedAnimation, opacity: curvedAnimation,
@ -226,7 +232,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
const SizedBox(height: 12), const SizedBox(height: 12),
_buildAnimatedSection(_buildFlashSaleSection(), 6), _buildAnimatedSection(_buildFlashSaleSection(), 6),
const SizedBox(height: 24), const SizedBox(height: 24),
_buildAnimatedSection(_buildSectionTitle("Special Discount"), 7), _buildAnimatedSection(
_buildSectionTitle("Special Discount"), 7),
const SizedBox(height: 12), const SizedBox(height: 12),
_buildAnimatedSection(_buildSpecialDiscountSection(), 1), _buildAnimatedSection(_buildSpecialDiscountSection(), 1),
const SizedBox(height: 24), const SizedBox(height: 24),
@ -237,7 +244,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
const SizedBox(height: 12), const SizedBox(height: 12),
_buildAnimatedSection(_buildSeasonalDiscountSection(), 3), _buildAnimatedSection(_buildSeasonalDiscountSection(), 3),
const SizedBox(height: 24), const SizedBox(height: 24),
_buildAnimatedSection(_buildSectionTitle("Occasion Specials"), 4), _buildAnimatedSection(
_buildSectionTitle("Occasion Specials"), 4),
const SizedBox(height: 12), const SizedBox(height: 12),
_buildAnimatedSection(_buildCraftingSomethingSection(), 5), _buildAnimatedSection(_buildCraftingSomethingSection(), 5),
const SizedBox(height: 24), const SizedBox(height: 24),
@ -291,7 +299,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
), ),
child: IconButton( child: IconButton(
icon: SvgPicture.asset(Assets.icons.sort.path, color: Colors.white), icon:
SvgPicture.asset(Assets.icons.sort.path, color: Colors.white),
onPressed: _showFilterMenu, onPressed: _showFilterMenu,
), ),
); );
@ -307,7 +316,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
color: isChecked ? LightAppColors.primary : Colors.transparent, color: isChecked ? LightAppColors.primary : Colors.transparent,
border: isChecked border: isChecked
? null ? null
: Border.all(color: Color.fromARGB(255, 89, 93, 98), width: 2), : Border.all(
color: const Color.fromARGB(255, 89, 93, 98), width: 2),
borderRadius: BorderRadius.circular(6), borderRadius: BorderRadius.circular(6),
), ),
child: AnimatedSwitcher( child: AnimatedSwitcher(
@ -359,7 +369,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
color: backgroundColor, color: backgroundColor,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
), ),
child: SvgPicture.asset(categoryIcons[index], color: iconColor), child:
SvgPicture.asset(categoryIcons[index], color: iconColor),
); );
}, },
separatorBuilder: (context, index) => const SizedBox(width: 12), separatorBuilder: (context, index) => const SizedBox(width: 12),
@ -516,7 +527,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
children: [ children: [
Text( Text(
title, title,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.normal), style: const TextStyle(
fontSize: 18, fontWeight: FontWeight.normal),
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
const Expanded( const Expanded(
@ -576,7 +588,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
SizedBox( SizedBox(
width: 250, width: 250,
child: FlashSaleCard( child: FlashSaleCard(
imagePath: Assets.images.wp1929534FastFoodWallpapers1.path, imagePath:
Assets.images.wp1929534FastFoodWallpapers1.path,
title: "Tulip Luncheon Meat", title: "Tulip Luncheon Meat",
location: "Fresno (2km away)", location: "Fresno (2km away)",
originalPrice: "370", originalPrice: "370",
@ -601,7 +614,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15), borderRadius: BorderRadius.circular(15),
image: DecorationImage( image: DecorationImage(
image: AssetImage(Assets.images.wp1929534FastFoodWallpapers1.path), image: AssetImage(
Assets.images.wp1929534FastFoodWallpapers1.path),
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
), ),
@ -746,7 +760,8 @@ class _DiscoverState extends State<Discover> with TickerProviderStateMixin {
category: "Fast Food", category: "Fast Food",
discount: "Up to 25% Off", discount: "Up to 25% Off",
rating: 4.2, rating: 4.2,
imagePath: Assets.images.wp1929534FastFoodWallpapers1.path, imagePath:
Assets.images.wp1929534FastFoodWallpapers1.path,
), ),
const SizedBox(width: 16), const SizedBox(width: 16),
FirstPurchaseCard( FirstPurchaseCard(
@ -797,7 +812,7 @@ class FlashSaleCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final timer = RemainingTime() final timer = RemainingTime()
..initializeFromExpiry(expiryTimeString: expiryTimeString); ..initializeFromExpiry(expiryTime: expiryTimeString);
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: LightAppColors.cardBackground, color: LightAppColors.cardBackground,
@ -902,7 +917,8 @@ class FlashSaleCard extends StatelessWidget {
Text( Text(
location, location,
style: const TextStyle( style: const TextStyle(
color: LightAppColors.offerCardDetail, fontSize: 12), color: LightAppColors.offerCardDetail,
fontSize: 12),
), ),
], ],
), ),
@ -960,7 +976,9 @@ class FlashSaleCard extends StatelessWidget {
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25), borderRadius: BorderRadius.circular(25),
border: Border.all(color: const Color.fromARGB(255, 76, 175, 80), width: 1.0), border: Border.all(
color: const Color.fromARGB(255, 76, 175, 80),
width: 1.0),
color: Colors.transparent, color: Colors.transparent,
), ),
child: Padding( child: Padding(
@ -969,7 +987,8 @@ class FlashSaleCard extends StatelessWidget {
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
Assets.icons.cardPos.path, Assets.icons.cardPos.path,
color: const Color.fromARGB(255, 95, 95, 95), color:
const Color.fromARGB(255, 95, 95, 95),
height: 17, height: 17,
), ),
const SizedBox(width: 4), const SizedBox(width: 4),
@ -989,7 +1008,9 @@ class FlashSaleCard extends StatelessWidget {
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25), borderRadius: BorderRadius.circular(25),
border: Border.all(color: const Color.fromARGB(255, 76, 175, 80), width: 1.0), border: Border.all(
color: const Color.fromARGB(255, 76, 175, 80),
width: 1.0),
color: Colors.transparent, color: Colors.transparent,
), ),
child: Padding( child: Padding(
@ -998,7 +1019,8 @@ class FlashSaleCard extends StatelessWidget {
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
Assets.icons.shoppingCart.path, Assets.icons.shoppingCart.path,
color: const Color.fromARGB(255, 95, 95, 95), color:
const Color.fromARGB(255, 95, 95, 95),
height: 17, height: 17,
), ),
const SizedBox(width: 4), const SizedBox(width: 4),
@ -1187,7 +1209,8 @@ class FirstPurchaseCard extends StatelessWidget {
Text( Text(
category, category,
style: const TextStyle( style: const TextStyle(
color: LightAppColors.nearbyPopuphint, fontSize: 14), color: LightAppColors.nearbyPopuphint,
fontSize: 14),
), ),
const SizedBox(height: 5), const SizedBox(height: 5),
Text( Text(
@ -1199,7 +1222,8 @@ class FirstPurchaseCard extends StatelessWidget {
const SizedBox(height: 5), const SizedBox(height: 5),
Row( Row(
children: [ children: [
SvgPicture.asset(Assets.icons.star.path, width: 16), SvgPicture.asset(Assets.icons.star.path,
width: 16),
const SizedBox(width: 4), const SizedBox(width: 4),
Text( Text(
rating.toString(), rating.toString(),

View File

@ -10,16 +10,14 @@ import 'package:lba/widgets/remainingTime.dart';
class ListScreen extends StatefulWidget { class ListScreen extends StatefulWidget {
final bool delivery; final bool delivery;
final bool pickup; final bool pickup;
int initialTimerStatus; final DateTime expiryTime;
final String expiryTimeString;
final VoidCallback? ontap; final VoidCallback? ontap;
ListScreen({ const ListScreen({
super.key, super.key,
required this.delivery, required this.delivery,
required this.pickup, required this.pickup,
this.initialTimerStatus=3, required this.expiryTime,
required this.expiryTimeString,
this.ontap, this.ontap,
}); });
@ -35,16 +33,17 @@ class _ListScreenState extends State<ListScreen> {
void initState() { void initState() {
super.initState(); super.initState();
_timer = RemainingTime(); _timer = RemainingTime();
_timerStatus = ValueNotifier<int>(widget.initialTimerStatus); _timerStatus = ValueNotifier<int>(3);
_timer.initializeFromExpiry(expiryTimeString: widget.expiryTimeString); _timer.initializeFromExpiry(expiryTime: widget.expiryTime);
_timer.remainingSeconds.addListener(() { _timer.remainingSeconds.addListener(() {
if (_timer.remainingSeconds.value <= 0) { final secondsLeft = _timer.remainingSeconds.value;
_timerStatus.value = 3; if (secondsLeft <= 0) {
} else if (_timer.remainingSeconds.value < 18000) { _timerStatus.value = 3;
_timerStatus.value = 1; } else if (secondsLeft < 18000) {
} else if (_timer.remainingSeconds.value > 18000) { _timerStatus.value = 1;
_timerStatus.value = 2; } else {
_timerStatus.value = 2;
} }
}); });
} }
@ -60,213 +59,228 @@ class _ListScreenState extends State<ListScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final width = context.screenWidth; final width = context.screenWidth;
final height = context.screenHeight; final height = context.screenHeight;
return return GestureDetector(
GestureDetector( onTap: widget.ontap,
onTap: widget.ontap, child: Padding(
child: Padding( padding: const EdgeInsets.only(bottom: 16),
padding: const EdgeInsets.only(bottom: 16), child: Stack(
child: Stack( children: [
children: [ Container(
Container( margin: const EdgeInsets.only(top: 60),
margin: const EdgeInsets.only(top: 60), padding: const EdgeInsets.only(top: 80),
padding: const EdgeInsets.only(top: 80), decoration: BoxDecoration(
decoration: BoxDecoration( color: const Color.fromARGB(255, 242, 242, 241),
color: const Color.fromARGB(255, 242, 242, 241), borderRadius: BorderRadius.circular(10),
borderRadius: BorderRadius.circular(10),
),
child: Padding(
padding: EdgeInsets.fromLTRB(12, 0, width/50, 15),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Row(
children: [
SvgPicture.asset(Assets.icons.phCheese.path),
const SizedBox(width: 5),
const Text(
"Amul Cheese Slices",
style: TextStyle(fontWeight: FontWeight.bold),
),
],
),
const SizedBox(height: 10),
Row(
children: [
SvgPicture.asset(
Assets.icons.location.path,
color: const Color.fromARGB(255, 157, 157, 155),
width: 14,
),
const SizedBox(width: 5),
const Text("Sharjah (750m away)",style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500
),),
],
),
const SizedBox(height: 10),
Row(
children: [
SvgPicture.asset(
Assets.icons.coin.path,
width: 14,
),
const SizedBox(width: 5),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text(
"18.15 AED",
style: TextStyle(
color: Color.fromARGB(255, 157, 157, 155),
fontSize: 10,
decoration: TextDecoration.lineThrough,
),
),
SizedBox(height: 0),
Row(
children: [
Text("15.84 AED",style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500
),),
SizedBox(width: 4),
Text(
"(13% off)",
style: TextStyle(
color: Color.fromARGB(255, 76, 175, 80),
fontSize: 10,
fontWeight: FontWeight.w500
),
),
],
),
],
),
],
),
],
),
),
Padding(
padding: EdgeInsets.fromLTRB(0, 35, widget.delivery == false || widget.pickup == false ? width/5 : width/60, 0),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.icons.star.path,
width: 14,
),
const SizedBox(width: 2),
const Text(
"4.8",
style: TextStyle(
color: Color.fromARGB(255, 112, 112, 110),
),
),
],
),
const SizedBox(height: 10),
Row(
children: [
if (widget.delivery)
OrderType(
icon: Assets.icons.cardPos.path,
typename: "Delivery",
fill: false,
),
if (widget.delivery) const SizedBox(width: 5),
if (widget.pickup)
OrderType(
icon: Assets.icons.shoppingCart.path,
typename: "Pickup",
fill: false,
),
],
),
],
),
),
],
),
),
), ),
ClipRRect( child: Padding(
borderRadius: const BorderRadius.only( padding: EdgeInsets.fromLTRB(12, 0, width / 50, 15),
topRight: Radius.circular(10), child: Row(
topLeft: Radius.circular(10), crossAxisAlignment: CrossAxisAlignment.start,
), mainAxisAlignment: MainAxisAlignment.start,
child: Image.asset( children: [
Assets.images.media.path, Expanded(
width: double.infinity, child: Column(
height: 130, crossAxisAlignment: CrossAxisAlignment.stretch,
fit: BoxFit.cover, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
),
),
Positioned(
top: 10,
left: 10,
child: ValueListenableBuilder<int>(
valueListenable: _timerStatus,
builder: (context, timerStatus, child) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 6),
height: 20,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
color: timerStatus == 1
? const Color.fromARGB(255, 255, 193, 7)
: timerStatus == 2
? const Color.fromARGB(255, 76, 175, 80)
: timerStatus == 3
? const Color.fromARGB(255, 244, 67, 54)
: const Color.fromARGB(255, 244, 67, 54),
),
child: Row(
children: [ children: [
SvgPicture.asset( Row(
timerStatus == 1 children: [
? Assets.icons.timer.path SvgPicture.asset(Assets.icons.phCheese.path),
: timerStatus == 2 const SizedBox(width: 5),
? Assets.icons.timerStart.path const Text(
: Assets.icons.timerPause.path, "Amul Cheese Slices",
width: 12, style: TextStyle(fontWeight: FontWeight.bold),
height: 12, ),
],
), ),
const SizedBox(width: 5), const SizedBox(height: 10),
ValueListenableBuilder<int>( Row(
valueListenable: _timer.remainingSeconds, children: [
builder: (context, seconds, child) { SvgPicture.asset(
return Text( Assets.icons.location.path,
timerStatus==3? "Unavailable":"${_timer.formatTime()} left", color:
style: const TextStyle( const Color.fromARGB(255, 157, 157, 155),
color: Colors.white, width: 14,
fontSize: 12, ),
fontWeight: FontWeight.w400, const SizedBox(width: 5),
), const Text(
); "Sharjah (750m away)",
}, style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500),
),
],
),
const SizedBox(height: 10),
Row(
children: [
SvgPicture.asset(
Assets.icons.coin.path,
width: 14,
),
const SizedBox(width: 5),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text(
"18.15 AED",
style: TextStyle(
color: Color.fromARGB(
255, 157, 157, 155),
fontSize: 10,
decoration:
TextDecoration.lineThrough,
),
),
SizedBox(height: 0),
Row(
children: [
Text(
"15.84 AED",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500),
),
SizedBox(width: 4),
Text(
"(13% off)",
style: TextStyle(
color: Color.fromARGB(
255, 76, 175, 80),
fontSize: 10,
fontWeight: FontWeight.w500),
),
],
),
],
),
],
), ),
], ],
), ),
); ),
}, Padding(
padding: EdgeInsets.fromLTRB(
0,
35,
widget.delivery == false || widget.pickup == false
? width / 5
: width / 60,
0),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.icons.star.path,
width: 14,
),
const SizedBox(width: 2),
const Text(
"4.8",
style: TextStyle(
color:
Color.fromARGB(255, 112, 112, 110),
),
),
],
),
const SizedBox(height: 10),
Row(
children: [
if (widget.delivery)
OrderType(
icon: Assets.icons.cardPos.path,
typename: "Delivery",
fill: false,
),
if (widget.delivery)
const SizedBox(width: 5),
if (widget.pickup)
OrderType(
icon: Assets.icons.shoppingCart.path,
typename: "Pickup",
fill: false,
),
],
),
],
),
),
],
), ),
), ),
], ),
), ClipRRect(
borderRadius: const BorderRadius.only(
topRight: Radius.circular(10),
topLeft: Radius.circular(10),
),
child: Image.asset(
Assets.images.media.path,
width: double.infinity,
height: 130,
fit: BoxFit.cover,
),
),
Positioned(
top: 10,
left: 10,
child: ValueListenableBuilder<int>(
valueListenable: _timerStatus,
builder: (context, timerStatus, child) {
return Container(
padding:
const EdgeInsets.symmetric(horizontal: 6),
height: 20,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
color: timerStatus == 1
? const Color.fromARGB(255, 255, 193, 7)
: timerStatus == 2
? const Color.fromARGB(255, 76, 175, 80)
: const Color.fromARGB(255, 244, 67, 54),
),
child: Row(
children: [
SvgPicture.asset(
timerStatus == 1
? Assets.icons.timer.path
: timerStatus == 2
? Assets.icons.timerStart.path
: Assets.icons.timerPause.path,
width: 12,
height: 12,
),
const SizedBox(width: 5),
ValueListenableBuilder<int>(
valueListenable: _timer.remainingSeconds,
builder: (context, seconds, child) {
return Text(
timerStatus == 3
? "Unavailable"
: "${_timer.formatTime()} left",
style: const TextStyle(
color: Colors.white,
fontSize: 12,
fontWeight: FontWeight.w400,
),
);
},
),
],
),
);
},
),
),
],
), ),
); ),
);
} }
} }

View File

@ -370,7 +370,7 @@ class _CustomMapState extends State<CustomMap>
TileLayer( TileLayer(
urlTemplate: urlTemplate:
'https://tile.openstreetmap.org/{z}/{x}/{y}.png', 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
userAgentPackageName: 'com.example.app', userAgentPackageName: 'com.example.lba',
), ),
MarkerLayer(markers: _markers), MarkerLayer(markers: _markers),
], ],

View File

@ -48,7 +48,7 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
_listAnimationController.dispose(); _listAnimationController.dispose();
super.dispose(); super.dispose();
} }
void _onToggle(int index) { void _onToggle(int index) {
setState(() { setState(() {
selectedIndex = index; selectedIndex = index;
@ -92,7 +92,8 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
), ),
), ),
filled: true, filled: true,
fillColor: const Color.fromARGB(255, 248, 248, 248), fillColor:
const Color.fromARGB(255, 248, 248, 248),
contentPadding: const EdgeInsets.symmetric( contentPadding: const EdgeInsets.symmetric(
horizontal: 16.0, horizontal: 16.0,
), ),
@ -149,11 +150,14 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
Expanded( Expanded(
child: AnimatedSwitcher( child: AnimatedSwitcher(
duration: const Duration(milliseconds: 500), duration: const Duration(milliseconds: 500),
transitionBuilder: (Widget child, Animation<double> animation) { transitionBuilder:
(Widget child, Animation<double> animation) {
final slideAnimation = Tween<Offset>( final slideAnimation = Tween<Offset>(
begin: Offset(child.key == const ValueKey('list') ? -1.0 : 1.0, 0.0), begin: Offset(
child.key == const ValueKey('list') ? -1.0 : 1.0, 0.0),
end: Offset.zero, end: Offset.zero,
).animate(CurvedAnimation(parent: animation, curve: Curves.easeInOutCubic)); ).animate(CurvedAnimation(
parent: animation, curve: Curves.easeInOutCubic));
return ClipRect( return ClipRect(
child: SlideTransition( child: SlideTransition(
@ -231,10 +235,12 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topLeft: const Radius.circular(12), topLeft: const Radius.circular(12),
bottomLeft: const Radius.circular(12), bottomLeft: const Radius.circular(12),
topRight: topRight: selectedIndex == 1
selectedIndex == 1 ? const Radius.circular(12) : Radius.zero, ? const Radius.circular(12)
bottomRight: : Radius.zero,
selectedIndex == 1 ? const Radius.circular(12) : Radius.zero, bottomRight: selectedIndex == 1
? const Radius.circular(12)
: Radius.zero,
), ),
), ),
), ),
@ -254,10 +260,12 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topRight: const Radius.circular(12), topRight: const Radius.circular(12),
bottomRight: const Radius.circular(12), bottomRight: const Radius.circular(12),
bottomLeft: bottomLeft: selectedIndex == 0
selectedIndex == 0 ? const Radius.circular(12) : Radius.zero, ? const Radius.circular(12)
topLeft: : Radius.zero,
selectedIndex == 0 ? const Radius.circular(12) : Radius.zero, topLeft: selectedIndex == 0
? const Radius.circular(12)
: Radius.zero,
), ),
), ),
), ),
@ -268,26 +276,29 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
} }
Widget _buildListContent({Key? key}) { Widget _buildListContent({Key? key}) {
final now = DateTime.now();
final listItems = [ final listItems = [
ListScreen( ListScreen(
delivery: true, delivery: true,
pickup: false, pickup: false,
expiryTimeString: "2025-05-19T13:30:49.623619357Z", expiryTime: now.add(const Duration(hours: 10)),
ontap: () { ontap: () {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute(builder: (context) => const Productdetail()), MaterialPageRoute(
builder: (context) => const Productdetail()),
); );
}, },
), ),
ListScreen( ListScreen(
delivery: false, delivery: false,
pickup: true, pickup: true,
expiryTimeString: "2025-05-25T05:20:49.623619357Z", expiryTime: now.add(const Duration(hours: 2)),
), ),
ListScreen( ListScreen(
delivery: true, delivery: true,
pickup: true, pickup: true,
expiryTimeString: "2025-05-12T13:20:37.435249520Z", expiryTime: now.subtract(const Duration(minutes: 10)),
), ),
]; ];
@ -308,7 +319,8 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
value: selectedOption, value: selectedOption,
icon: Padding( icon: Padding(
padding: const EdgeInsets.only(left: 6), padding: const EdgeInsets.only(left: 6),
child: SvgPicture.asset(Assets.icons.arrowDown.path), child:
SvgPicture.asset(Assets.icons.arrowDown.path),
), ),
elevation: 16, elevation: 16,
dropdownColor: Colors.white, dropdownColor: Colors.white,
@ -322,8 +334,8 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
selectedOption = newValue!; selectedOption = newValue!;
}); });
}, },
items: items: options
options.map<DropdownMenuItem<String>>((String value) { .map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>( return DropdownMenuItem<String>(
value: value, value: value,
child: Text(value), child: Text(value),
@ -338,7 +350,8 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemCount: listItems.length, itemCount: listItems.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final animation = Tween<double>(begin: 0.0, end: 1.0).animate( final animation =
Tween<double>(begin: 0.0, end: 1.0).animate(
CurvedAnimation( CurvedAnimation(
parent: _listAnimationController, parent: _listAnimationController,
curve: Interval( curve: Interval(
@ -413,7 +426,8 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
child: Padding( child: Padding(
padding: const EdgeInsets.all(1.0), padding: const EdgeInsets.all(1.0),
child: Center( child: Center(
child: SvgPicture.asset(icon, color: iconColor), child:
SvgPicture.asset(icon, color: iconColor),
), ),
), ),
), ),
@ -421,7 +435,8 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
Text( Text(
text, text,
style: TextStyle( style: TextStyle(
color: isSelected ? Colors.white : Colors.black87, color:
isSelected ? Colors.white : Colors.black87,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),
@ -433,7 +448,8 @@ class _NearbyState extends State<Nearby> with TickerProviderStateMixin {
bottom: 0, bottom: 0,
left: 0, left: 0,
right: 0, right: 0,
child: SvgPicture.asset(Assets.icons.shape.path, height: 4), child:
SvgPicture.asset(Assets.icons.shape.path, height: 4),
), ),
], ],
), ),

File diff suppressed because it is too large Load Diff

View File

@ -116,7 +116,7 @@ class _MapSelectionScreenState extends State<MapSelectionScreen> {
children: [ children: [
TileLayer( TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
userAgentPackageName: 'com.example.app', userAgentPackageName: 'com.example.lba',
), ),
], ],
), ),

View File

@ -15,13 +15,13 @@ class Productdetail extends StatefulWidget {
class _ProductdetailState extends State<Productdetail> class _ProductdetailState extends State<Productdetail>
with SingleTickerProviderStateMixin { with SingleTickerProviderStateMixin {
String selectedImage = Assets.images.media.path; String selectedImage = Assets.images.wp1929534FastFoodWallpapers1.path;
int selectedIndex = 0; int selectedIndex = 0;
final List<String> imageList = [ final List<String> imageList = [
Assets.images.wp1929534FastFoodWallpapers1.path,
Assets.images.media.path, Assets.images.media.path,
Assets.images.topDealsAndStores.path, Assets.images.topDealsAndStores.path,
Assets.images.wp1929534FastFoodWallpapers1.path,
Assets.images.image.path, Assets.images.image.path,
]; ];

View File

@ -260,11 +260,11 @@ class _ShopState extends State<Shop> with TickerProviderStateMixin {
style: TextStyle(color: isOpen ? Colors.green : Colors.red), style: TextStyle(color: isOpen ? Colors.green : Colors.red),
), ),
const SizedBox(width: 5), const SizedBox(width: 5),
Container( isOpen? Container(
color: LightAppColors.productDetailDivider, color: LightAppColors.productDetailDivider,
width: 1, width: 1,
height: 13, height: 13,
), ) : SizedBox(),
const SizedBox(width: 5), const SizedBox(width: 5),
Text( Text(
timeRange, timeRange,

View File

@ -7,9 +7,21 @@ class RemainingTime {
DateTime? _expiryTime; DateTime? _expiryTime;
Timer? _timer; Timer? _timer;
void initializeFromExpiry({required String expiryTimeString}) { void initializeFromExpiry({required dynamic expiryTime}) {
try { try {
_expiryTime = DateTime.fromMillisecondsSinceEpoch(int.parse(expiryTimeString)).toUtc(); if (expiryTime is DateTime) {
_expiryTime = expiryTime.toUtc();
} else if (expiryTime is String) {
if (expiryTime.contains('-') && expiryTime.contains(':')) {
_expiryTime = DateTime.parse(expiryTime).toUtc();
} else {
_expiryTime =
DateTime.fromMillisecondsSinceEpoch(int.parse(expiryTime))
.toUtc();
}
} else {
throw ArgumentError("Invalid type for expiryTime");
}
_updateRemainingSeconds(); _updateRemainingSeconds();
startTimer(); startTimer();
} catch (e) { } catch (e) {

View File

@ -6,11 +6,15 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <audioplayers_linux/audioplayers_linux_plugin.h>
#include <file_selector_linux/file_selector_plugin.h> #include <file_selector_linux/file_selector_plugin.h>
#include <maps_launcher/maps_launcher_plugin.h> #include <maps_launcher/maps_launcher_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h> #include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin");
audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar);
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar); file_selector_plugin_register_with_registrar(file_selector_linux_registrar);

View File

@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
audioplayers_linux
file_selector_linux file_selector_linux
maps_launcher maps_launcher
url_launcher_linux url_launcher_linux

View File

@ -5,20 +5,24 @@
import FlutterMacOS import FlutterMacOS
import Foundation import Foundation
import audioplayers_darwin
import file_selector_macos import file_selector_macos
import geolocator_apple import geolocator_apple
import location import location
import maps_launcher import maps_launcher
import mobile_scanner import mobile_scanner
import path_provider_foundation
import shared_preferences_foundation import shared_preferences_foundation
import url_launcher_macos import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
MapsLauncherPlugin.register(with: registry.registrar(forPlugin: "MapsLauncherPlugin")) MapsLauncherPlugin.register(with: registry.registrar(forPlugin: "MapsLauncherPlugin"))
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
} }

View File

@ -41,6 +41,62 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.12.0" version: "2.12.0"
audioplayers:
dependency: "direct main"
description:
name: audioplayers
sha256: e653f162ddfcec1da2040ba2d8553fff1662b5c2a5c636f4c21a3b11bee497de
url: "https://pub.dev"
source: hosted
version: "6.5.0"
audioplayers_android:
dependency: transitive
description:
name: audioplayers_android
sha256: "60a6728277228413a85755bd3ffd6fab98f6555608923813ce383b190a360605"
url: "https://pub.dev"
source: hosted
version: "5.2.1"
audioplayers_darwin:
dependency: transitive
description:
name: audioplayers_darwin
sha256: "0811d6924904ca13f9ef90d19081e4a87f7297ddc19fc3d31f60af1aaafee333"
url: "https://pub.dev"
source: hosted
version: "6.3.0"
audioplayers_linux:
dependency: transitive
description:
name: audioplayers_linux
sha256: f75bce1ce864170ef5e6a2c6a61cd3339e1a17ce11e99a25bae4474ea491d001
url: "https://pub.dev"
source: hosted
version: "4.2.1"
audioplayers_platform_interface:
dependency: transitive
description:
name: audioplayers_platform_interface
sha256: "0e2f6a919ab56d0fec272e801abc07b26ae7f31980f912f24af4748763e5a656"
url: "https://pub.dev"
source: hosted
version: "7.1.1"
audioplayers_web:
dependency: transitive
description:
name: audioplayers_web
sha256: "1c0f17cec68455556775f1e50ca85c40c05c714a99c5eb1d2d57cc17ba5522d7"
url: "https://pub.dev"
source: hosted
version: "5.1.1"
audioplayers_windows:
dependency: transitive
description:
name: audioplayers_windows
sha256: "4048797865105b26d47628e6abb49231ea5de84884160229251f37dfcbe52fd7"
url: "https://pub.dev"
source: hosted
version: "4.2.1"
bloc: bloc:
dependency: "direct main" dependency: "direct main"
description: description:
@ -374,6 +430,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.29" version: "2.0.29"
flutter_sound:
dependency: "direct main"
description:
name: flutter_sound
sha256: ef89477f6e8ce2fa395158ebc4a8b11982e3ada440b4021c06fd97a4e771554b
url: "https://pub.dev"
source: hosted
version: "9.28.0"
flutter_sound_platform_interface:
dependency: transitive
description:
name: flutter_sound_platform_interface
sha256: "3394d7e664a09796818014ff85a81db0dec397f4c286cbe52f8783886fa5a497"
url: "https://pub.dev"
source: hosted
version: "9.28.0"
flutter_sound_web:
dependency: transitive
description:
name: flutter_sound_web
sha256: "4e10c94a8574bd93bb8668af59bf76f5312a890bccd3778d73168a7133217dc5"
url: "https://pub.dev"
source: hosted
version: "9.28.0"
flutter_svg: flutter_svg:
dependency: "direct main" dependency: "direct main"
description: description:
@ -776,6 +856,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
path_provider:
dependency: "direct main"
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9
url: "https://pub.dev"
source: hosted
version: "2.2.17"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
@ -1053,6 +1157,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.4.1" version: "1.4.1"
synchronized:
dependency: transitive
description:
name: synchronized
sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6"
url: "https://pub.dev"
source: hosted
version: "3.3.1"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:

View File

@ -51,6 +51,9 @@ dependencies:
mobile_scanner: ^5.1.1 mobile_scanner: ^5.1.1
image_picker: ^1.1.2 image_picker: ^1.1.2
permission_handler: ^11.3.1 permission_handler: ^11.3.1
flutter_sound: ^9.8.4
audioplayers: ^6.1.0
path_provider: ^2.1.4
# geocoding: ^3.0.0 # geocoding: ^3.0.0
dev_dependencies: dev_dependencies:

View File

@ -6,6 +6,7 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <audioplayers_windows/audioplayers_windows_plugin.h>
#include <file_selector_windows/file_selector_windows.h> #include <file_selector_windows/file_selector_windows.h>
#include <geolocator_windows/geolocator_windows.h> #include <geolocator_windows/geolocator_windows.h>
#include <maps_launcher/maps_launcher_plugin.h> #include <maps_launcher/maps_launcher_plugin.h>
@ -13,6 +14,8 @@
#include <url_launcher_windows/url_launcher_windows.h> #include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
AudioplayersWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin"));
FileSelectorWindowsRegisterWithRegistrar( FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows")); registry->GetRegistrarForPlugin("FileSelectorWindows"));
GeolocatorWindowsRegisterWithRegistrar( GeolocatorWindowsRegisterWithRegistrar(

View File

@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
audioplayers_windows
file_selector_windows file_selector_windows
geolocator_windows geolocator_windows
maps_launcher maps_launcher