// RateRiderWidget - Fixed version import 'dart:async'; import 'package:wanisdriver/utils/colors.dart'; import 'package:wanisdriver/widgets/custom_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:beemwidget/text_styles/beem_text_styles.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; import '../../Provider/RideStatusProvider.dart'; import '../../config/constants/app_constant.dart'; import '../../config/enum/ride_enum.dart'; class RateRiderWidget extends StatefulWidget { final String clientname; final String clientImage; final Function(int) onRatingSelected; final Function(int) onRateRider; RateRiderWidget({ required this.clientname, required this.clientImage, required this.onRatingSelected, required this.onRateRider, }); @override _RateRiderWidgetState createState() => _RateRiderWidgetState(); } class _RateRiderWidgetState extends State with WidgetsBindingObserver { int selectedRating = 0; bool _isActive = true; bool _hasPopped = false; // NEW: Prevent double popping @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); _listenToRideStatusChanges(); } void _listenToRideStatusChanges() { WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { context.read().addListener(_onRideStatusChanged); } }); } void _onRideStatusChanged() { if (!mounted || !_isActive || _hasPopped) return; // Check _hasPopped final rideStatus = context.read().ridestatus; if (rideStatus == RideEnum.idle) { _closeModal(); } } void _closeModal() { if (_isActive && mounted && Navigator.canPop(context) && !_hasPopped) { _hasPopped = true; // Mark as popped _isActive = false; // Use a small delay to ensure we're not in the middle of another navigation Future.microtask(() { if (mounted && Navigator.canPop(context)) { Navigator.of(context).pop(); } }); } } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); if (state == AppLifecycleState.paused || state == AppLifecycleState.inactive || state == AppLifecycleState.detached) { _closeModal(); } if (state == AppLifecycleState.resumed) { final rideStatus = context.read().ridestatus; if (rideStatus == RideEnum.idle) { _closeModal(); } } } @override void dispose() { _isActive = false; try { context.read().removeListener(_onRideStatusChanged); } catch (e) { // Provider might already be disposed } WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override Widget build(BuildContext context) { return Consumer( builder: (context, rideStatusProvider, child) { // Only schedule the close, don't do it synchronously in build if (rideStatusProvider.ridestatus == RideEnum.idle && _isActive && !_hasPopped) { WidgetsBinding.instance.addPostFrameCallback((_) { _closeModal(); }); } return WillPopScope( onWillPop: () async { _hasPopped = true; // Mark as manually popped _isActive = false; return true; // Allow the pop for rating modal }, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ // Star Rating Row Padding( padding: EdgeInsets.only(top: 5.sp, bottom: 8.0.sp), child: ClipOval( child: Image.network( '$mediaUrl${widget.clientImage}', width: 46.sp, height: 46.sp, fit: BoxFit.cover, errorBuilder: (_, __, ___) => Image.asset( 'assets/images/user_avatar.png', width: 46.sp, height: 46.sp, fit: BoxFit.cover, ), ), ), ), Row( mainAxisAlignment: MainAxisAlignment.center, children: List.generate(5, (index) { return GestureDetector( onTap: (_isActive && !_hasPopped) ? () { setState(() { selectedRating = index + 1; }); widget.onRatingSelected(selectedRating); } : null, child: Icon( Icons.star, color: index < selectedRating ? Color(0xffF74B01) : Colors.grey.shade400, size: 34, ), ); }), ), // Client Name Padding( padding: EdgeInsets.only(top: 5.sp, bottom: 5.sp), child: Text( widget.clientname, style: BeemTextStyles.poppinsBold24.copyWith( fontWeight: FontWeight.w400, color: Color(0xff7F7F7F) ), textAlign: TextAlign.center, ), ), const SizedBox(height: 16.0), // Rate Rider Button Padding( padding: EdgeInsets.only(left: 65.sp, right: 65.sp, bottom: 35.sp), child: GestureDetector( onTap: (_isActive && !_hasPopped) ? () { widget.onRateRider(selectedRating); } : null, child: Container( width: double.infinity, height: 44.sp, padding: const EdgeInsets.symmetric(vertical: 15.0, horizontal: 50.0), decoration: BoxDecoration( color: Theme.of(context).brightness == Brightness.dark ?AppColors.darkPrimaryColor:AppColors.primaryColor, borderRadius: BorderRadius.circular(30.0), ), child: Center( child: Txt( text: "Rate Rider", style: BeemTextStyles.poppinsRegular14.copyWith(color: Colors.white) ), ), ), ), ), ], ), ); }, ); } }