fix(apps): سقوط أصلي عند تحميل الخريطة — ستايل map-saas بلا sprite

## العطل
libc++abi: terminating due to uncaught exception of type std::domain_error
بلا أي استثناء دارتي — سقوط أصلي بحت بعد «Using remote style URL» مباشرة.

## السبب
فحص الستايل البعيد مباشرةً:
  /api/maps/style.json?theme=light → 68 طبقة، منها 12 طبقة symbol تستعمل
  icon-image، و **لا sprite معرَّف في الملف إطلاقاً**.
MapLibre الأصلي يرمي std::domain_error عند طبقة أيقونات بلا sprite تحلّها.

⚠️ الستايل المرفق بالحزمة نفسها مصابٌ بالعيب ذاته (sprite غائب + 12 طبقة)،
فلا الافتراضي ولا البعيد صالحان. ستايلها الليلي وحده سليم.

## العلاج
التحوّل إلى assets/style.json و assets/style_dark.json المنقولين من سيرو
الميداني: بهما sprite صحيح، وبلاطاتهما من tiles.intaleqapp.com نفسها،
ويقلعان بلا انتظار شبكة — وهو ما يعنيه «الشكل حتمي من أول إقلاع» (docs/26 §1).
نُسخ الملفان لتطبيق السائق أيضاً.

## الإصلاح الجذري (خادم، خارج هذا الكوميت)
إضافة sprite لستايل map-saas البعيد أو إزالة طبقات الأيقونات منه.

