Använda JavaScript-kanalen i Flutter WebView för att skicka flera parametrar från JavaScript till Dart

Temp mail SuperHeros
Använda JavaScript-kanalen i Flutter WebView för att skicka flera parametrar från JavaScript till Dart
Använda JavaScript-kanalen i Flutter WebView för att skicka flera parametrar från JavaScript till Dart

Hantera JavaScript till Dart-kommunikation i Flutter WebView

Att montera en hybridapplikation kan kräva att JavaScript och Flutter integreras via en WebView. Dataöverföring från JavaScript till Dart är ett frekvent jobb som möjliggör smidig kommunikation mellan de två miljöerna.

Det här inlägget kommer att förklara hur man använder en Flutter WebView-plugins JavaScript-kanal för att överföra många parametrar från JavaScript till Dart. Vi kommer specifikt att koncentrera oss på en situation där två argument, t.ex x och y, skickas till Dart med en JavaScript-funktion med hjälp av setPosition kanal.

Även om data kan skickas från JavaScript med hjälp av postMessage(), är det absolut nödvändigt att hantera dessa meddelanden korrekt i Dart för att garantera att kommunikationen fungerar som avsett. Effektiv databehandling kräver att du vet hur man använder Dart's onMessageReceived funktion för att göra detta.

Du är inte ensam om du har försökt söka på internet efter svar men inte hittat mycket. Vi kommer att gå in i detalj och ge dig en steg-för-steg-metod för att bygga upp denna kommunikationspipeline i den här artikeln.

Kommando Exempel på användning
postMessage() Syftet med denna JavaScript-metod är att överföra meddelanden mellan flera sammanhang. Här används den för att transportera data via JavaScript-kanal till Dart-sidan av Flutter WebView från webbinnehållet (i det här exemplet JavaScript).
jsonDecode() En Dart-funktion som analyserar en sträng kodad med JSON och omvandlar den till en Dart-karta eller -lista finns i dart:convert-paketet. För att hämta data som x och y, det hjälper till att avkoda JSON-meddelande mottaget från JavaScript.
JavascriptChannel Detta är en Flutter-klass som underlättar kommunikation mellan Dart-kod och JavaScript som körs i en WebView. När meddelanden kommer från JavaScript-sidan, JavascriptChannel lyssnar efter dem och hanterar dem i Dart.
onMessageReceived En återuppringning som utlöses i JavascriptChannel när du får ett meddelande från JavaScript. Den hanterar det inkommande meddelandet och utför databearbetningsoperationer, inklusive att analysera JSON eller använda de argument som den har getts.
navigationDelegate En Dart-egenskap som tillåter WebView widget för att kontrollera och fånga upp händelser relaterade till navigering. Det gör att du kan registrera URL-ändringar (t.ex. när du skickar parametrar med anpassade URL-scheman).
Uri.queryParameters I Dart hämtar den här egenskapen frågeparametrarna från en URL. Du kan komma åt data som tillhandahålls som parametrar i URL:en, t.ex x och y, när du använder ett anpassat URL-schema.
NavigationDecision.prevent Ett returvärde som navigationDelegate används för att stoppa WebView från att navigera. När du hanterar argument och avlyssnar en URL-ändring utan att lämna den aktuella sidan, är det användbart.
JavascriptMessage En Dart-klass som tar emot meddelanden som skickas över JavascriptChannel från JavaScript till Dart. Meddelandesträngen finns där, redo för bearbetning eller avkodning efter behov.
WebView De WebView widget i Flutter-appar används för att visa webbinnehåll. Det gör JavaScript-kanaler tillgängliga, vilket möjliggör dubbelriktad kommunikation mellan inbyggd kod och webbkod.

Integrering av JavaScript och Dart Communication i Flutter WebView

Vår utvecklade lösning visar hur man använder en JavaScript-kanal att överföra många argument från JavaScript till Dart via Flutters WebView. Det primära målet är att skapa en pålitlig pipeline för kommunikation mellan Dart-koden och JavaScript som körs i WebView. De postMessage() metoden används av JavaScript-funktionen för att överföra två parametrar (x och y), som sedan tas emot av Dart via onMessageReceived callback. Med denna konfiguration kan viktig information effektivt kommuniceras från webbinnehållet till den inbyggda Dart-koden.

Med hjälp av jsonDecode() funktion, avkodar vi det mottagna meddelandet på Dart-sidan. Vi ser till att många parametrar kan skickas på ett organiserat sätt genom att överföra JSON-data från JavaScript. Efter avkodning kan Dart hämta de individuella värdena (x och y) och använda dem för alla ändamål. Detta inkluderar att registrera information, ändra användargränssnittselement och utföra andra uppgifter som beror på de erhållna värdena. Denna metod garanterar låg omkostnad när du skickar komplexa datastrukturer från JavaScript till Dart.

Förutom att hantera meddelanden direkt, undersökte vi också ett annat tillvägagångssätt som innebar att använda unika URL-scheman. Vi kan överföra parametrar via URL:en genom att ändra window.location.href i JavaScript. Dart kan sedan fånga upp denna data med hjälp av navigationDelegate. När du använder JavaScript-kanal kanske inte är genomförbart eller när URL-baserad kommunikation är mer vettig med tanke på programmets design, kan detta tillvägagångssätt vara användbart. Efter det analyserar Dart URL:en och använder Uri.queryParameters funktion för att extrahera parametrar som x och y. Detta garanterar att flera kommunikationsmekanismer mellan Dart och webbinnehåll är möjliga.

