التعامل مع JavaScript إلى Dart Communication في Flutter WebView
قد يتطلب تجميع تطبيق مختلط دمج JavaScript وFlutter عبر WebView. يعد نقل البيانات من JavaScript إلى Dart إحدى المهام المتكررة التي تتيح الاتصال السلس بين البيئتين.
يشرح هذا المنشور كيفية استخدام قناة JavaScript الخاصة بمكون Flutter WebView الإضافي لنقل العديد من المعلمات من JavaScript إلى Dart. سنركز بشكل خاص على الموقف الذي تكون فيه حجتان، على سبيل المثال س و ذ، يتم إرسالها إلى Dart بواسطة وظيفة JavaScript باستخدام الملف setPosition قناة.
على الرغم من أنه يمكن إرسال البيانات من JavaScript باستخدام بريد الرسالة ()فمن الضروري التعامل مع هذه الرسائل بشكل صحيح في Dart لضمان عمل الاتصال على النحو المنشود. تتطلب المعالجة الفعالة للبيانات معرفة كيفية استخدام Dart onMessageReceived وظيفة للقيام بذلك.
لست وحدك إذا حاولت البحث في الإنترنت عن الإجابات ولكنك لم تجد الكثير. سنتناول الكثير من التفاصيل وسنقدم لك طريقة خطوة بخطوة لإنشاء خط أنابيب الاتصال هذا في هذه المقالة.
يأمر | مثال للاستخدام |
---|---|
postMessage() | الغرض من طريقة JavaScript هذه هو نقل الرسائل بين عدة سياقات. هنا، يتم استخدامه لنقل البيانات عبر قناة جافا سكريبت إلى الجانب Dart من Flutter WebView من محتوى الويب (في هذا المثال، JavaScript). |
jsonDecode() | تم العثور على وظيفة Dart التي تقوم بتوزيع سلسلة مشفرة باستخدام JSON وتحويلها إلى خريطة أو قائمة Dart في حزمة Dart:convert. من أجل استرداد البيانات مثل س و ذ، فهو يساعد في فك التشفير رسالة جيسون وردت من جافا سكريبت. |
JavascriptChannel | هذه فئة Flutter تسهل الاتصال بين كود Dart وJavaScript الذي يتم تنفيذه داخل WebView. عندما تصل الرسائل من جانب جافا سكريبت، فإن ملف قناة جافا سكريبت يستمع لهم ويتعامل معهم في دارت. |
onMessageReceived | رد الاتصال الذي يتم تشغيله في قناة جافا سكريبت عند تلقي رسالة من جافا سكريبت. فهو يدير الرسالة الواردة وينفذ عمليات معالجة البيانات، بما في ذلك تحليل JSON أو استخدام الوسائط المقدمة له. |
navigationDelegate | خاصية Dart التي تسمح لـ عرض ويب القطعة للتحكم واعتراض الأحداث المتعلقة بالتنقل. فهو يمكّنك من تسجيل تغييرات عنوان URL (على سبيل المثال، عند إرسال المعلمات باستخدام أنظمة URL المخصصة). |
Uri.queryParameters | في Dart، تسترد هذه الخاصية معلمات الاستعلام من عنوان URL. يمكنك الوصول إلى البيانات المقدمة كمعلمات في عنوان URL، مثل س و ذ، عند استخدام نظام URL مخصص. |
NavigationDecision.prevent | قيمة الإرجاع التي navigationDelegate يستخدم لإيقاف WebView من التنقل. عند إدارة الوسائط واعتراض تغيير عنوان URL دون مغادرة الصفحة الحالية، يكون ذلك مفيدًا. |
JavascriptMessage | فئة Dart التي تتلقى الرسائل المرسلة عبر قناة جافا سكريبت من جافا سكريبت إلى دارت. سلسلة الرسالة موجودة هناك، جاهزة للمعالجة أو فك التشفير حسب الحاجة. |
WebView | ال عرض ويب تُستخدم الأداة في تطبيقات Flutter لعرض محتوى الويب. فهو يجعل قنوات JavaScript قابلة للوصول، مما يتيح الاتصال ثنائي الاتجاه بين التعليمات البرمجية الأصلية والويب. |
دمج JavaScript وDart Communication في Flutter WebView
يوضح حلنا المطور كيفية استخدام أ قناة جافا سكريبت لنقل العديد من الحجج من جافا سكريبت إلى Dart عبر WebView الخاص بـFlutter. الهدف الأساسي هو إنشاء خط أنابيب يمكن الاعتماد عليه للاتصال بين كود Dart وJavaScript الذي يتم تشغيله في WebView. ال بريد الرسالة () يتم استخدام الطريقة بواسطة وظيفة JavaScript لإرسال معلمتين (x وy)، والتي يتم استلامها لاحقًا بواسطة Dart عبر رد الاتصال onMessageReceived. باستخدام هذا التكوين، قد يتم نقل المعلومات المهمة بشكل فعال من محتوى الويب إلى كود Dart الأصلي.
باستخدام جسونديكود () وظيفة، نقوم بفك تشفير الرسالة المستلمة على جانب Dart. نتأكد من إمكانية إرسال العديد من المعلمات بطريقة منظمة عن طريق نقل بيانات JSON من JavaScript. بعد فك التشفير، يستطيع Dart استرجاع القيم الفردية (x وy) واستخدامها لأي غرض. يتضمن ذلك تسجيل المعلومات وتعديل عناصر واجهة المستخدم وتنفيذ مهام أخرى تعتمد على القيم التي تم الحصول عليها. تضمن هذه الطريقة انخفاض الحمل عند إرسال بنيات البيانات المعقدة من JavaScript إلى Dart.
وبصرف النظر عن إدارة الرسائل مباشرة، فقد بحثنا أيضًا في نهج مختلف يتضمن استخدام أنظمة عناوين URL فريدة. يمكننا نقل المعلمات عبر عنوان URL عن طريق تغيير ملف window.location.href في جافا سكريبت. يمكن لـ Dart بعد ذلك اعتراض هذه البيانات باستخدام ملف navigationDelegate. عند استخدام قناة جافا سكريبت قد لا يكون ذلك ممكنًا أو عندما يكون الاتصال المستند إلى عنوان URL أكثر منطقية نظرًا لتصميم البرنامج، فقد يكون هذا الأسلوب مفيدًا. بعد ذلك، يقوم Dart بتحليل عنوان URL واستخدام الملف Uri.queryParameters وظيفة لاستخراج المعلمات مثل x و y. وهذا يضمن إمكانية وجود العديد من آليات الاتصال بين Dart ومحتوى الويب.
يتم إعطاء الأداء والأمان الأولوية القصوى في جميع الأساليب، خاصة عند تلقي الاتصالات الواردة. نحن نعمل على زيادة سلامة العمليات وسهولة القراءة من خلال استخدام JSON لتمرير الرسائل، مما يوقف معالجة البيانات. تضمن اختبارات الوحدة أيضًا أن الوظيفة تعمل على النحو المقصود في الإعدادات المختلفة. على نحو سلس ويمكن الاعتماد عليها، و عرض ويب ينشئ التكامل رابطًا قويًا بين تقنيات الويب وبيئة Flutter الأصلية.
تمرير معلمات متعددة من JavaScript إلى Dart من خلال Flutter WebView
يقوم هذا الحل بتمرير عدة وسيطات (x، y) من JavaScript إلى Dart أثناء التعامل معها وفقًا لأفضل الممارسات. ويتم ذلك من خلال الاستفادة من المكوّن الإضافي Flutter WebView وقناة JavaScript.
// JavaScript code to send two parameters to Dart
function sendPosition(x, y) {
setPosition.postMessage(JSON.stringify({ x: x, y: y }));
}
// Example of calling the function
sendPosition(100, 200);
التعامل مع المعلمات المستلمة في Dart عبر قناة JavaScript الخاصة بـ WebView
الهدف الأساسي لحل Dart هذا هو التعامل بفعالية مع الرسالة المستلمة عبر قناة JavaScript الخاصة بـ WebView عن طريق فك تشفيرها بتنسيق JSON.
// Dart code: Set up WebView and JavaScript channel
WebView(
initialUrl: 'https://your-webpage.com',
javascriptChannels: {
JavascriptChannel(
name: 'setPosition',
onMessageReceived: (JavascriptMessage message) {
// Decode the JSON message
final data = jsonDecode(message.message);
final x = data['x'];
final y = data['y'];
// Handle the x and y values
print('Position received: x=$x, y=$y');
// Add your logic here
},
),
},
);
اختبار الوحدة لـ Dart: اختبار قناة JavaScript
يتأكد جانب Dart من اختبار وحدة الحل من معالجة رسالة JavaScript وتحليلها بشكل صحيح.
import 'package:flutter_test/flutter_test.dart';
import 'dart:convert';
void main() {
test('Test JavaScript message parsing', () {
const message = '{"x": 100, "y": 200}';
final data = jsonDecode(message);
expect(data['x'], 100);
expect(data['y'], 200);
});
}
النهج البديل: استخدام أنظمة URL لتمرير المعلمات
توضح هذه الطريقة كيفية تمرير الوسائط باستخدام نظام URL مخصص في JavaScript والذي تم فك ترميزه في Dart عند حدث تغيير عنوان URL الخاص بـ WebView.
// JavaScript code: Send parameters via custom URL scheme
function sendPositionViaUrl(x, y) {
window.location.href = 'flutter-webview://setPosition?x=' + x + '&y=' + y;
}
// Example of calling the function
sendPositionViaUrl(100, 200);
Dart: التعامل مع تغييرات URL في WebView
من أجل التقاط ومعالجة المعلمات المقدمة عبر بروتوكول URL، يعترض حل Dart هذا تغييرات عنوان URL في WebView.
WebView(
initialUrl: 'https://your-webpage.com',
navigationDelegate: (NavigationRequest request) {
if (request.url.startsWith('flutter-webview://setPosition')) {
final uri = Uri.parse(request.url);
final x = uri.queryParameters['x'];
final y = uri.queryParameters['y'];
print('Position received via URL: x=$x, y=$y');
// Add your logic here
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
);
استكشاف تقنيات تمرير المعلمات في Flutter WebView
يعد التعامل مع هياكل البيانات الأكثر تعقيدًا جزءًا مهمًا من تمرير المعلمات عبر Flutter WebView بين JavaScript وDart. على الرغم من أن تركيزنا كان على اجتياز الأساسيات س و ذ الوسائط، قد تكون هناك مواقف تحتاج فيها أيضًا إلى تمرير كائن أو مصفوفة أو حتى عدة كائنات متداخلة. يمكن تحويل هياكل البيانات المعقدة إلى تنسيق سلسلة باستخدام JavaScript JSON.stringify() الطريقة، والتي يمكن بعد ذلك نقلها بشكل فعال باستخدام postMessage() طريقة. بعد ذلك، يمكن لدارت الاستفادة منها jsonDecode() لإعادة تجميع الهيكل الأولي بحيث يمكن معالجته.
تعد إدارة أخطاء إعادة توجيه الرسائل طريقة عملية أخرى. يعد التأكد من التحقق من صحة البيانات في كل من بيئات JavaScript وDart أمرًا بالغ الأهمية عند نقل البيانات المهمة بين اللغتين. يمكن تجنب تسليم البيانات المشوهة عن طريق إجراء عمليات التحقق قبل الاستدعاء postMessage() على الجانب جافا سكريبت. يمكنك التحقق من أن البيانات المشفرة تحتوي على المفاتيح والقيم المتوقعة على جانب Dart من خلال التحقق من صحتها. بالإضافة إلى ضمان التواصل الفعال، فإن هذا يحمي من الأخطاء أو البيانات التالفة.
بالإضافة إلى ذلك، WebView في Flutter وظيفة إضافية تتيح لك تطبيق JavaScript مخصص على صفحة الويب. يمكنك تشغيل إجراءات JavaScript ديناميكيًا من جانب Dart من خلال الاستفادة من evaluateJavascript تقنية. يؤدي ذلك إلى زيادة تعدد الاستخدامات من خلال تمكين إرسال الأوامر من تطبيق Flutter إلى محتوى الويب، وبالتالي تعزيز قناة الاتصال ثنائية الاتجاه. عندما تكون هناك حاجة لتبادل البيانات المستمر بين الطبقتين، تعمل هذه الإستراتيجية بشكل جيد.
أسئلة شائعة حول تمرير المعلمات في Flutter WebView
- كيف أرسل كائنات معقدة من JavaScript إلى Dart؟
- لفك تشفير الكائنات المعقدة على جانب Dart، استخدم jsonDecode() بعد تحويلها إلى سلسلة مع JSON.stringify() و postMessage().
- كيف يمكن التحقق من البيانات بشكل أكثر فعالية قبل نقلها؟
- قبل إرسال البيانات مع postMessage()، تأكد من تنظيمه بشكل صحيح ويحتوي على جميع الحقول الضرورية في جانب JavaScript. بعد فك تشفير الاتصال، تحقق من المفاتيح والقيم الموجودة على جانب Dart.
- هل من الممكن إرسال Dart أكثر من معلمتين من JavaScript؟
- نعم، يمكنك استخدام JSON.stringify() لنقل العديد من المعلمات ككائن JSON، و jsonDecode() للتعامل معهم في دارت.
- ماذا لو كان WebView لا يدعم قناة JavaScript؟
- إذا لم تكن قناة JavaScript متاحة، فيمكنك استخدام نظام URL مخصص واستخدامه navigationDelegate في Dart لاعتراض عنوان URL.
- كيف أتعامل مع الأخطاء أثناء تمرير المعلمة؟
- ضع معالجة الأخطاء موضع التنفيذ في Dart وJavaScript. تأكد من جميع البيانات المرسلة مع postMessage() يتم فحصها واستخدامها try-catch الكتل في Dart لاكتشاف مشكلات فك التشفير.
الأفكار النهائية حول اتصالات Flutter WebView
تعمل القدرة على إرسال الوسائط بين JavaScript وDart على تحسين كيفية تفاعل المحتوى عبر الإنترنت وتطبيقات Flutter. يتم ضمان سلامة البيانات وسهولة استخدامها عندما بريد الرسالة () يتم استخدامه بالتزامن مع Dart's جسونديكود() وظيفة.
يمكن للمطورين اختيار النهج الذي يناسب مشروعهم بشكل أفضل من خلال التحقق من العديد من الاستراتيجيات، مثل مخططات URL والتعامل مع الرسائل المباشرة. إن ضمان التحقق المناسب وإدارة الأخطاء يعزز من اعتمادية أنظمة الاتصالات هذه.
المراجع والموارد الخاصة بـ JavaScript إلى Dart Communication في Flutter WebView
- يشرح الإعداد قنوات جافا سكريبت وكيفية اندماجهم فيها عرض ويب الرفرفة التطبيقات. وثائق Flutter WebView
- يقدم رؤى حول بريد الرسالة () الطريقة واستخدامها في JavaScript للمراسلة عبر الإطارات. مستندات ويب MDN - postMessage()
- يشرح كيفية تعامل Dart مع فك تشفير JSON وتحليله لمعالجة البيانات بكفاءة من JavaScript. وثائق دارت jsonDecode()
- يغطي باستخدام navigationDelegate لاعتراض عنوان URL داخل WebView. Flutter WebView NavigationDelegate