ensureQpcV4AllPagesPrebuilt method
يبني كل صفحات QPC v4 مرة واحدة لتجنّب التقطيع أثناء التقليب.
ملاحظة: التنفيذ يتم على دفعات مع yield لتفادي تجميد واجهة المستخدم.
Implementation
Future<void> ensureQpcV4AllPagesPrebuilt() async {
if (!isQpcV4Enabled) return;
await _ensureQpcV4AssetsLoaded();
final renderer = _qpcV4PageRenderer;
if (renderer == null) return;
// لا تعِد البناء إن تم البدء/الاكتمال.
if (_qpcV4PrebuildAllFuture != null) {
await _qpcV4PrebuildAllFuture;
return;
}
_qpcV4PrebuildAllFuture = () async {
if (_qpcV4BlocksByPage.length >= 604) return;
_qpcV4PrebuildStarted = true;
// نبني بزمن-ميزانية صغيرة مع تأخير بسيط لتقليل منافسة الـ UI أثناء الاستخدام.
const totalPages = 604;
const timeBudgetMs = 3;
final sw = Stopwatch()..start();
for (var page = 1; page <= totalPages; page++) {
if (!isQpcV4Enabled) break;
if (_qpcV4BlocksByPage.containsKey(page)) continue;
_qpcV4BlocksByPage[page] = renderer.buildPage(pageNumber: page);
if (sw.elapsedMilliseconds >= timeBudgetMs) {
// yield إلى event loop (مع تأخير بسيط) حتى لا ننافس الرسم/الـ gestures.
await Future<void>.delayed(const Duration(milliseconds: 4));
sw
..reset()
..start();
}
}
// لا حاجة لـ update() هنا: الصفحات المعروضة تمت تغذيتها بالفعل عبر prewarmQpcV4Pages.
// الصفحات البعيدة ستحصل على البيانات عند التقليب إليها.
}();
await _qpcV4PrebuildAllFuture;
}