25-10-11/1
This commit is contained in:
@@ -45,6 +45,7 @@ class HomeCaptain extends StatelessWidget {
|
||||
checkForUpdate(context);
|
||||
getPermissionOverlay();
|
||||
showDriverGiftClaim(context);
|
||||
checkForAppliedRide(context);
|
||||
});
|
||||
|
||||
// The stack is now even simpler.
|
||||
@@ -187,11 +188,38 @@ class _MapView extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final locationController = Get.find<LocationController>();
|
||||
return GetBuilder<HomeCaptainController>(builder: (controller) {
|
||||
return controller.isLoading
|
||||
? const MyCircularProgressIndicator()
|
||||
: GoogleMap(
|
||||
// جلب الكونترولر الرئيسي
|
||||
final homeController = Get.find<HomeCaptainController>();
|
||||
|
||||
return GetBuilder<HomeCaptainController>(
|
||||
builder: (controller) {
|
||||
if (controller.isLoading) {
|
||||
return const MyCircularProgressIndicator();
|
||||
}
|
||||
|
||||
// --- هذا هو التعديل ---
|
||||
// هذا الـ Builder يستمع إلى تحديثات الموقع
|
||||
return GetBuilder<LocationController>(
|
||||
builder: (locationController) {
|
||||
// --- هذا هو الكود الجديد ---
|
||||
// نقوم بتحريك الكاميرا يدوياً عند كل تحديث للموقع
|
||||
if (homeController.mapHomeCaptainController != null &&
|
||||
homeController.isActive) {
|
||||
homeController.mapHomeCaptainController!.animateCamera(
|
||||
CameraUpdate.newCameraPosition(
|
||||
CameraPosition(
|
||||
target: locationController.myLocation, // الموقع الجديد
|
||||
zoom: 17.5, // تقريب لمتابعة السائق
|
||||
tilt: 50.0, // زاوية رؤية 3D
|
||||
bearing: locationController.heading, // اتجاه السيارة
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
// --- نهاية الكود الجديد ---
|
||||
|
||||
// إرجاع الخريطة
|
||||
return GoogleMap(
|
||||
padding: const EdgeInsets.only(bottom: 110, top: 300),
|
||||
fortyFiveDegreeImageryEnabled: true,
|
||||
onMapCreated: controller.onMapCreated,
|
||||
@@ -200,19 +228,12 @@ class _MapView extends StatelessWidget {
|
||||
target: locationController.myLocation,
|
||||
zoom: 15,
|
||||
),
|
||||
onCameraMove: (position) {
|
||||
CameraPosition(
|
||||
target: locationController.myLocation,
|
||||
zoom: 17.5,
|
||||
tilt: 50.0,
|
||||
bearing: locationController.heading,
|
||||
);
|
||||
},
|
||||
// --- تم حذف onCameraMove الخاطئ ---
|
||||
markers: {
|
||||
Marker(
|
||||
markerId: MarkerId('MyLocation'.tr),
|
||||
position: locationController.myLocation,
|
||||
rotation: locationController.heading,
|
||||
position: locationController.myLocation, // يتم تحديثه من هنا
|
||||
rotation: locationController.heading, // يتم تحديثه من هنا
|
||||
flat: true,
|
||||
anchor: const Offset(0.5, 0.5),
|
||||
icon: controller.carIcon,
|
||||
@@ -222,12 +243,15 @@ class _MapView extends StatelessWidget {
|
||||
myLocationButtonEnabled: false,
|
||||
myLocationEnabled: false,
|
||||
trafficEnabled: controller.mapTrafficON,
|
||||
buildingsEnabled: true,
|
||||
buildingsEnabled: false,
|
||||
mapToolbarEnabled: false,
|
||||
compassEnabled: true,
|
||||
compassEnabled: false,
|
||||
zoomControlsEnabled: false,
|
||||
);
|
||||
});
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,3 +605,7 @@ class FloatingActionButtons extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> checkForAppliedRide(BuildContext context) async {
|
||||
checkForPendingOrderFromServer();
|
||||
}
|
||||
|
||||
83
lib/views/home/Captin/home_captain/osm_view_map.dart
Normal file
83
lib/views/home/Captin/home_captain/osm_view_map.dart
Normal file
@@ -0,0 +1,83 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
|
||||
import '../../../../controller/functions/location_controller.dart';
|
||||
import '../../../../controller/home/captin/home_captain_controller.dart';
|
||||
// هذه ويدجت بديلة للـ _MapView في الكود الخاص بك
|
||||
// V3 - MapView Replacement using flutter_map
|
||||
|
||||
class OsmMapView extends StatelessWidget {
|
||||
const OsmMapView({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// افترض أنك تحصل على الموقع والاتجاه بنفس الطريقة من الكونترولر
|
||||
final LocationController locationController =
|
||||
Get.find<LocationController>();
|
||||
final HomeCaptainController homeCaptainController =
|
||||
Get.find<HomeCaptainController>();
|
||||
|
||||
// يمكنك استخدام GetBuilder لمراقبة التغييرات في الموقع
|
||||
return Obx(() {
|
||||
final LatLng currentLocation = LatLng(
|
||||
locationController.myLocation.latitude,
|
||||
locationController.myLocation.longitude);
|
||||
final double currentHeading = locationController.heading;
|
||||
|
||||
return FlutterMap(
|
||||
// يمكنك ربط هذا بـ MapController الخاص بـ flutter_map
|
||||
// mapController: homeCaptainController.flutterMapController,
|
||||
options: MapOptions(
|
||||
initialCenter: currentLocation,
|
||||
initialZoom: 15,
|
||||
maxZoom: 18,
|
||||
minZoom: 6,
|
||||
// تدوير الخريطة (اختياري)
|
||||
initialRotation: currentHeading,
|
||||
),
|
||||
children: [
|
||||
// 1. طبقة الخريطة الأساسية (Tiles)
|
||||
// هذا هو الرابط لخرائط OSM الأساسية
|
||||
TileLayer(
|
||||
urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||
subdomains: ['a', 'b', 'c'],
|
||||
userAgentPackageName:
|
||||
'com.example.app', // استبدل باسم الباكج الخاص بك
|
||||
|
||||
// لاستخدام الخرائط الأوفلاين (بعد إعداد flutter_map_tile_caching)
|
||||
// tileProvider: CachedTileProvider(),
|
||||
),
|
||||
|
||||
// 2. طبقة العلامات (Markers)
|
||||
MarkerLayer(
|
||||
markers: [
|
||||
Marker(
|
||||
width: 80.0,
|
||||
height: 80.0,
|
||||
point: currentLocation,
|
||||
child: Transform.rotate(
|
||||
angle: currentHeading *
|
||||
(3.1415926535 / 180), // تحويل من درجات إلى راديان
|
||||
child: Image.asset(
|
||||
'assets/images/car_icon.png', // تأكد أن لديك أيقونة السيارة
|
||||
// يمكنك استخدام نفس الـ carIcon من الكونترولر
|
||||
// icon: homeCaptainController.carIcon, (ملاحظة: flutter_map تستخدم ويدجت)
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
// يمكنك إضافة طبقات أخرى هنا (مثل الخطوط Polylines أو المضلعات Polygons)
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// ملاحظة: ستحتاج إلى تعديل بسيط في HomeCaptainController
|
||||
// لإنشاء MapController الخاص بـ flutter_map بدلاً من GoogleMapController
|
||||
// import 'package:flutter_map/flutter_map.dart';
|
||||
// MapController flutterMapController = MapController();
|
||||
@@ -237,8 +237,10 @@ Future<void> checkForPendingOrderFromServer() async {
|
||||
// MyDialog().getDialog(orderId.toString(), customerToken, () {});
|
||||
|
||||
// Now proceed with the UI flow
|
||||
_sendAcceptanceNotification(customerToken, orderId.toString());
|
||||
// _sendAcceptanceNotification(customerToken, orderId.toString());
|
||||
// await _bringAppToForegroundAndNavigate(orderId);
|
||||
Get.to(() => PassengerLocationMapPage(),
|
||||
arguments: box.read(BoxName.rideArgumentsFromBackground));
|
||||
} else {
|
||||
box.write(BoxName.rideArgumentsFromBackground, 'failure');
|
||||
}
|
||||
@@ -307,8 +309,7 @@ Map<String, dynamic> _transformServerDataToAppArguments(
|
||||
void _sendAcceptanceNotification(String? customerToken, rideId) {
|
||||
try {
|
||||
if (customerToken == null) return;
|
||||
final FirebaseMessagesController _firebaseMessagesController =
|
||||
Get.put(FirebaseMessagesController());
|
||||
|
||||
List<String> bodyToPassenger = [
|
||||
box.read(BoxName.driverID).toString(),
|
||||
box.read(BoxName.nameDriver).toString(),
|
||||
@@ -319,15 +320,13 @@ void _sendAcceptanceNotification(String? customerToken, rideId) {
|
||||
// Safely check for customer token
|
||||
final String? token = customerToken;
|
||||
if (token != null && token.isNotEmpty) {
|
||||
// _firebaseMessagesController.sendNotificationToDriverMAP('Accepted Ride',
|
||||
// 'your ride is applied'.tr, token, bodyToPassenger, 'start.wav');
|
||||
NotificationService.sendNotification(
|
||||
target: token.toString(),
|
||||
title: 'Accepted Ride',
|
||||
title: 'Accepted Ride'.tr,
|
||||
body: 'your ride is Accepted'.tr,
|
||||
isTopic: false, // Important: this is a token
|
||||
tone: 'start',
|
||||
driverList: [],
|
||||
driverList: bodyToPassenger, category: 'Accepted Ride',
|
||||
);
|
||||
} else {}
|
||||
} catch (e) {}
|
||||
|
||||
Reference in New Issue
Block a user