setOnConsoleMessage method

  1. @override
Future<void> setOnConsoleMessage(
  1. void onConsoleMessage(
    1. JavaScriptConsoleMessage consoleMessage
    )
)

Sets a callback that notifies the host application of any log messages written to the JavaScript console.

Because the iOS WKWebView doesn't provide a built-in way to access the console, setting this callback will inject a custom WKUserScript which overrides the JavaScript console.debug, console.error, console.info, console.log and console.warn methods and forwards the console message via a JavaScriptChannel to the host application.

Implementation

@override
Future<void> setOnConsoleMessage(
  void Function(JavaScriptConsoleMessage consoleMessage) onConsoleMessage,
) {
  _onConsoleMessageCallback = onConsoleMessage;

  final JavaScriptChannelParams channelParams = WebKitJavaScriptChannelParams(
      name: 'fltConsoleMessage',
      webKitProxy: _webKitParams.webKitProxy,
      onMessageReceived: (JavaScriptMessage message) {
        if (_onConsoleMessageCallback == null) {
          return;
        }

        final Map<String, dynamic> consoleLog =
            jsonDecode(message.message) as Map<String, dynamic>;

        JavaScriptLogLevel level;
        switch (consoleLog['level']) {
          case 'error':
            level = JavaScriptLogLevel.error;
          case 'warning':
            level = JavaScriptLogLevel.warning;
          case 'debug':
            level = JavaScriptLogLevel.debug;
          case 'info':
            level = JavaScriptLogLevel.info;
          case 'log':
          default:
            level = JavaScriptLogLevel.log;
            break;
        }

        _onConsoleMessageCallback!(
          JavaScriptConsoleMessage(
            level: level,
            message: consoleLog['message']! as String,
          ),
        );
      });

  addJavaScriptChannel(channelParams);
  return _injectConsoleOverride();
}