کیا پھڑپھڑانے کے لیے جاوا اسکرپٹ کی طرح کی بورڈ ایونٹس کو ریکارڈ کرنا اور روکنا ممکن ہے؟

Flutter

فلٹر اور جاوا اسکرپٹ میں عالمی شارٹ کٹ مینجمنٹ کو سمجھنا

کی بورڈ شارٹ کٹس کمانڈز تک فوری رسائی فراہم کرکے ایپلی کیشنز کے استعمال کو بہتر بنانے میں اہم کردار ادا کرتے ہیں۔ تاہم، ان کا نفاذ ہر پلیٹ فارم پر مختلف ہوتا ہے، جاوا اسکرپٹ جیسے فریم ورک کے ساتھ ایونٹ ہینڈلنگ کے لیے "کیپچر" اور "بلبل" ​​جیسے الگ الگ مراحل پیش کرتے ہیں۔ یہ مراحل ڈویلپرز کو عالمی شارٹ کٹس کی ترجیح کو مؤثر طریقے سے منظم کرنے کی اجازت دیتے ہیں۔

جاوا اسکرپٹ میں، "کیپچرنگ" مرحلہ یقینی بناتا ہے کہ اعلی ترجیحی شارٹ کٹس کو پہلے ہینڈل کیا جائے، جب کہ "بلبلنگ" مرحلہ یقینی بناتا ہے کہ صرف غیر ہینڈل شدہ واقعات عالمی شارٹ کٹس تک پہنچیں۔ یہ دوہرے مرحلے والا ایونٹ سسٹم لچک پیش کرتا ہے، جس سے سیاق و سباق کی بنیاد پر دوسروں کو موخر کرتے ہوئے بعض ان پٹس کو ترجیح دی جاتی ہے۔

فلٹر ڈویلپرز کے لیے، اسی طرح کا کنٹرول حاصل کرنا مشکل ہو سکتا ہے کیونکہ فلٹر جاوا اسکرپٹ جیسے "کیپچرنگ" یا "بلبلنگ" کے مراحل کو مقامی طور پر سپورٹ نہیں کرتا ہے۔ اس بارے میں سوالات اٹھتے ہیں کہ آیا Flutter's ویجیٹ ان طرز عمل کی تقلید کر سکتا ہے اور ویجیٹ ٹری کے اندر اعلی ترجیحی اور کم ترجیح والی عالمی شارٹ کٹ کیز کے درمیان فرق کیسے کر سکتا ہے۔

یہ مضمون اس بات کی کھوج کرتا ہے کہ آیا اور کیسے فلٹر ویجٹ جیسے وجیٹس کا استعمال کرتے ہوئے ان ایونٹ کے مراحل کو نقل کر سکتا ہے۔ . یہ کم ترجیحی شارٹ کٹس کو لاگو کرنے کے ممکنہ طریقوں پر بھی تبادلہ خیال کرتا ہے، اس بات کو یقینی بناتے ہوئے کہ کی بورڈ ایونٹس صرف اس وقت متحرک ہوں جب کوئی دوسرا ویجیٹ انہیں استعمال نہ کرے۔ آخر تک، آپ سمجھ جائیں گے کہ فلٹر میں کی بورڈ ایونٹس کو زیادہ مؤثر طریقے سے کیسے منظم کیا جائے۔

