64 lines
2.2 KiB
Dart
64 lines
2.2 KiB
Dart
import 'dart:async';
|
|
import 'package:app_links/app_links.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
|
|
|
class DeepLinkController extends GetxController {
|
|
// استخدم AppLinks للتعامل مع الروابط
|
|
final _appLinks = AppLinks();
|
|
StreamSubscription<Uri>? _linkSubscription;
|
|
|
|
// متغير لتخزين الإحداثيات القادمة من الرابط
|
|
final Rx<LatLng?> deepLinkLatLng = Rx<LatLng?>(null);
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
// ابدأ بالاستماع للروابط عند تشغيل التطبيق
|
|
initDeepLinks();
|
|
}
|
|
|
|
Future<void> initDeepLinks() async {
|
|
// الاستماع إلى الروابط القادمة
|
|
_linkSubscription = _appLinks.uriLinkStream.listen((uri) {
|
|
print('Received deep link: $uri');
|
|
_handleLink(uri);
|
|
});
|
|
|
|
// جلب الرابط الأولي الذي قد يكون فتح التطبيق
|
|
final initialUri = await _appLinks.getInitialLink();
|
|
if (initialUri != null) {
|
|
print('Received initial deep link: $initialUri');
|
|
_handleLink(initialUri);
|
|
}
|
|
}
|
|
|
|
void _handleLink(Uri uri) {
|
|
// تحقق من أن الرابط يتبع النمط المتوقع (مثال: intaleq://route?lat=xx&lng=yy)
|
|
if (uri.scheme == 'intaleq' && uri.host == 'route') {
|
|
// استخراج خطوط الطول والعرض من الرابط
|
|
final latString = uri.queryParameters['lat'];
|
|
final lngString = uri.queryParameters['lng'];
|
|
|
|
if (latString != null && lngString != null) {
|
|
final double? lat = double.tryParse(latString);
|
|
final double? lng = double.tryParse(lngString);
|
|
|
|
if (lat != null && lng != null) {
|
|
// إذا كانت الإحداثيات صالحة، قم بتحديث المتغير
|
|
// ستستمع وحدة التحكم في الخريطة لهذا التغيير
|
|
deepLinkLatLng.value = LatLng(lat, lng);
|
|
print('Parsed LatLng from deep link: ${deepLinkLatLng.value}');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
void onClose() {
|
|
// تأكد من إلغاء الاشتراك عند إغلاق وحدة التحكم
|
|
_linkSubscription?.cancel();
|
|
super.onClose();
|
|
}
|
|
}
|