build method

  1. @override
Widget build(
  1. BuildContext context
)

Builds a new WebView.

Returns a Widget tree that embeds the created web view.

Implementation

@override
Widget build(BuildContext context) {
  return HtmlElementView(
    key: params.key,
    onPlatformViewCreated: (id) {
      web.HTMLIFrameElement? iFrame = _controller._webWebViewParams.iFrame;
      web.EventListener? listener;

      listener = (() {
        if (iFrame?.contentDocument?.readyState != null &&
            iFrame?.contentDocument?.readyState != 'complete') {
          return;
        }

        iFrame?.removeEventListener('load', listener);
        iFrame = null;

        final htmlString = _controller._htmlString;
        final javaScript = _controller._javaScript;

        _controller._htmlString = null;
        _controller._javaScript = null;

        if (htmlString != null) {
          /// Restore HTML
          _controller.loadHtmlString(htmlString);
        }

        _controller._injectJavaScript('''try {
          addEventListener('message', function (e) {
            if (
              e.data instanceof Array &&
              e.data[0] === 'flutter_webwebview._connect'
            ) {
              const name = e.data[1];
              const port = e.ports[0];

              window[name] = {
                postMessage: (message) => {
                  port.postMessage(message);
                },
              };

              port.onmessage = (e) => {
                if (
                  e.data instanceof Array &&
                  e.data[0] === 'flutter_webwebview._disconnect'
                ) {
                  try {
                    delete window[name];
                    port.postMessage('flutter_webwebview._disconnected');
                  } finally {
                    port.close();
                  }
                }
              };

              port.postMessage('flutter_webwebview._connected');
            }
          });
        } catch {}''');

        if (javaScript != null) {
          /// Restore JavaScript
          _controller.runJavaScript(javaScript);
        }

        _controller._messageChannels.values.forEach(
          _controller._connectMessageChannel,
        );
      }).toJS;

      iFrame?.addEventListener('load', listener);
      iFrame?.src = 'about:blank';
    },
    viewType: _controller._webWebViewParams.iFrame.id,
  );
}