حکم استعمال کی مثال
Focus یہ ویجیٹ پورے ویجیٹ درخت میں کی بورڈ کے واقعات کو کیپچر کرتا ہے۔ روٹ ویجیٹ کو فوکس میں لپیٹ کر، آپ عالمی کلیدی واقعات کو دوسرے ویجیٹس کے سنبھالنے سے پہلے روک سکتے ہیں۔
LogicalKeyboardKey.escape کی بورڈ پر Escape کلید کی نمائندگی کرتا ہے۔ یہ پتہ لگانے کے لیے استعمال کیا جاتا ہے جب صارف دباتا ہے۔ کلید، فلٹر میں اعلی ترجیحی شارٹ کٹس کو فعال کرنا۔
KeyEventResult.handled یہ قدر ایونٹ کے مزید پھیلاؤ کو روکتی ہے، اس بات کی نشاندہی کرتی ہے کہ موجودہ ویجیٹ نے کی بورڈ ان پٹ کو ہینڈل کیا ہے، جیسا کہ JavaScript میں واقعات کیپچر کرنے کے مترادف ہے۔
FocusScope ایک ویجیٹ جو ویجٹ کے گروپ کے اندر فوکس کا انتظام کرتا ہے۔ یہ اس بات پر زیادہ درست کنٹرول کو قابل بناتا ہے کہ ویجیٹ کے ذیلی درخت کے اندر واقعات کو کہاں پروپیگنڈ کیا جاتا ہے۔
RawKeyDownEvent نچلی سطح کے کلیدی پریس ایونٹس کو کیپچر کرنے کے لیے استعمال ہونے والی ایک خصوصی ایونٹ کلاس۔ یہ یونٹ ٹیسٹ لکھنے کے لیے ضروری ہے جو کی بورڈ ان پٹ کی نقل کرتے ہیں۔
LogicalKeyboardKey.enter کی بورڈ ان پٹ ایونٹس میں Enter کلید کی شناخت کے لیے استعمال کیا جاتا ہے۔ کم ترجیحی شارٹ کٹس میں، یہ چیک کرتا ہے کہ آیا کلید کسی بھی عالمی کارروائی کو متحرک کرتی ہے۔
KeyEventResult.ignored یہ نتیجہ ایونٹ کو جاوا اسکرپٹ میں نظر آنے والے "بلبلنگ" مرحلے کی نقل کرتے ہوئے، دوسرے ویجٹس پر پروپیگنڈہ جاری رکھنے کی اجازت دیتا ہے۔
sendKeyEvent flutter_test پیکیج سے ایک فنکشن، جو یونٹ ٹیسٹ میں اہم واقعات کی نقل کرنے کے لیے استعمال ہوتا ہے۔ اس سے اس بات کی توثیق کرنے میں مدد ملتی ہے کہ مختلف ویجٹ کلیدی ان پٹ کو کس طرح جواب دیتے ہیں۔
autofocus ایک ایسی پراپرٹی جو فوکس یا فوکس اسکوپ ویجیٹ کو یقینی بناتی ہے جب ویجیٹ ٹری بن جاتا ہے تو فوری توجہ حاصل کر لیتی ہے۔ یہ عالمی شارٹ کٹ مینجمنٹ کے لیے اہم ہے۔

فوکس وجیٹس کا استعمال کرتے ہوئے پھڑپھڑانے میں کی بورڈ ایونٹ کے مراحل کو نافذ کرنا

پہلے حل میں، ہم نے فلٹر کا استعمال کیا۔ ویجیٹ ایونٹ ہینڈلنگ کے "کیپچرنگ" مرحلے کی تقلید کے لیے، جو کہ اعلیٰ ترجیحی عالمی شارٹ کٹس کو نافذ کرنے کے لیے اہم ہے۔ پورے ویجیٹ ٹری کو فوکس ویجیٹ کے ساتھ لپیٹ کر اور آٹو فوکس کو فعال کر کے، ہم اس بات کو یقینی بناتے ہیں کہ کی بورڈ ایونٹس کو جڑ میں پکڑ لیا جائے اس سے پہلے کہ کوئی بچہ ویجیٹ انہیں سنبھال سکے۔ یہ نقطہ نظر کلیدوں کو روکنے کے لئے موثر ہے۔ ، جو واقعہ کو فوری طور پر سنبھالتا ہے اور ویجیٹ ٹری کے اندر مزید پھیلاؤ کو روکتا ہے۔ اس کا کلیدی نتیجہ جاوا اسکرپٹ کے کیپچر مرحلے کی طرح عالمی کی بورڈ سننے والے کو حاصل کرنے کی صلاحیت ہے۔

