تكرار السؤال: …
الإجابة المختصرة
يحافظ GlobalKey على بقاء الـ Element وحالته (State) والـ RenderObject التابع له حياً حتى لو تغير موقعه بالكامل في شجرة الودجت (Reparenting)، لكنه مكلف جداً لأنه يسجل في جدول عالمي ويجبر المحرك على فحص الشجرة بالكامل.
الشرح
تعتمد الـ LocalKeys (مثل ValueKey) على مطابقة العناصر بين الإخوة فقط في نفس الـ Parent. بينما يسجل GlobalKey الـ Element التابع له في سجل عام يديره BuildOwner. عند نقل ويدجت يحمل GlobalKey إلى شجرة أخرى في نفس الفريم، يكتشف المحرك ذلك ويفصل الـ Element من موقعه القديم ويعيد ربطه في موقعه الجديد دون استدعاء dispose()، محافظاً على حالة المحتوى ومدخلات المستخدم. تكلفته تكمن في استهلاك الذاكرة وتأخير الـ reconciliation لأنه يتطلب O(N) traversal للتحقق من تفرد المفتاح والتعامل مع النقل.
مثال بالكود
// نقل نموذج معقد أو فيديو بلا انقطاع بين شاشتين أو مكانين في الشجرة:
final myGlobalKey = GlobalKey<FormState>();
// استخدام myGlobalKey.currentState يحفظ الإدخال حتى مع إعادة التموضعأخطاء شائعة
- إنشاء GlobalKey جديد داخل دالة build() مع كل إعادة رسم (مثل key = GlobalKey())، مما يدمر شجرة الـ Element مع كل فريم ويعيد إنشاء الحالة بالكامل.