docs/23 §13 وُسّع بالقاعدة وسببها.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-08-05 01:51:03 +03:00
co-authored by Claude Opus 5
parent da5cfab38e
commit 6ea213629c
5 changed files with 4406 additions and 6 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -83,6 +83,10 @@ class _RideMapState extends State<RideMap> {
static const _fallback = im.LatLng(31.9539, 35.9106); // عمّان static const _fallback = im.LatLng(31.9539, 35.9106); // عمّان
/// الستايلان مرفقان في `assets/` — منقولان من سيرو الميداني.
static const _lightStyleAsset = 'assets/style.json';
static const _darkStyleAsset = 'assets/style_dark.json';
@override @override
void didUpdateWidget(RideMap old) { void didUpdateWidget(RideMap old) {
super.didUpdateWidget(old); super.didUpdateWidget(old);
@@ -200,9 +204,17 @@ class _RideMapState extends State<RideMap> {
// الخريطة تبدّل ستايلها مع الثيم — خريطة نهارية في وضع ليلي تكسر // الخريطة تبدّل ستايلها مع الثيم — خريطة نهارية في وضع ليلي تكسر
// الغرض (docs/26 §2). وتبديله يهدم مديري التعليقات، فيُصفَّر العَلَم. // الغرض (docs/26 §2). وتبديله يهدم مديري التعليقات، فيُصفَّر العَلَم.
final styleUrl = isDark //
? im.IntaleqStyles.obsidian(AppConfig.mapApiKey) // ⚠️ **ستايل محلّي لا بعيد.** ستايل map-saas البعيد
: im.IntaleqStyles.light(AppConfig.mapApiKey); // (`/api/maps/style.json?theme=light`) فيه **12 طبقة `symbol` تستعمل
// `icon-image` بلا `sprite` معرَّف** — وMapLibre الأصلي يرمي عندها
// `std::domain_error` فيُسقط التطبيق قبل أن يظهر إطار واحد
// (مثبت 2026-08-05). الستايلان المرفقان في `assets/` سليمان: بهما
// `sprite` وبلاطاتهما من `tiles.intaleqapp.com` نفسها.
//
// ومعها نكسب الإقلاع بلا انتظار شبكة — وهو ما يعنيه «الشكل حتمي من أول
// إقلاع» (docs/26 §1).
final styleUrl = isDark ? _darkStyleAsset : _lightStyleAsset;
if (_styleUrl != null && _styleUrl != styleUrl) _styleReady = false; if (_styleUrl != null && _styleUrl != styleUrl) _styleReady = false;
_styleUrl = styleUrl; _styleUrl = styleUrl;
@@ -83,6 +83,10 @@ class _RideMapState extends State<RideMap> {
static const _fallback = im.LatLng(31.9539, 35.9106); // عمّان static const _fallback = im.LatLng(31.9539, 35.9106); // عمّان
/// الستايلان مرفقان في `assets/` — منقولان من سيرو الميداني.
static const _lightStyleAsset = 'assets/style.json';
static const _darkStyleAsset = 'assets/style_dark.json';
@override @override
void didUpdateWidget(RideMap old) { void didUpdateWidget(RideMap old) {
super.didUpdateWidget(old); super.didUpdateWidget(old);
@@ -200,9 +204,17 @@ class _RideMapState extends State<RideMap> {
// الخريطة تبدّل ستايلها مع الثيم — خريطة نهارية في وضع ليلي تكسر // الخريطة تبدّل ستايلها مع الثيم — خريطة نهارية في وضع ليلي تكسر
// الغرض (docs/26 §2). وتبديله يهدم مديري التعليقات، فيُصفَّر العَلَم. // الغرض (docs/26 §2). وتبديله يهدم مديري التعليقات، فيُصفَّر العَلَم.
final styleUrl = isDark //
? im.IntaleqStyles.obsidian(AppConfig.mapApiKey) // ⚠️ **ستايل محلّي لا بعيد.** ستايل map-saas البعيد
: im.IntaleqStyles.light(AppConfig.mapApiKey); // (`/api/maps/style.json?theme=light`) فيه **12 طبقة `symbol` تستعمل
// `icon-image` بلا `sprite` معرَّف** — وMapLibre الأصلي يرمي عندها
// `std::domain_error` فيُسقط التطبيق قبل أن يظهر إطار واحد
// (مثبت 2026-08-05). الستايلان المرفقان في `assets/` سليمان: بهما
// `sprite` وبلاطاتهما من `tiles.intaleqapp.com` نفسها.
//
// ومعها نكسب الإقلاع بلا انتظار شبكة — وهو ما يعنيه «الشكل حتمي من أول
// إقلاع» (docs/26 §1).
final styleUrl = isDark ? _darkStyleAsset : _lightStyleAsset;
if (_styleUrl != null && _styleUrl != styleUrl) _styleReady = false; if (_styleUrl != null && _styleUrl != styleUrl) _styleReady = false;
_styleUrl = styleUrl; _styleUrl = styleUrl;
+20
View File
@@ -248,4 +248,24 @@ MapLibre يُنشئ «مديري التعليقات» عند تحميل الست
ثلاثة نداءات منصّة. حارس `_syncing` إلزامي وإلا تتكدّس النداءات وتلتهم ثلاثة نداءات منصّة. حارس `_syncing` إلزامي وإلا تتكدّس النداءات وتلتهم
الإطارات. الإطارات.
### الستايل محلّي لا بعيد
**ممنوع تمرير `IntaleqStyles.light()`/`obsidian()` (الستايل البعيد).**
ستايل map-saas البعيد `/api/maps/style.json?theme=light` فيه **12 طبقة
`symbol` تستعمل `icon-image` بلا `sprite` معرَّف**، وMapLibre الأصلي يرمي
عندها `std::domain_error` فيُسقط التطبيق قبل ظهور إطار واحد. مثبت بفحص
الستايل مباشرةً 2026-08-05.
⚠️ الستايل المرفق **بالحزمة نفسها** (`packages/intaleq_maps/assets/style.json`)
مصابٌ بالعيب ذاته — sprite غائب و12 طبقة أيقونات. الوضع الليلي المرفق بها
سليم. فلا يُعتمد على افتراضات الحزمة أيضاً.
**المعتمد**: `assets/style.json` و`assets/style_dark.json` المنقولان من سيرو
الميداني — بهما `sprite` صحيح، وبلاطاتهما من `tiles.intaleqapp.com` نفسها،
ويقلعان بلا انتظار شبكة (docs/26 §1).
**الإصلاح الجذري على الخادم** (لا يخصّ التطبيق): إضافة `sprite` لستايل
map-saas البعيد، أو إزالة طبقات الأيقونات منه.
المرجع العملي: `apps/rider_new/lib/features/trip/view/widgets/ride_map.dart`. المرجع العملي: `apps/rider_new/lib/features/trip/view/widgets/ride_map.dart`.