Prestanda och säkerhet ges högsta prioritet i alla tillvägagångssätt, särskilt vid mottagning av inkommande kommunikation. Vi ökar processsäkerheten och läsbarheten genom att använda JSON för meddelandeöverföring, vilket stoppar datamanipulation. Enhetstester garanterar också att funktionaliteten fungerar som avsett i olika inställningar. Smidig och pålitlig, den WebView integration skapar en stark länk mellan webbteknologier och Flutters inhemska miljö.

Skicka flera parametrar från JavaScript till Dart genom Flutter WebView

Denna lösning skickar flera argument (x, y) från JavaScript till Dart samtidigt som de behandlas enligt bästa praxis. Den gör detta genom att utnyttja Flutter WebView-plugin och en JavaScript-kanal.

// 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);

Hantera mottagna parametrar i Dart via WebViews JavaScript-kanal

Det primära målet med denna Dart-lösning är att effektivt hantera det mottagna meddelandet via JavaScript-kanalen i WebView genom att avkoda det i JSON-format.

// 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
      },
    ),
  },
);

Unit Test for Dart: Testa JavaScript-kanalen

Dart-sidan av lösningens enhetstester ser till att JavaScript-meddelandet bearbetas och tolkas korrekt.

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);
  });
}

Alternativt tillvägagångssätt: Använda URL-scheman för parameterpassering

Den här metoden visar hur man skickar argument med ett anpassat URL-schema i JavaScript som avkodas i Dart vid URL-ändringshändelsen i 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: Hantera URL-ändringar i WebView

För att fånga och bearbeta parametrar som ges över URL-protokollet, fångar denna Dart-lösning URL-ändringar i 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;
  },
);

Utforska parameterpasseringstekniker i Flutter WebView

Att hantera mer komplicerade datastrukturer är en viktig del av parameteröverföring via en Flutter WebView mellan JavaScript och Dart. Även om vårt fokus har legat på att klara basic x och y argument kan det finnas situationer där du också behöver skicka ett objekt, en array eller till och med flera kapslade objekt. Komplexa datastrukturer kan konverteras till ett strängformat med hjälp av JavaScript JSON.stringify() metod, som sedan effektivt kan överföras med hjälp av postMessage() metod. Efter det kan Dart använda jsonDecode() att återmontera den ursprungliga strukturen så att den kan bearbetas.

Felhantering vid vidarebefordran av meddelanden är en annan praktisk metod. Att se till att data valideras i både JavaScript- och Dart-miljöerna är avgörande när du flyttar viktig data mellan de två språken. Missformade data kan undvikas från att levereras genom att sätta kontroller på plats innan anropet postMessage() på JavaScript-sidan. Du kan verifiera att den kodade datan har de förväntade nycklarna och värdena på Dart-sidan genom att validera den. Förutom att säkerställa effektiv kommunikation, skyddar detta mot misstag eller korrupta data.

Dessutom, WebView i Flutter tillhandahåller en extra funktion som låter dig tillämpa anpassad JavaScript på webbsidan. Du kan utlösa JavaScript-rutiner dynamiskt från Dart-sidan genom att använda evaluateJavascript teknik. Detta ökar mångsidigheten genom att möjliggöra att kommandon skickas från din Flutter-app till webbinnehållet, vilket förbättrar tvåvägskommunikationskanalen. När det finns ett behov av konstant datautbyte mellan de två lagren fungerar denna strategi bra.

Vanliga frågor om att skicka parametrar i Flutter WebView

  1. Hur skickar jag komplexa objekt från JavaScript till Dart?
  2. För att avkoda komplicerade objekt på Dart-sidan, använd jsonDecode() efter att ha konverterat dem till en sträng med JSON.stringify() och postMessage().
  3. Hur kan data verifieras mest effektivt innan de överförs?
  4. Innan du överför data med postMessage(), se till att den är korrekt strukturerad och har alla nödvändiga fält på JavaScript-sidan. Efter att kommunikationen har avkodats, verifiera nycklarna och värdena på Dart-sidan.
  5. Är det möjligt att skicka Dart mer än två parametrar från JavaScript?
  6. Ja, du kan använda JSON.stringify() att överföra många parametrar som ett JSON-objekt, och jsonDecode() att hantera dem i Dart.
  7. Vad händer om WebView inte stöder JavaScript-kanalen?
  8. Om JavaScript-kanalen inte är tillgänglig kan du använda ett anpassat URL-schema och använda navigationDelegate i Dart för att fånga upp webbadressen.
  9. Hur hanterar jag fel under parameterpassering?
  10. Använd felhantering i Dart och JavaScript. Se till att all data skickas med postMessage() är kontrollerad och använd try-catch block i Dart för att upptäcka avkodningsproblem.

Slutliga tankar om Flutter WebView-kommunikation

Möjligheten att skicka argument mellan JavaScript och Dart förbättrar hur onlineinnehåll och Flutter-appar interagerar. Dataintegritet och användbarhet garanteras när postMessage() används tillsammans med Dart's jsonDecode() fungera.

Utvecklare kan välja det tillvägagångssätt som bäst passar deras projekt genom att undersöka flera strategier, såsom URL-scheman och direktmeddelandehantering. Att säkerställa lämplig validering och felhantering förbättrar dessa kommunikationssystems tillförlitlighet.

Referenser och resurser för JavaScript till Dart-kommunikation i Flutter WebView
  1. Utvecklar inställningen JavaScript-kanaler och hur de integreras i Flutter WebView applikationer. Flutter WebView-dokumentation
  2. Ger insikter i postMessage() metod och dess användning i JavaScript för meddelanden över flera ramar. MDN Web Docs - postMessage()
  3. Förklarar hur Dart hanterar JSON-avkodning och analys för effektiv datahantering från JavaScript. Dart jsonDecode() Dokumentation
  4. Omslag med hjälp av navigationDelegate för URL-avlyssning i en WebView. Flutter WebView NavigationDelegate