دوسرا حل ملازمت کرتا ہے۔ جاوا اسکرپٹ میں "بلبلنگ" مرحلے کی نقل کرتے ہوئے، کم ترجیحی عالمی شارٹ کٹس کا انتظام کرنے کے لیے ویجیٹ۔ یہاں فرق یہ ہے کہ FocusScope واقعات کو ویجیٹ کے درخت کے نیچے پھیلانے کی اجازت دیتا ہے، ہر ویجیٹ کے پاس ایونٹ کا جواب دینے کا موقع ہوتا ہے۔ اگر کوئی ویجیٹ ایونٹ کو استعمال نہیں کرتا ہے، تو یہ فوکس اسکوپ پر واپس بلبلا جاتا ہے، عالمی شارٹ کٹ کو متحرک کرتا ہے۔ مثال کے طور پر، ENTER کلید کو دبانے سے شارٹ کٹ صرف اس صورت میں چلتا ہے جب کسی دوسرے ویجیٹ نے کلیدی ایونٹ کا استعمال نہ کیا ہو۔ یہ نقطہ نظر ایسے منظرناموں میں مفید ہے جہاں عالمی شارٹ کٹس کو صرف اس وقت متحرک کیا جانا چاہیے جب مقامی ان پٹ غیر فعال ہوں۔

ہمارا تیسرا حل استعمال کرتے ہوئے یونٹ ٹیسٹنگ متعارف کراتا ہے۔ اعلی ترجیحی اور کم ترجیحی کی بورڈ ایونٹ ہینڈلنگ دونوں کی توثیق کرنے کے لیے پیکیج۔ ہم اہم واقعات کی نقل کرتے ہیں، جیسے کہ ESC اور ENTER پریس، اس بات کو یقینی بنانے کے لیے کہ درست ویجیٹ انہیں توقع کے مطابق ہینڈل کرتا ہے۔ یہ نہ صرف فعالیت کی تصدیق کرتا ہے بلکہ یہ بھی یقینی بناتا ہے کہ ویجیٹ کا درجہ بندی مختلف حالات میں مناسب طریقے سے جواب دیتا ہے۔ یونٹ ٹیسٹ متنوع ماحول میں ایونٹ مینجمنٹ منطق کو برقرار رکھنے اور ویجیٹ کے درخت کے تبدیل ہونے پر رجعت کو روکنے کے لیے ضروری ہیں۔

کوڈ کی مثالیں بھی خصوصی کمانڈز کا استعمال کرتی ہیں۔ کلیدی آدانوں کی تقلید کے لیے اور ایونٹ کے بہاؤ کو منظم کرنے کے لئے. استعمال کرنا اس بات کو یقینی بناتا ہے کہ ضرورت پڑنے پر کوئی واقعہ پھیلنا بند کر دے، بالکل جاوا اسکرپٹ کے کیپچر فیز کی طرح۔ دوسری طرف، KeyEventResult.ignored ایونٹ کو پروپیگنڈہ جاری رکھنے کی اجازت دیتا ہے، جو ببلنگ فیز کے تصور کے مطابق ہوتا ہے۔ یہ میکانزم ڈویلپرز کو کی بورڈ ان پٹس کو درست طریقے سے ہینڈل کرنے کے قابل بناتے ہیں، فلٹر ایپلی کیشنز کے اندر اعلی ترجیحی اور کم ترجیحی شارٹ کٹس کے درمیان فرق کرنے کے لیے درکار لچک پیش کرتے ہیں۔

پھڑپھڑاہٹ میں کی بورڈ ایونٹس کے لیے کیپچرنگ اور بلبلنگ فیزز کی نقالی

گلوبل کی بورڈ شارٹ کٹ ہینڈلنگ کی نقل کرنے کے لیے فلٹر کے فوکس ویجیٹ کا استعمال

// Solution 1: High-priority shortcut using Focus widget
import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Focus(
        autofocus: true,
        onKey: (node, event) {
          if (event.isKeyPressed(LogicalKeyboardKey.escape)) {
            print('High-priority ESC pressed.');
            return KeyEventResult.handled;
          }
          return KeyEventResult.ignored;
        },
        child: HomeScreen(),
      ),
    );
  }
}
class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Flutter Global Shortcut')),
      body: Center(child: Text('Press ESC for high-priority action')),
    );
  }
}

