Update: 2026-08-03 13:10:56

This commit is contained in:
Hamza-Ayed
2026-08-03 13:10:57 +03:00
parent f36b30f0b8
commit b60129d246
4 changed files with 45 additions and 7 deletions
@@ -12,6 +12,19 @@ class CaptainAdminController extends GetxController {
bool isLoading = false;
Map captainData = {};
Map captain = {};
/// قائمة الكباتن مهما كان شكل الغلاف.
/// AdminCaptain/get.php يُرجع {"message":{"data":[...]}} بينما نقاط أخرى
/// تُرجع {"message":[...]} مباشرة. الاعتماد على شكل واحد كان يجعل
/// `captainData['message'].length` تقرأ عدد مفاتيح الخريطة (1) بدل عدد
/// الكباتن، و`[0]['id']` تنهار على null.
List<dynamic> get captains {
final m = captainData['message'];
if (m is List) return m;
if (m is Map && m['data'] is List) return m['data'] as List;
if (m is Map) return [m];
return const [];
}
final captainController = TextEditingController();
final captainPrizeController = TextEditingController();
final titleNotify = TextEditingController();
@@ -70,16 +83,16 @@ class CaptainAdminController extends GetxController {
Future addCaptainPrizeToWallet() async {
String? paymentId;
//todo link to add wallet to captain
for (var i = 0; i < captainData['message'].length; i++) {
for (var i = 0; i < captains.length; i++) {
await CRUD().post(link: AppLink.addDriverPaymentPoints, payload: {
'driverID': captainData['message'][i]['id'],
'driverID': captains[i]['id'],
'amount': captainPrizeController.text,
'paymentMethod': 'Prize',
}).then((value) {
paymentId = value['message'].toString();
});
await CRUD().post(link: AppLink.addPassengersWallet, payload: {
'driverID': captainData['message'][i]['id'],
'driverID': captains[i]['id'],
'amount': captainPrizeController.text,
'paymentMethod': 'Prize',
'paymentID': paymentId.toString(),
@@ -40,8 +40,22 @@ class CaptainsPage extends StatelessWidget {
return _buildEmptyState(cs);
}
final List<dynamic> captains =
message is List ? message : [message];
// AdminCaptain/get.php يغلّف النتيجة مرّتين:
// {"status":"success","message":{"data":[ ...الكباتن... ]}}
// الشرط السابق كان `message is List ? message : [message]`،
// فيلفّ الخريطة نفسها في قائمة من عنصر واحد. النتيجة بطاقة
// واحدة كل حقولها null — وهو سبب اختفاء الاسم والهاتف،
// لا خطأ في فك التشفير.
final List<dynamic> captains;
if (message is List) {
captains = message;
} else if (message is Map && message['data'] is List) {
captains = message['data'];
} else if (message is Map) {
captains = [message];
} else {
captains = const [];
}
if (captains.isEmpty) {
return _buildEmptyState(cs);
@@ -35,7 +35,12 @@ class _HeatmapPageState extends State<HeatmapPage> {
@override
void initState() {
super.initState();
_fetchHeatmapData();
// _fetchHeatmapData يقرأ Theme.of(context) لتلوين العلامات، وهذا ممنوع
// قبل اكتمال initState (يرمي dependOnInheritedWidgetOfExactType).
// التأجيل إلى ما بعد أول إطار يضمن جاهزية الشجرة.
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) _fetchHeatmapData();
});
}
Future<void> _fetchHeatmapData() async {