// ignore_for_file: use_build_context_synchronously, deprecated_member_use import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:geolocator/geolocator.dart'; import 'package:lba/gen/assets.gen.dart'; import 'package:lba/res/colors.dart'; Future showGPSDialog(BuildContext context) async { bool isLocationEnabled = await Geolocator.isLocationServiceEnabled(); if (!isLocationEnabled) { showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return const _AnimatedGpsDialog(); }, ); } } class _AnimatedGpsDialog extends StatefulWidget { const _AnimatedGpsDialog({Key? key}) : super(key: key); @override State<_AnimatedGpsDialog> createState() => _AnimatedGpsDialogState(); } class _AnimatedGpsDialogState extends State<_AnimatedGpsDialog> with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _scaleAnimation; late Animation _fadeAnimation; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: const Duration(milliseconds: 450), ); _scaleAnimation = CurvedAnimation( parent: _controller, curve: Curves.elasticOut, ); _fadeAnimation = CurvedAnimation( parent: _controller, curve: Curves.easeIn, ); _controller.forward(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return FadeTransition( opacity: _fadeAnimation, child: ScaleTransition( scale: _scaleAnimation, child: Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)), elevation: 10, backgroundColor: Colors.white, child: Stack( clipBehavior: Clip.none, alignment: Alignment.topCenter, children: [ Padding( padding: const EdgeInsets.only( top: 40, left: 20, right: 20, bottom: 20), child: Column( mainAxisSize: MainAxisSize.min, children: [ const SizedBox(height: 10), const Padding( padding: EdgeInsets.all(15.0), child: Text( "Enable Location", style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), ), const SizedBox(height: 5), const Text( "To show nearby deals, events, and shops tailored to your location, we need access to your device's GPS.", style: TextStyle( color: LightAppColors.popupText, fontWeight: FontWeight.bold, fontSize: 16, ), textAlign: TextAlign.center, ), const SizedBox(height: 20), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ ElevatedButton( style: ElevatedButton.styleFrom( elevation: 6, shadowColor: Colors.black.withOpacity(0.4), backgroundColor: Colors.white, foregroundColor: Colors.black, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), side: const BorderSide(color: Colors.grey), ), ), onPressed: () => Navigator.of(context).pop(), child: const Text("Not now"), ), ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: LightAppColors.confirmPopup, foregroundColor: Colors.black, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), side: BorderSide( color: LightAppColors.inputBorder), ), padding: const EdgeInsets.symmetric( horizontal: 35, vertical: 7), ), onPressed: () async { await Geolocator.openLocationSettings(); Navigator.of(context).pop(); }, child: const Text( "Turn on GPS", style: TextStyle(color: Colors.white), ), ), ], ), ], ), ), Positioned( top: -40, child: Container( decoration: BoxDecoration( shape: BoxShape.circle, boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.3), blurRadius: 8, offset: const Offset(0, 4), ), ], ), child: CircleAvatar( backgroundColor: Colors.white, radius: 40, child: Padding( padding: const EdgeInsets.all(12.0), child: SvgPicture.asset( Assets.icons.fluentColorLocationRipple16.path), ), ), ), ), ], ), ), ), ); } }