فوکس اسکوپ اور پروپیگیشن کا استعمال کرتے ہوئے پھڑپھڑانے میں کم ترجیحی شارٹ کٹس کو ہینڈل کرنا

پروپیگنڈے اور اہم ایونٹ ہینڈلنگ کو کنٹرول کرنے کے لیے FocusScope کا استعمال

// Solution 2: Low-priority shortcut using FocusScope
import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FocusScope(
        autofocus: true,
        onKey: (node, event) {
          if (event.isKeyPressed(LogicalKeyboardKey.enter)) {
            print('Low-priority ENTER pressed.');
            return KeyEventResult.ignored; 
          }
          return KeyEventResult.ignored;
        },
        child: LowPriorityScreen(),
      ),
    );
  }
}
class LowPriorityScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Low-priority Shortcut Example')),
      body: Center(child: Text('Press ENTER for low-priority action')),
    );
  }
}

یونٹ ٹیسٹ کا استعمال کرتے ہوئے وجیٹس میں ایونٹ ہینڈلنگ کی جانچ کرنا

وجیٹس میں درست شارٹ کٹ رویے کو یقینی بنانے کے لیے ڈارٹ یونٹ ٹیسٹ کرتا ہے۔

// Solution 3: Unit tests for shortcut handling
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:my_app/main.dart';
void main() {
  testWidgets('High-priority shortcut test', (WidgetTester tester) async {
    await tester.pumpWidget(MyApp());
    final escEvent = RawKeyDownEvent(
      data: RawKeyEventDataAndroid(keyCode: 111),
      logicalKey: LogicalKeyboardKey.escape,
    );
    await tester.sendKeyEvent(escEvent);
    expect(find.text('High-priority ESC pressed.'), findsOneWidget);
  });
  testWidgets('Low-priority shortcut test', (WidgetTester tester) async {
    await tester.pumpWidget(MyApp());
    final enterEvent = RawKeyDownEvent(
      data: RawKeyEventDataAndroid(keyCode: 66),
      logicalKey: LogicalKeyboardKey.enter,
    );
    await tester.sendKeyEvent(enterEvent);
    expect(find.text('Low-priority ENTER pressed.'), findsOneWidget);
  });
}

پھڑپھڑاہٹ میں کی بورڈ ایونٹ ہینڈلنگ اور کارکردگی کو بڑھانا

استعمال کرنے سے آگے اور , Flutter کی بورڈ ایونٹ ہینڈلنگ کو بڑھانے کے لیے دیگر مفید میکانزم فراہم کرتا ہے، جیسے اور اعمال. یہ ویجٹ ویجیٹ کے درخت کو بے ترتیبی کے بغیر اعمال کے لیے مخصوص کلیدی مجموعوں کی نقشہ سازی کے قابل بناتے ہیں۔ یہ خاص طور پر مفید ہے جب ایپلیکیشن کو مختلف اجزاء میں مختلف کلیدوں کا مختلف جواب دینے کی ضرورت ہو۔ ان ویجٹس کا استعمال یقینی بناتا ہے کہ شارٹ کٹ الگ تھلگ ہیں اور کوڈ بیس کے دیگر حصوں کو متاثر کیے بغیر آسانی سے منظم یا اپ ڈیٹ کیا جا سکتا ہے۔

عالمی شارٹ کٹس کو سنبھالتے وقت ایک اور اہم غور کارکردگی کی اصلاح کو یقینی بنانا ہے۔ جب ویجیٹ کا درخت بڑا ہوتا ہے، تو عالمی سطح پر ہر اہم ایونٹ کو سنبھالنا کارکردگی میں معمولی کمی کا سبب بن سکتا ہے۔ پھڑپھڑانے والے ڈویلپر احتیاط سے یہ فیصلہ کر کے اسے کم کر سکتے ہیں کہ کہاں رکھنا ہے۔ اور غیر ضروری ایونٹ ہینڈلنگ کو کم کرنے کے لیے ویجٹ۔ مثال کے طور پر، پورے درخت کو ایک سنگل میں لپیٹنے کے بجائے فوکس ویجیٹ، چھوٹے، مقامی فوکس ویجٹ کو اہم مقامات پر رکھنا فعالیت اور کارکردگی کے درمیان صحیح توازن قائم کر سکتا ہے۔

