Menangani JavaScript ke Komunikasi Dart di Flutter WebView
Merakit aplikasi hibrid mungkin memerlukan pengintegrasian JavaScript dan Flutter melalui WebView. Transmisi data dari JavaScript ke Dart adalah salah satu pekerjaan umum yang memungkinkan kelancaran komunikasi antara dua lingkungan.
Posting ini akan menjelaskan cara menggunakan Saluran JavaScript plugin Flutter WebView untuk mentransfer berbagai parameter dari JavaScript ke Dart. Kami secara khusus akan berkonsentrasi pada situasi di mana ada dua argumen, misalnya X Dan kamu, dikirim ke Dart dengan fungsi JavaScript menggunakan setPosisi saluran.
Meskipun data dapat dikirim dari JavaScript menggunakan pascaPesan(), sangat penting untuk menangani pesan-pesan ini dengan benar di Dart untuk menjamin bahwa komunikasi berfungsi sebagaimana mestinya. Pemrosesan data yang efektif memerlukan pengetahuan cara menggunakan Dart diMessageReceived berfungsi untuk melakukan hal ini.
Anda tidak sendirian jika Anda sudah mencoba mencari jawaban di internet tetapi belum menemukan banyak jawaban. Kami akan membahasnya secara mendetail dan memberi Anda metode langkah demi langkah untuk membangun jalur komunikasi ini di artikel ini.
Memerintah | Contoh penggunaan |
---|---|
postMessage() | Tujuan dari metode JavaScript ini adalah untuk mentransfer pesan antara beberapa konteks. Di sini, digunakan untuk mengangkut data melalui Saluran JavaScript ke sisi Dart Flutter WebView dari konten web (dalam contoh ini, JavaScript). |
jsonDecode() | Fungsi Dart yang mem-parsing string yang dikodekan dengan JSON dan mengubahnya menjadi peta atau daftar Dart ditemukan dalam paket dart:convert. Untuk mengambil data seperti X Dan kamu, ini membantu dalam memecahkan kode pesan JSON diterima dari JavaScript. |
JavascriptChannel | Ini adalah kelas Flutter yang memfasilitasi komunikasi antara kode Dart dan JavaScript yang dijalankan dalam WebView. Ketika pesan datang dari sisi JavaScript, file Saluran Javascript mendengarkannya dan menanganinya di Dart. |
onMessageReceived | Panggilan balik yang dipicu di Saluran Javascript setelah menerima pesan dari JavaScript. Ia mengelola pesan masuk dan melakukan operasi pemrosesan data, termasuk mengurai JSON atau menggunakan argumen yang telah diberikan. |
navigationDelegate | Properti Dart yang memungkinkan Tampilan Web widget untuk mengontrol dan mencegat peristiwa yang terkait dengan navigasi. Ini memungkinkan Anda mencatat perubahan URL (misalnya, saat mengirim parameter dengan skema URL khusus). |
Uri.queryParameters | Di Dart, properti ini mengambil parameter kueri dari URL. Anda dapat mengakses data yang diberikan sebagai parameter di URL, seperti X Dan kamu, saat Anda menggunakan skema URL khusus. |
NavigationDecision.prevent | Nilai kembalian yang navigasiDelegasi digunakan untuk menghentikan navigasi WebView. Saat mengelola argumen dan mencegat perubahan URL tanpa meninggalkan halaman saat ini, ini sangat membantu. |
JavascriptMessage | Kelas Dart yang menerima pesan yang dikirim melalui Saluran Javascript dari JavaScript hingga Dart. String pesan terdapat di sana, siap untuk diproses atau didekode sesuai kebutuhan. |
WebView | Itu Tampilan Web widget di aplikasi Flutter digunakan untuk menampilkan konten web. Itu membuat saluran JavaScript dapat diakses, memungkinkan komunikasi dua arah antara kode asli dan web. |
Mengintegrasikan JavaScript dan Komunikasi Dart di Flutter WebView
Solusi yang kami kembangkan menunjukkan cara menggunakan a Saluran JavaScript untuk menyampaikan banyak argumen dari JavaScript ke Dart melalui WebView Flutter. Tujuan utamanya adalah membuat saluran yang dapat diandalkan untuk komunikasi antara kode Dart dan JavaScript yang berjalan di WebView. Itu pascaPesan() Metode ini digunakan oleh fungsi JavaScript untuk mengirimkan dua parameter (x dan y), yang selanjutnya diterima oleh Dart melalui panggilan balik onMessageReceived. Dengan konfigurasi ini, informasi penting dapat dikomunikasikan secara efektif dari konten web ke kode Dart asli.
Menggunakan jsonDecode() fungsi, kami memecahkan kode pesan yang diterima di sisi Dart. Kami memastikan bahwa banyak parameter dapat dikirim secara terorganisir dengan mentransfer data JSON dari JavaScript. Setelah decoding, Dart dapat mengambil nilai individual (x dan y) dan menggunakannya untuk tujuan apa pun. Ini termasuk merekam informasi, mengubah elemen antarmuka pengguna, dan melaksanakan tugas lain yang bergantung pada nilai yang diperoleh. Metode ini menjamin overhead yang rendah saat mengirim struktur data kompleks dari JavaScript ke Dart.
Selain mengelola pesan secara langsung, kami juga melihat pendekatan berbeda yang melibatkan penggunaan skema URL unik. Kita dapat mengirimkan parameter melalui URL dengan mengubah jendela.lokasi.href dalam JavaScript. Dart kemudian dapat mencegat data ini menggunakan navigasiDelegasi. Saat menggunakan Saluran JavaScript mungkin tidak layak dilakukan atau ketika komunikasi berbasis URL lebih masuk akal mengingat desain programnya, pendekatan ini dapat bermanfaat. Setelah itu, Dart mem-parsing URL dan menggunakan Uri.queryParameters berfungsi untuk mengekstrak parameter seperti x dan y. Hal ini menjamin bahwa beberapa mekanisme komunikasi antara Dart dan konten web dimungkinkan.
Performa dan keamanan menjadi prioritas utama dalam semua pendekatan, khususnya saat menerima komunikasi masuk. Kami meningkatkan keamanan proses dan keterbacaan dengan menggunakan JSON untuk penyampaian pesan, yang menghentikan manipulasi data. Pengujian unit juga menjamin bahwa fungsionalitas berfungsi sebagaimana mestinya dalam berbagai pengaturan. Halus dan dapat diandalkan, itu Tampilan Web integrasi menciptakan hubungan yang kuat antara teknologi web dan lingkungan asli Flutter.
Meneruskan Beberapa Parameter dari JavaScript ke Dart melalui Flutter WebView
Solusi ini meneruskan beberapa argumen (x, y) dari JavaScript ke Dart sambil memperlakukannya sesuai dengan praktik terbaik. Hal ini dilakukan dengan memanfaatkan plugin Flutter WebView dan saluran 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);
Menangani Parameter yang Diterima di Dart melalui Saluran JavaScript WebView
Tujuan utama dari solusi Dart ini adalah menangani pesan yang diterima secara efektif melalui saluran JavaScript WebView dengan mendekodekannya dalam format 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
},
),
},
);
Tes Unit untuk Dart: Menguji Saluran JavaScript
Sisi Dart dari pengujian unit solusi memastikan pesan JavaScript diproses dan diuraikan dengan benar.
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);
});
}
Pendekatan Alternatif: Menggunakan Skema URL untuk Pengiriman Parameter
Metode ini menunjukkan cara menyampaikan argumen menggunakan skema URL khusus dalam JavaScript yang didekodekan di Dart setelah peristiwa perubahan URL di 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: Menangani Perubahan URL di WebView
Untuk menangkap dan memproses parameter yang diberikan melalui protokol URL, solusi Dart ini mencegat perubahan URL di 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;
},
);
Menjelajahi Teknik Passing Parameter di Flutter WebView
Menangani struktur data yang lebih rumit adalah bagian penting dari penerusan parameter melalui Flutter WebView antara JavaScript dan Dart. Meskipun fokus kami selama ini pada passing dasar X Dan kamu argumen, mungkin ada situasi di mana Anda juga perlu meneruskan sebuah objek, array, atau bahkan beberapa objek bersarang. Struktur data yang kompleks dapat diubah menjadi format string menggunakan JavaScript JSON.stringify() metode, yang kemudian dapat ditransfer secara efektif menggunakan postMessage() metode. Setelah itu, Dart dapat memanfaatkannya jsonDecode() untuk merakit kembali struktur awal sehingga dapat diproses.
Manajemen kesalahan penerusan pesan adalah metode praktis lainnya. Memastikan bahwa data divalidasi di lingkungan JavaScript dan Dart sangat penting saat memindahkan data penting antara kedua bahasa tersebut. Data yang salah format dapat dihindari agar tidak terkirim dengan melakukan pemeriksaan sebelum dipanggil postMessage() di sisi JavaScript. Anda dapat memverifikasi bahwa data yang dikodekan memiliki kunci dan nilai yang diantisipasi di sisi Dart dengan memvalidasinya. Selain memastikan komunikasi yang efektif, hal ini juga melindungi dari kesalahan atau data yang rusak.
Selain itu, WebView di Flutter menyediakan fungsionalitas tambahan yang memungkinkan Anda menerapkan JavaScript khusus ke halaman web. Anda dapat secara dinamis memicu rutinitas JavaScript dari sisi Dart dengan memanfaatkan evaluateJavascript teknik. Hal ini meningkatkan keserbagunaan dengan mengaktifkan perintah untuk dikirim dari aplikasi Flutter Anda ke konten web, sehingga meningkatkan saluran komunikasi dua arah. Ketika ada kebutuhan untuk pertukaran data yang konstan antara dua lapisan, strategi ini bekerja dengan baik.
Pertanyaan Umum tentang Melewati Parameter di Flutter WebView
- Bagaimana cara mengirim objek kompleks dari JavaScript ke Dart?
- Untuk memecahkan kode objek rumit di sisi Dart, gunakan jsonDecode() setelah mengonversinya menjadi string dengan JSON.stringify() Dan postMessage().
- Bagaimana cara memverifikasi data dengan paling efektif sebelum mentransfernya?
- Sebelum mengirimkan data dengan postMessage(), pastikan strukturnya benar dan memiliki semua bidang yang diperlukan di sisi JavaScript. Setelah komunikasi didekodekan, verifikasi kunci dan nilai di sisi Dart.
- Apakah mungkin mengirim Dart lebih dari dua parameter dari JavaScript?
- Ya, Anda bisa menggunakannya JSON.stringify() untuk mengirimkan banyak parameter sebagai objek JSON, dan jsonDecode() untuk menanganinya di Dart.
- Bagaimana jika WebView tidak mendukung Saluran JavaScript?
- Jika saluran JavaScript tidak tersedia, Anda dapat menggunakan skema URL khusus dan menggunakannya navigationDelegate di Dart untuk mencegat URL.
- Bagaimana cara menangani kesalahan saat meneruskan parameter?
- Praktikkan penanganan kesalahan di Dart dan JavaScript. Pastikan semua data dikirimkan bersama postMessage() diperiksa, dan digunakan try-catch blok di Dart untuk mendeteksi masalah decoding.
Pemikiran Akhir tentang Komunikasi Flutter WebView
Kemampuan untuk mengirim argumen antara JavaScript dan Dart meningkatkan cara konten online dan aplikasi Flutter berinteraksi. Integritas dan kegunaan data dijamin ketika pascaPesan() digunakan bersama dengan Dart jsonDecode() fungsi.
Pengembang dapat memilih pendekatan yang paling sesuai dengan proyek mereka dengan menyelidiki beberapa strategi, seperti skema URL dan penanganan pesan langsung. Memastikan validasi yang tepat dan manajemen kesalahan akan meningkatkan keandalan sistem komunikasi ini.
Referensi dan Sumber Daya untuk JavaScript ke Komunikasi Dart di Flutter WebView
- Menguraikan pengaturan Saluran JavaScript dan bagaimana mereka berintegrasi ke dalamnya Tampilan Web Berkibar aplikasi. Dokumentasi Flutter WebView
- Memberikan wawasan tentang pascaPesan() metode dan penggunaannya dalam JavaScript untuk perpesanan lintas bingkai. Dokumen Web MDN - postMessage()
- Menjelaskan bagaimana Dart menangani decoding dan parsing JSON untuk penanganan data yang efisien dari JavaScript. Dart jsonDecode() Dokumentasi
- Meliputi menggunakan delegasi navigasi untuk intersepsi URL dalam WebView. Delegasi Navigasi WebView Flutter