flutter-webview-windows icon indicating copy to clipboard operation
flutter-webview-windows copied to clipboard

postWebMessage failed

Open summanzhao opened this issue 1 year ago • 2 comments

Hello, I would like to send a message to JavaScript using the postWebMessage method:

WebviewController kWebController=WebviewController();

//Several initialization tasks for WebWiew ........ _ Subscriptions. add (kWebController. loadingState. listen ((state)){

DebugPrint ('Loading state: $state ');

If (state==LoadingState. navigation Completed){

KWebController.executeScript(

"Window. addEventListener ('message ', event=>{console. log ('Received message:', event. data);});";

KWebController. postWebMessage ("hello world");

}

});

After completion

KWebController. postWebMessage ("hello world");

There was an error in this call: [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(not_supported, Posting the message failed., null, null) #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:652:7) #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:310:18)

How should I solve it? Looking forward to your reply!

summanzhao avatar Jan 28 '24 09:01 summanzhao

same issue.
And can you post msg from web ?

bladeofgod avatar Mar 11 '24 09:03 bladeofgod

Hello, I would like to send a message to JavaScript using the postWebMessage method:

WebviewController kWebController=WebviewController();

//Several initialization tasks for WebWiew ........ _ Subscriptions. add (kWebController. loadingState. listen ((state)){

DebugPrint ('Loading state: $state ');

If (state==LoadingState. navigation Completed){

KWebController.executeScript(

"Window. addEventListener ('message ', event=>{console. log ('Received message:', event. data);});";

KWebController. postWebMessage ("hello world");

}

});

After completion

KWebController. postWebMessage ("hello world");

There was an error in this call: [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(not_supported, Posting the message failed., null, null) #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:652:7) #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:310:18)

How should I solve it? Looking forward to your reply!

The WebviewController.postWebMessage method internally calls ICoreWebView2.PostWebMessageAsJson, so the message passed to the WebviewController.postWebMessage method must be in JSON format. otherwise, it will fail internally with HRESULT 0x80070057(E_INVALIDARG) error.

... also if you want to receive messages on the JavaScript side, you need to use window.chrome.webview.addEventListener, not Window.addEventListener.

Try this:

WebviewController _webviewController = WebviewController();

// ... 

_subscriptions.add(_webviewController.loadingState.listen((state) {
  debugPrint('Loading state: $state ');

  if (state == LoadingState.navigationCompleted) {
    _webviewController.executeScript(
      "window.chrome.webview.addEventListener('message', event => { console.log('Received message:', event.data.message); });"
    );
    _webviewController.postWebMessage("{ \"message\": \"hello world\" }");
  }
}));

See:

  • https://learn.microsoft.com/en-us/microsoft-edge/webview2/reference/win32/icorewebview2?view=webview2-1.0.2478.35#postwebmessageasjson
  • https://github.com/jnschulze/flutter-webview-windows/blob/08eee671db9c26e6d31fbd6b8ff7feeb1e287bb9/windows/webview_bridge.cc#L569
  • https://github.com/jnschulze/flutter-webview-windows/blob/08eee671db9c26e6d31fbd6b8ff7feeb1e287bb9/windows/webview.cc#L714

xorespesp avatar May 08 '24 05:05 xorespesp