پھڑپھڑاہٹ بھی سپورٹ کرتی ہے۔ نچلے درجے کے کی بورڈ ان پٹ کے لیے، زیادہ دانے دار کنٹرول فراہم کرتا ہے۔ یہ ویجیٹ آپریٹنگ سسٹم کے کی بورڈ ایونٹس تک براہ راست رسائی فراہم کرتا ہے، جو ایسے ایپس کی تعمیر کے وقت کارآمد ثابت ہو سکتا ہے جن کے لیے انتہائی حسب ضرورت رویے کی ضرورت ہوتی ہے، جیسے کہ گیمنگ یا ایکسیسبیلٹی ٹولز۔ ایسی صورتوں میں، RawKeyboardListener کو ایکشن کے ساتھ جوڑنے سے ڈویلپرز کو معیاری اور غیر معیاری دونوں طرح کے کی بورڈ ان پٹ کے جوابات کو حسب ضرورت بنانے کی اجازت دیتا ہے، جس سے ان پٹ مینجمنٹ پر زیادہ سے زیادہ کنٹرول کو یقینی بنایا جا سکتا ہے۔

  1. آپ کس طرح استعمال کرتے ہیں اور پھڑپھڑاہٹ میں؟
  2. دی ویجیٹ کلیدی امتزاج کو ارادوں کے لیے نقشہ بناتا ہے، جن پر عمل درآمد ہوتا ہے۔ ویجیٹ یہ مجموعہ پورے ایپ میں کی بورڈ شارٹ کٹس کے ماڈیولر ہینڈلنگ کی اجازت دیتا ہے۔
  3. کا مقصد کیا ہے پھڑپھڑاہٹ میں؟
  4. دی ویجیٹ خام کلیدی واقعات کو پکڑتا ہے، زیادہ حسب ضرورت ان پٹ ہینڈلنگ کے لیے اہم پریس ایونٹس تک کم سطح تک رسائی فراہم کرتا ہے۔
  5. متعدد کر سکتے ہیں۔ ویجٹ ایک ہی ویجیٹ درخت میں موجود ہیں؟
  6. ہاں، متعدد وجیٹس کو حکمت عملی کے ساتھ رکھا جا سکتا ہے تاکہ یہ یقینی بنایا جا سکے کہ ایپ کے کچھ حصے سیاق و سباق کی بنیاد پر اہم واقعات کا مختلف طریقے سے جواب دیتے ہیں۔
  7. اگر نہیں تو کیا ہوگا؟ ایک ویجیٹ سے واپس کیا جاتا ہے؟
  8. اگر کوئی ویجیٹ لوٹتا ہے۔ , واقعہ جاوا اسکرپٹ میں دیکھے گئے بلبلنگ مرحلے کی نقل کرتے ہوئے پروپیگنڈہ جاری رکھے ہوئے ہے۔
  9. کیسے کرتا ہے شارٹ کٹ ہینڈلنگ کو بہتر بنائیں؟
  10. جب ایک ویجیٹ کو آٹو فوکس پر سیٹ کیا گیا ہے، جب ایپ شروع ہوتی ہے تو یہ فوری توجہ حاصل کرتا ہے، اس بات کو یقینی بناتا ہے کہ اہم واقعات شروع سے ہی کیپچر کیے گئے ہیں۔
  11. استعمال کرنے کا کیا فائدہ ہے۔ ایک باقاعدہ سے زیادہ ویجیٹ
  12. متعدد کا انتظام کرتا ہے۔ ویجیٹس، بہتر تنظیم اور کنٹرول کی اجازت دیتے ہیں جہاں ویجیٹ گروپ میں فوکس رہتا ہے۔
  13. کیا فلٹر پلیٹ فارم سے متعلق اہم واقعات کو سنبھال سکتا ہے؟
  14. جی ہاں، استعمال کرتے ہوئے یا ، پھڑپھڑانا پلیٹ فارم کے ساتھ مخصوص کلیدی واقعات کو پکڑ سکتا ہے، جیسے خصوصی فنکشن کیز۔
  15. کارکردگی عالمی کی بورڈ شارٹ کٹ ہینڈلنگ کو کیسے متاثر کرتی ہے؟
  16. بہت زیادہ عالمی سامعین رکھنے سے کارکردگی سست ہو سکتی ہے۔ ڈویلپرز کو حکمت عملی کے ساتھ جگہ دینا چاہئے۔ اور غیر ضروری ایونٹ ہینڈلنگ سے بچنے کے لیے ویجٹ۔
  17. Flutter میں کی بورڈ ایونٹس کو جانچنے کے بہترین طریقے کیا ہیں؟
  18. استعمال کریں۔ یونٹ ٹیسٹ بنانے کے لیے جو اہم واقعات کی نقالی کرتے ہیں۔ یہ اس بات کو یقینی بناتا ہے کہ ایپلی کیشن کی ایونٹ ہینڈلنگ منطق مختلف منظرناموں میں توقع کے مطابق کام کرتی ہے۔
  19. کیا میں ایک اہم واقعہ کو سنبھالنے کے بعد واقعہ کے پھیلاؤ کو روک سکتا ہوں؟
  20. جی ہاں، واپسی سے ہینڈلر ایونٹ کے مزید پھیلاؤ کو روکتا ہے۔

