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