دی ویجیٹ عالمی سطح پر اعلیٰ ترجیحی واقعات کو کیپچر کرنے کا ایک بہترین طریقہ ہے، اس بات کو یقینی بناتا ہے کہ Escape کلید جیسے شارٹ کٹس کو اوپر کی سطح پر ہینڈل کیا جائے۔ یہ خاص طور پر ان ایپلی کیشنز کے لیے مفید ہے جو فوری رسائی کے حکموں پر انحصار کرتی ہیں یا کسی دوسرے ویجٹ پر ردعمل ظاہر کرنے سے پہلے مخصوص کلیدی ان پٹس کو روکنے کی ضرورت ہوتی ہے۔

دوسری طرف، کم ترجیحی شارٹ کٹس کے لیے، استعمال کرنا یا واقعات کو پھیلانے کی اجازت دینا JavaScript کے بلبلنگ مرحلے کی نقل کرتا ہے۔ یہ اس بات کو یقینی بناتا ہے کہ کی بورڈ ایونٹس پر صرف اس صورت میں کارروائی ہوتی ہے جب کوئی دوسرا ویجیٹ انہیں پہلے استعمال نہ کرے۔ اگرچہ پھڑپھڑ براہ راست واقعات کے مراحل کی حمایت نہیں کرتی ہے، لیکن یہ میکانزم اسی طرح کے رویے کے لیے عملی متبادل پیش کرتے ہیں۔

  1. پر تفصیلی دستاویزات اور سرکاری فلٹر فریم ورک سے: فلٹر API دستاویزات
  2. استعمال کرتے ہوئے پھڑپھڑانے میں خام اہم واقعات سے نمٹنے کے بارے میں بصیرت : فلٹر کک بک
  3. جاوا اسکرپٹ کے ایونٹ کے مراحل اور فلٹر کے ایونٹ ہینڈلنگ کے درمیان موازنہ: MDN ویب دستاویزات
  4. پھڑپھڑانے کی جانچ کے بہترین طریقے، بشمول ان پٹ واقعات کی تقلید کے لیے: پھڑپھڑانے کی جانچ کی دستاویزات
  5. جاوا اسکرپٹ کے ایونٹ پروپیگیشن ماڈل کی مثالوں کے ساتھ وضاحت کی گئی: JavaScript.info