webview_flutter_android 4.10.11
webview_flutter_android: ^4.10.11 copied to clipboard
A Flutter plugin that provides a WebView widget on Android.
// Copyright 2013 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// ignore_for_file: public_member_api_docs
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:webview_flutter_android/webview_flutter_android.dart';
import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart';
void main() {
runApp(const MaterialApp(home: WebViewExample()));
}
const String kNavigationExamplePage = '''
<!DOCTYPE html><html>
<head><title>Navigation Delegate Example</title></head>
<body>
<p>
The navigation delegate is set to block navigation to the pub.dev website.
</p>
<ul>
<ul><a href="/?originalUrl=https%3A%2F%2Fpub.dev%2F%26quot%3Bhttps%3A%26%2347%3B%26%2347%3Bpub.dev%26%2347%3B%26quot%3B%26gt%3Bhttps%3A%26%2347%3B%26%2347%3Bpub.dev%26%2347%3B%26lt%3B%26%2347%3Ba%26gt%3B%26lt%3B%26%2347%3Bul%26gt%3B%26lt%3Bul%26gt%3B%26lt%3Ba%2520href%3D%26quot%3Bhttps%3A%26%2347%3B%26%2347%3Bwww.google.com%26%2347%3B%26quot%3B%26gt%3Bhttps%3A%26%2347%3B%26%2347%3Bwww.google.com%26%2347%3B%26lt%3B%26%2347%3Ba%26gt%3B%26lt%3B%26%2347%3Bul%26gt%3B%26lt%3B%26%2347%3Bul%26gt%3B%26lt%3B%26%2347%3Bbody%26gt%3B%26lt%3B%26%2347%3Bhtml%26gt%3B%26%2339%3B%26%2339%3B%26%2339%3B%3Bconst%2520String%2520kLocalExamplePage%2520%3D%2520%26%2339%3B%26%2339%3B%26%2339%3B%26lt%3B!DOCTYPE%2520html%26gt%3B%26lt%3Bhtml%2520lang%3D%26quot%3Ben%26quot%3B%26gt%3B%26lt%3Bhead%26gt%3B%26lt%3Btitle%26gt%3BLoad%2520file%2520or%2520HTML%2520string%2520example%26lt%3B%26%2347%3Btitle%26gt%3B%26lt%3B%26%2347%3Bhead%26gt%3B%26lt%3Bbody%26gt%3B%26lt%3Bh1%26gt%3BLocal%2520demo%2520page%26lt%3B%26%2347%3Bh1%26gt%3B%26lt%3Bp%26gt%3B%2520%2520This%2520is%2520an%2520example%2520page%2520used%2520to%2520demonstrate%2520how%2520to%2520load%2520a%2520local%2520file%2520or%2520HTML%2520%2520string%2520using%2520the%2520%26lt%3Ba%2520href%3D%26quot%3Bhttps%3A%26%2347%3B%26%2347%3Bpub.dev%26%2347%3Bpackages%26%2347%3Bwebview_flutter%26quot%3B%26gt%3BFlutter%2520%2520webview%26lt%3B%26%2347%3Ba%26gt%3B%2520plugin.%26lt%3B%26%2347%3Bp%26gt%3B%26lt%3B%26%2347%3Bbody%26gt%3B%26lt%3B%26%2347%3Bhtml%26gt%3B%26%2339%3B%26%2339%3B%26%2339%3B%3Bconst%2520String%2520kTransparentBackgroundPage%2520%3D%2520%26%2339%3B%26%2339%3B%26%2339%3B%26lt%3B!DOCTYPE%2520html%26gt%3B%26lt%3Bhtml%26gt%3B%26lt%3Bhead%26gt%3B%2520%2520%26lt%3Btitle%26gt%3BTransparent%2520background%2520test%26lt%3B%26%2347%3Btitle%26gt%3B%26lt%3B%26%2347%3Bhead%26gt%3B%26lt%3Bstyle%2520type%3D%26quot%3Btext%26%2347%3Bcss%26quot%3B%26gt%3B%2520%2520body%2520%7B%2520background%3A%2520transparent%3B%2520margin%3A%25200%3B%2520padding%3A%25200%3B%2520%7D%2520%2520%23container%2520%7B%2520position%3A%2520relative%3B%2520margin%3A%25200%3B%2520padding%3A%25200%3B%2520width%3A%2520100vw%3B%2520height%3A%2520100vh%3B%2520%7D%2520%2520%23shape%2520%7B%2520background%3A%2520%23FF0000%3B%2520width%3A%2520200px%3B%2520height%3A%2520100%25%3B%2520margin%3A%25200%3B%2520padding%3A%25200%3B%2520position%3A%2520absolute%3B%2520top%3A%25200%3B%2520bottom%3A%25200%3B%2520left%3A%2520calc(50%25%2520-%2520100px)%3B%2520%7D%2520%2520p%2520%7B%2520text-align%3A%2520center%3B%2520%7D%26lt%3B%26%2347%3Bstyle%26gt%3B%26lt%3Bbody%26gt%3B%2520%2520%26lt%3Bdiv%2520id%3D%26quot%3Bcontainer%26quot%3B%26gt%3B%2520%2520%2520%2520%26lt%3Bp%26gt%3BTransparent%2520background%2520test%26lt%3B%26%2347%3Bp%26gt%3B%2520%2520%2520%2520%26lt%3Bdiv%2520id%3D%26quot%3Bshape%26quot%3B%26gt%3B%26lt%3B%26%2347%3Bdiv%26gt%3B%2520%2520%26lt%3B%26%2347%3Bdiv%26gt%3B%26lt%3B%26%2347%3Bbody%26gt%3B%26lt%3B%26%2347%3Bhtml%26gt%3B%26%2339%3B%26%2339%3B%26%2339%3B%3Bconst%2520String%2520kLogExamplePage%2520%3D%2520%26%2339%3B%26%2339%3B%26%2339%3B%26lt%3B!DOCTYPE%2520html%26gt%3B%26lt%3Bhtml%2520lang%3D%26quot%3Ben%26quot%3B%26gt%3B%26lt%3Bhead%26gt%3B%26lt%3Btitle%26gt%3BLoad%2520file%2520or%2520HTML%2520string%2520example%26lt%3B%26%2347%3Btitle%26gt%3B%26lt%3B%26%2347%3Bhead%26gt%3B%26lt%3Bbody%2520onload%3D%26quot%3Bconsole.log(%26%2339%3BLogging%2520that%2520the%2520page%2520is%2520loading.%26%2339%3B)%26quot%3B%26gt%3B%26lt%3Bh1%26gt%3BLocal%2520demo%2520page%26lt%3B%26%2347%3Bh1%26gt%3B%26lt%3Bp%26gt%3B%2520%2520This%2520page%2520is%2520used%2520to%2520test%2520the%2520forwarding%2520of%2520console%2520logs%2520to%2520Dart.%26lt%3B%26%2347%3Bp%26gt%3B%26lt%3Bstyle%26gt%3B%2520%2520%2520%2520.btn-group%2520button%2520%7B%2520%2520%2520%2520%2520%2520padding%3A%252024px%3B%252024px%3B%2520%2520%2520%2520%2520%2520display%3A%2520block%3B%2520%2520%2520%2520%2520%2520width%3A%252025%25%3B%2520%2520%2520%2520%2520%2520margin%3A%25205px%25200px%25200px%25200px%3B%2520%2520%2520%2520%7D%26lt%3B%26%2347%3Bstyle%26gt%3B%26lt%3Bdiv%2520class%3D%26quot%3Bbtn-group%26quot%3B%26gt%3B%2520%2520%2520%2520%26lt%3Bbutton%2520onclick%3D%26quot%3Bconsole.error(%26%2339%3BThis%2520is%2520an%2520error%2520message.%26%2339%3B)%26quot%3B%26gt%3BError%26lt%3B%26%2347%3Bbutton%26gt%3B%2520%2520%2520%2520%26lt%3Bbutton%2520onclick%3D%26quot%3Bconsole.warn(%26%2339%3BThis%2520is%2520a%2520warning%2520message.%26%2339%3B)%26quot%3B%26gt%3BWarning%26lt%3B%26%2347%3Bbutton%26gt%3B%2520%2520%2520%2520%26lt%3Bbutton%2520onclick%3D%26quot%3Bconsole.info(%26%2339%3BThis%2520is%2520a%2520info%2520message.%26%2339%3B)%26quot%3B%26gt%3BInfo%26lt%3B%26%2347%3Bbutton%26gt%3B%2520%2520%2520%2520%26lt%3Bbutton%2520onclick%3D%26quot%3Bconsole.debug(%26%2339%3BThis%2520is%2520a%2520debug%2520message.%26%2339%3B)%26quot%3B%26gt%3BDebug%26lt%3B%26%2347%3Bbutton%26gt%3B%2520%2520%2520%2520%26lt%3Bbutton%2520onclick%3D%26quot%3Bconsole.log(%26%2339%3BThis%2520is%2520a%2520log%2520message.%26%2339%3B)%26quot%3B%26gt%3BLog%26lt%3B%26%2347%3Bbutton%26gt%3B%26lt%3B%26%2347%3Bdiv%26gt%3B%26lt%3B%26%2347%3Bbody%26gt%3B%26lt%3B%26%2347%3Bhtml%26gt%3B%26%2339%3B%26%2339%3B%26%2339%3B%3Bconst%2520String%2520kAlertTestPage%2520%3D%2520%26%2339%3B%26%2339%3B%26%2339%3B%26lt%3B!DOCTYPE%2520html%26gt%3B%26lt%3Bhtml%26gt%3B%2520%2520%2520%2520%2520%26lt%3Bhead%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3Bscript%2520type%2520%3D%2520%26quot%3Btext%26%2347%3Bjavascript%26quot%3B%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520function%2520showAlert(text)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520alert(text)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520function%2520showConfirm(text)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520var%2520result%2520%3D%2520confirm(text)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520alert(result)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520function%2520showPrompt(text%2C%2520defaultText)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520var%2520inputString%2520%3D%2520prompt(%26%2339%3BEnter%2520input%26%2339%3B%2C%2520%26%2339%3BDefault%2520text%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520alert(inputString)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3B%26%2347%3Bscript%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3B%26%2347%3Bhead%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3Bbody%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3Bp%26gt%3B%2520Click%2520the%2520following%2520button%2520to%2520see%2520the%2520effect%2520%26lt%3B%26%2347%3Bp%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3Bform%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3Binput%2520type%2520%3D%2520%26quot%3Bbutton%26quot%3B%2520value%2520%3D%2520%26quot%3BAlert%26quot%3B%2520onclick%2520%3D%2520%26quot%3BshowAlert(%26%2339%3BTest%2520Alert%26%2339%3B)%3B%26quot%3B%2520%26%2347%3B%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3Binput%2520type%2520%3D%2520%26quot%3Bbutton%26quot%3B%2520value%2520%3D%2520%26quot%3BConfirm%26quot%3B%2520onclick%2520%3D%2520%26quot%3BshowConfirm(%26%2339%3BTest%2520Confirm%26%2339%3B)%3B%26quot%3B%2520%26%2347%3B%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3Binput%2520type%2520%3D%2520%26quot%3Bbutton%26quot%3B%2520value%2520%3D%2520%26quot%3BPrompt%26quot%3B%2520onclick%2520%3D%2520%26quot%3BshowPrompt(%26%2339%3BTest%2520Prompt%26%2339%3B%2C%2520%26%2339%3BDefault%2520Value%26%2339%3B)%3B%26quot%3B%2520%26%2347%3B%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3B%26%2347%3Bform%26gt%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26lt%3B%26%2347%3Bbody%26gt%3B%2520%2520%26lt%3B%26%2347%3Bhtml%26gt%3B%2520%2520%26%2339%3B%26%2339%3B%26%2339%3B%3Bconst%2520String%2520kViewportMetaPage%2520%3D%2520%26%2339%3B%26%2339%3B%26%2339%3B%2520%2520%26lt%3B!DOCTYPE%2520html%26gt%3B%2520%2520%26lt%3Bhtml%26gt%3B%2520%2520%26lt%3Bhead%26gt%3B%2520%2520%2520%2520%2520%2520%26lt%3Btitle%26gt%3BViewport%2520meta%2520example%26lt%3B%26%2347%3Btitle%26gt%3B%2520%2520%26lt%3B%26%2347%3Bhead%26gt%3B%2520%2520%26lt%3Bmeta%2520name%3D%26quot%3Bviewport%26quot%3B%2520content%3D%26quot%3Bwidth%3D1000%2C%2520initial-scale%3D1%26quot%3B%2520%26%2347%3B%26gt%3B%2520%2520%26lt%3Bstyle%2520type%3D%26quot%3Btext%26%2347%3Bcss%26quot%3B%26gt%3B%2520%2520%2520%2520%2520%2520body%2520%7B%2520background%3A%2520transparent%3B%2520margin%3A%25200%3B%2520padding%3A%25200%3B%2520%7D%2520%2520%2520%2520%2520%2520%23shape%2520%7B%2520background%3A%2520red%3B%2520width%3A%252050vw%3B%2520height%3A%252050vw%3B%2520%7D%2520%2520%26lt%3B%26%2347%3Bstyle%26gt%3B%2520%2520%26lt%3Bbody%26gt%3B%2520%2520%26lt%3Bdiv%26gt%3B%2520%2520%2520%2520%2520%2520%26lt%3Bp%26gt%3BViewport%2520meta%2520example%26lt%3B%26%2347%3Bp%26gt%3B%2520%2520%2520%2520%2520%2520%26lt%3Bimg%2520id%3D%26quot%3Bshape%26quot%3B%2520src%3D%26quot%3Bhttps%3A%26%2347%3B%26%2347%3Bstorage.googleapis.com%26%2347%3Bcms-storage-bucket%26%2347%3B4fd5520fe28ebf839174.svg%26quot%3B%26%2347%3B%26gt%3B%2520%2520%26lt%3B%26%2347%3Bdiv%26gt%3B%2520%2520%26lt%3B%26%2347%3Bbody%26gt%3B%2520%2520%26lt%3B%26%2347%3Bhtml%26gt%3B%26%2339%3B%26%2339%3B%26%2339%3B%3Bclass%2520WebViewExample%2520extends%2520StatefulWidget%2520%7B%2520%2520const%2520WebViewExample(%7Bsuper.key%2C%2520this.cookieManager%7D)%3B%2520%2520final%2520PlatformWebViewCookieManager%3F%2520cookieManager%3B%2520%2520%40override%2520%2520State%26lt%3BWebViewExample%26gt%3B%2520createState()%2520%3D%26gt%3B%2520_WebViewExampleState()%3B%7Dclass%2520_WebViewExampleState%2520extends%2520State%26lt%3BWebViewExample%26gt%3B%2520%7B%2520%2520late%2520final%2520PlatformWebViewController%2520_controller%3B%2520%2520%40override%2520%2520void%2520initState()%2520%7B%2520%2520%2520%2520super.initState()%3B%2520%2520%2520%2520_controller%2520%3D%2520%2520%2520%2520%2520%2520%2520%2520PlatformWebViewController(AndroidWebViewControllerCreationParams())%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setJavaScriptMode(JavaScriptMode.unrestricted)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setBackgroundColor(const%2520Color(0x80000000))%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setPlatformNavigationDelegate(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520PlatformNavigationDelegate(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520const%2520PlatformNavigationDelegateCreationParams()%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnProgress((int%2520progress)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%26%2339%3BWebView%2520is%2520loading%2520(progress%2520%3A%2520%24progress%25)%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnPageStarted((String%2520url)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%26%2339%3BPage%2520started%2520loading%3A%2520%24url%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnPageFinished((String%2520url)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%26%2339%3BPage%2520finished%2520loading%3A%2520%24url%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnHttpError((HttpResponseError%2520error)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3BHTTP%2520error%2520occured%2520on%2520page%3A%2520%24%7Berror.response%3F.statusCode%7D%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnWebResourceError((WebResourceError%2520error)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%26%2339%3B%26%2339%3B%26%2339%3BPage%2520resource%2520error%3A%2520%2520code%3A%2520%24%7Berror.errorCode%7D%2520%2520description%3A%2520%24%7Berror.description%7D%2520%2520errorType%3A%2520%24%7Berror.errorType%7D%2520%2520isForMainFrame%3A%2520%24%7Berror.isForMainFrame%7D%2520%2520url%3A%2520%24%7Berror.url%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2339%3B%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnNavigationRequest((NavigationRequest%2520request)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520if%2520(request.url.contains(%26%2339%3Bpub.dev%26%2339%3B))%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%26%2339%3Bblocking%2520navigation%2520to%2520%24%7Brequest.url%7D%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520NavigationDecision.prevent%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%26%2339%3Ballowing%2520navigation%2520to%2520%24%7Brequest.url%7D%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520NavigationDecision.navigate%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnUrlChange((UrlChange%2520change)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%26%2339%3Burl%2520change%2520to%2520%24%7Bchange.url%7D%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnHttpAuthRequest((HttpAuthRequest%2520request)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520openDialog(request)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnSSlAuthError((PlatformSslAuthError%2520error)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3BSSL%2520error%2520from%2520%24%7B(error%2520as%2520AndroidSslAuthError).url%7D%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520error.cancel()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..addJavaScriptChannel(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520JavaScriptChannelParams(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520name%3A%2520%26%2339%3BToaster%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onMessageReceived%3A%2520(JavaScriptMessage%2520message)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520ScaffoldMessenger.of(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520context%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520).showSnackBar(SnackBar(content%3A%2520Text(message.message)))%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..setOnPlatformPermissionRequest((%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520PlatformWebViewPermissionRequest%2520request%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520debugPrint(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3Brequesting%2520permissions%2520for%2520%24%7Brequest.types.map((WebViewPermissionResourceType%2520type)%2520%3D%26gt%3B%2520type.name)%7D%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520request.grant()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520..loadRequest(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520LoadRequestParams(uri%3A%2520Uri.parse(%26%2339%3Bhttps%3A%26%2347%3B%26%2347%3Bflutter.dev%26%2339%3B))%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520%40override%2520%2520Widget%2520build(BuildContext%2520context)%2520%7B%2520%2520%2520%2520return%2520Scaffold(%2520%2520%2520%2520%2520%2520backgroundColor%3A%2520const%2520Color(0xFF4CAF50)%2C%2520%2520%2520%2520%2520%2520appBar%3A%2520AppBar(%2520%2520%2520%2520%2520%2520%2520%2520title%3A%2520const%2520Text(%26%2339%3BFlutter%2520WebView%2520example%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%26%2347%3B%26%2347%3B%2520This%2520drop%2520down%2520menu%2520demonstrates%2520that%2520Flutter%2520widgets%2520can%2520be%2520shown%2520over%2520the%2520web%2520view.%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%26lt%3BWidget%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520NavigationControls(webViewController%3A%2520_controller)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520SampleMenu(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520webViewController%3A%2520_controller%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520cookieManager%3A%2520widget.cookieManager%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520body%3A%2520PlatformWebViewWidget(%2520%2520%2520%2520%2520%2520%2520%2520PlatformWebViewWidgetCreationParams(controller%3A%2520_controller)%2C%2520%2520%2520%2520%2520%2520).build(context)%2C%2520%2520%2520%2520%2520%2520floatingActionButton%3A%2520favoriteButton()%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Widget%2520favoriteButton()%2520%7B%2520%2520%2520%2520return%2520FloatingActionButton(%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520async%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520final%2520String%3F%2520url%2520%3D%2520await%2520_controller.currentUrl()%3B%2520%2520%2520%2520%2520%2520%2520%2520if%2520(mounted)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520ScaffoldMessenger.of(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520context%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520).showSnackBar(SnackBar(content%3A%2520Text(%26%2339%3BFavorited%2520%24url%26%2339%3B)))%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520child%3A%2520const%2520Icon(Icons.favorite)%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520openDialog(HttpAuthRequest%2520httpRequest)%2520async%2520%7B%2520%2520%2520%2520final%2520usernameTextController%2520%3D%2520TextEditingController()%3B%2520%2520%2520%2520final%2520passwordTextController%2520%3D%2520TextEditingController()%3B%2520%2520%2520%2520return%2520showDialog(%2520%2520%2520%2520%2520%2520context%3A%2520context%2C%2520%2520%2520%2520%2520%2520builder%3A%2520(BuildContext%2520context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520return%2520AlertDialog(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520title%3A%2520Text(%26%2339%3B%24%7BhttpRequest.host%7D%3A%2520%24%7BhttpRequest.realm%2520%3F%3F%2520%26%2339%3B-%26%2339%3B%7D%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520content%3A%2520Column(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520mainAxisSize%3A%2520MainAxisSize.min%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520children%3A%2520%26lt%3BWidget%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520TextField(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520decoration%3A%2520const%2520InputDecoration(labelText%3A%2520%26%2339%3BUsername%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520autofocus%3A%2520true%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520controller%3A%2520usernameTextController%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520TextField(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520decoration%3A%2520const%2520InputDecoration(labelText%3A%2520%26%2339%3BPassword%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520controller%3A%2520passwordTextController%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%26lt%3BWidget%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520TextButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520httpRequest.onProceed(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520WebViewCredential(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520user%3A%2520usernameTextController.text%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520password%3A%2520passwordTextController.text%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(context).pop()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520const%2520Text(%26%2339%3BAuthenticate%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520)%3B%2520%2520%7D%7Denum%2520MenuOptions%2520%7B%2520%2520showUserAgent%2C%2520%2520listCookies%2C%2520%2520clearCookies%2C%2520%2520addToCache%2C%2520%2520listCache%2C%2520%2520clearCache%2C%2520%2520navigationDelegate%2C%2520%2520doPostRequest%2C%2520%2520loadLocalFile%2C%2520%2520loadFlutterAsset%2C%2520%2520loadHtmlString%2C%2520%2520transparentBackground%2C%2520%2520setCookie%2C%2520%2520videoExample%2C%2520%2520logExample%2C%2520%2520basicAuthentication%2C%2520%2520javaScriptAlert%2C%2520%2520viewportMeta%2C%7Dclass%2520SampleMenu%2520extends%2520StatelessWidget%2520%7B%2520%2520SampleMenu(%7B%2520%2520%2520%2520super.key%2C%2520%2520%2520%2520required%2520this.webViewController%2C%2520%2520%2520%2520PlatformWebViewCookieManager%3F%2520cookieManager%2C%2520%2520%7D)%2520%3A%2520cookieManager%2520%3D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520cookieManager%2520%3F%3F%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520PlatformWebViewCookieManager(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520const%2520PlatformWebViewCookieManagerCreationParams()%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520final%2520PlatformWebViewController%2520webViewController%3B%2520%2520late%2520final%2520PlatformWebViewCookieManager%2520cookieManager%3B%2520%2520%40override%2520%2520Widget%2520build(BuildContext%2520context)%2520%7B%2520%2520%2520%2520return%2520PopupMenuButton%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520key%3A%2520const%2520ValueKey%26lt%3BString%26gt%3B(%26%2339%3BShowPopupMenu%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520onSelected%3A%2520(MenuOptions%2520value)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520switch%2520(value)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.showUserAgent%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onShowUserAgent()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.listCookies%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onListCookies(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.clearCookies%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onClearCookies(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.addToCache%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onAddToCache(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.listCache%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onListCache()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.clearCache%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onClearCache(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.navigationDelegate%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onNavigationDelegateExample()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.doPostRequest%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onDoPostRequest()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.loadLocalFile%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onLoadLocalFileExample()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.loadFlutterAsset%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onLoadFlutterAssetExample()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.loadHtmlString%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onLoadHtmlStringExample()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.transparentBackground%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onTransparentBackground()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.setCookie%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onSetCookie()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.videoExample%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onVideoExample(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.logExample%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onLogExample()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.basicAuthentication%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_promptForUrl(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.javaScriptAlert%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onJavaScriptAlertExample(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520case%2520MenuOptions.viewportMeta%3A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520_onViewportMetaExample()%3B%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520itemBuilder%3A%2520(BuildContext%2520context)%2520%3D%26gt%3B%2520%26lt%3BPopupMenuItem%26lt%3BMenuOptions%26gt%3B%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.showUserAgent%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BShow%2520user%2520agent%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.listCookies%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BList%2520cookies%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.clearCookies%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BClear%2520cookies%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.addToCache%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BAdd%2520to%2520cache%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.listCache%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BList%2520cache%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.clearCache%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BClear%2520cache%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.navigationDelegate%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BNavigation%2520Delegate%2520example%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.doPostRequest%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BPost%2520Request%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.loadHtmlString%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BLoad%2520HTML%2520string%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.loadLocalFile%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BLoad%2520local%2520file%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.loadFlutterAsset%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BLoad%2520Flutter%2520Asset%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.setCookie%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BSet%2520cookie%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520key%3A%2520ValueKey%26lt%3BString%26gt%3B(%26%2339%3BShowTransparentBackgroundExample%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.transparentBackground%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BTransparent%2520background%2520example%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.logExample%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BLog%2520example%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.videoExample%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BVideo%2520example%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.basicAuthentication%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BBasic%2520Authentication%2520Example%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.javaScriptAlert%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BJavaScript%2520Alert%2520Example%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520const%2520PopupMenuItem%26lt%3BMenuOptions%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520MenuOptions.viewportMeta%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520Text(%26%2339%3BViewport%2520meta%2520example%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onShowUserAgent()%2520%7B%2520%2520%2520%2520%26%2347%3B%26%2347%3B%2520Send%2520a%2520message%2520with%2520the%2520user%2520agent%2520string%2520to%2520the%2520Toaster%2520JavaScript%2520channel%2520we%2520registered%2520%2520%2520%2520%26%2347%3B%26%2347%3B%2520with%2520the%2520WebView.%2520%2520%2520%2520return%2520webViewController.runJavaScript(%2520%2520%2520%2520%2520%2520%26%2339%3BToaster.postMessage(%26quot%3BUser%2520Agent%3A%2520%26quot%3B%2520%2B%2520navigator.userAgent)%3B%26%2339%3B%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onListCookies(BuildContext%2520context)%2520async%2520%7B%2520%2520%2520%2520final%2520cookies%2520%3D%2520%2520%2520%2520%2520%2520%2520%2520await%2520webViewController.runJavaScriptReturningResult(%26%2339%3Bdocument.cookie%26%2339%3B)%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520as%2520String%3B%2520%2520%2520%2520if%2520(context.mounted)%2520%7B%2520%2520%2520%2520%2520%2520ScaffoldMessenger.of(context).showSnackBar(%2520%2520%2520%2520%2520%2520%2520%2520SnackBar(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520content%3A%2520Column(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520mainAxisAlignment%3A%2520MainAxisAlignment.end%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520mainAxisSize%3A%2520MainAxisSize.min%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520children%3A%2520%26lt%3BWidget%26gt%3B%5Bconst%2520Text(%26%2339%3BCookies%3A%26%2339%3B)%2C%2520_getCookieList(cookies)%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%7D%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onAddToCache(BuildContext%2520context)%2520async%2520%7B%2520%2520%2520%2520await%2520webViewController.runJavaScript(%2520%2520%2520%2520%2520%2520%26%2339%3Bcaches.open(%26quot%3Btest_caches_entry%26quot%3B)%3B%2520localStorage%5B%26quot%3Btest_localStorage%26quot%3B%5D%2520%3D%2520%26quot%3Bdummy_entry%26quot%3B%3B%26%2339%3B%2C%2520%2520%2520%2520)%3B%2520%2520%2520%2520if%2520(context.mounted)%2520%7B%2520%2520%2520%2520%2520%2520ScaffoldMessenger.of(context).showSnackBar(%2520%2520%2520%2520%2520%2520%2520%2520const%2520SnackBar(content%3A%2520Text(%26%2339%3BAdded%2520a%2520test%2520entry%2520to%2520cache.%26%2339%3B))%2C%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%7D%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onListCache()%2520%7B%2520%2520%2520%2520return%2520webViewController.runJavaScript(%2520%2520%2520%2520%2520%2520%26%2339%3Bcaches.keys()%26%2339%3B%2520%2520%2520%2520%2520%2520%26%2347%3B%26%2347%3B%2520ignore%3A%2520missing_whitespace_between_adjacent_strings%2520%2520%2520%2520%2520%2520%26%2339%3B.then((cacheKeys)%2520%3D%26gt%3B%2520JSON.stringify(%7B%26quot%3BcacheKeys%26quot%3B%2520%3A%2520cacheKeys%2C%2520%26quot%3BlocalStorage%26quot%3B%2520%3A%2520localStorage%7D))%26%2339%3B%2520%2520%2520%2520%2520%2520%26%2339%3B.then((caches)%2520%3D%26gt%3B%2520Toaster.postMessage(caches))%26%2339%3B%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onClearCache(BuildContext%2520context)%2520async%2520%7B%2520%2520%2520%2520await%2520webViewController.clearCache()%3B%2520%2520%2520%2520await%2520webViewController.clearLocalStorage()%3B%2520%2520%2520%2520if%2520(context.mounted)%2520%7B%2520%2520%2520%2520%2520%2520ScaffoldMessenger.of(%2520%2520%2520%2520%2520%2520%2520%2520context%2C%2520%2520%2520%2520%2520%2520).showSnackBar(const%2520SnackBar(content%3A%2520Text(%26%2339%3BCache%2520cleared.%26%2339%3B)))%3B%2520%2520%2520%2520%7D%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onClearCookies(BuildContext%2520context)%2520async%2520%7B%2520%2520%2520%2520final%2520bool%2520hadCookies%2520%3D%2520await%2520cookieManager.clearCookies()%3B%2520%2520%2520%2520var%2520message%2520%3D%2520%26%2339%3BThere%2520were%2520cookies.%2520Now%2C%2520they%2520are%2520gone!%26%2339%3B%3B%2520%2520%2520%2520if%2520(!hadCookies)%2520%7B%2520%2520%2520%2520%2520%2520message%2520%3D%2520%26%2339%3BThere%2520are%2520no%2520cookies.%26%2339%3B%3B%2520%2520%2520%2520%7D%2520%2520%2520%2520if%2520(context.mounted)%2520%7B%2520%2520%2520%2520%2520%2520ScaffoldMessenger.of(%2520%2520%2520%2520%2520%2520%2520%2520context%2C%2520%2520%2520%2520%2520%2520).showSnackBar(SnackBar(content%3A%2520Text(message)))%3B%2520%2520%2520%2520%7D%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onNavigationDelegateExample()%2520%7B%2520%2520%2520%2520final%2520String%2520contentBase64%2520%3D%2520base64Encode(%2520%2520%2520%2520%2520%2520const%2520Utf8Encoder().convert(kNavigationExamplePage)%2C%2520%2520%2520%2520)%3B%2520%2520%2520%2520return%2520webViewController.loadRequest(%2520%2520%2520%2520%2520%2520LoadRequestParams(uri%3A%2520Uri.parse(%26%2339%3Bdata%3Atext%26%2347%3Bhtml%3Bbase64%2C%24contentBase64%26%2339%3B))%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onSetCookie()%2520async%2520%7B%2520%2520%2520%2520await%2520cookieManager.setCookie(%2520%2520%2520%2520%2520%2520const%2520WebViewCookie(%2520%2520%2520%2520%2520%2520%2520%2520name%3A%2520%26%2339%3Bfoo%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520value%3A%2520%26%2339%3Bbar%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520domain%3A%2520%26%2339%3Bhttpbin.org%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520path%3A%2520%26%2339%3B%26%2347%3Banything%26%2339%3B%2C%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520)%3B%2520%2520%2520%2520await%2520webViewController.loadRequest(%2520%2520%2520%2520%2520%2520LoadRequestParams(uri%3A%2520Uri.parse(%26%2339%3Bhttps%3A%26%2347%3B%26%2347%3Bhttpbin.org%26%2347%3Banything%26%2339%3B))%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onVideoExample(BuildContext%2520context)%2520%7B%2520%2520%2520%2520final%2520androidController%2520%3D%2520webViewController%2520as%2520AndroidWebViewController%3B%2520%2520%2520%2520%26%2347%3B%26%2347%3B%2520%23docregion%2520fullscreen_example%2520%2520%2520%2520androidController.setCustomWidgetCallbacks(%2520%2520%2520%2520%2520%2520onShowCustomWidget%3A%2520(Widget%2520widget%2C%2520OnHideCustomWidgetCallback%2520callback)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(context).push(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520MaterialPageRoute%26lt%3Bvoid%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520builder%3A%2520(BuildContext%2520context)%2520%3D%26gt%3B%2520widget%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520fullscreenDialog%3A%2520true%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520onHideCustomWidget%3A%2520()%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(context).pop()%3B%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520)%3B%2520%2520%2520%2520%26%2347%3B%26%2347%3B%2520%23enddocregion%2520fullscreen_example%2520%2520%2520%2520return%2520androidController.loadRequest(%2520%2520%2520%2520%2520%2520LoadRequestParams(%2520%2520%2520%2520%2520%2520%2520%2520uri%3A%2520Uri.parse(%26%2339%3Bhttps%3A%26%2347%3B%26%2347%3Bwww.youtube.com%26%2347%3Bwatch%3Fv%3D4AoFA19gbLo%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onDoPostRequest()%2520%7B%2520%2520%2520%2520return%2520webViewController.loadRequest(%2520%2520%2520%2520%2520%2520LoadRequestParams(%2520%2520%2520%2520%2520%2520%2520%2520uri%3A%2520Uri.parse(%26%2339%3Bhttps%3A%26%2347%3B%26%2347%3Bhttpbin.org%26%2347%3Bpost%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520method%3A%2520LoadRequestMethod.post%2C%2520%2520%2520%2520%2520%2520%2520%2520headers%3A%2520const%2520%26lt%3BString%2C%2520String%26gt%3B%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3Bfoo%26%2339%3B%3A%2520%26%2339%3Bbar%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3BContent-Type%26%2339%3B%3A%2520%26%2339%3Btext%26%2347%3Bplain%26%2339%3B%2C%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520body%3A%2520Uint8List.fromList(%26%2339%3BTest%2520Body%26%2339%3B.codeUnits)%2C%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onLoadLocalFileExample()%2520async%2520%7B%2520%2520%2520%2520final%2520String%2520pathToIndex%2520%3D%2520await%2520_prepareLocalFile()%3B%2520%2520%2520%2520await%2520webViewController.loadFile(pathToIndex)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onLoadFlutterAssetExample()%2520%7B%2520%2520%2520%2520return%2520webViewController.loadFlutterAsset(%26%2339%3Bassets%26%2347%3Bwww%26%2347%3Bindex.html%26%2339%3B)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onLoadHtmlStringExample()%2520%7B%2520%2520%2520%2520return%2520webViewController.loadHtmlString(kLocalExamplePage)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onTransparentBackground()%2520%7B%2520%2520%2520%2520return%2520webViewController.loadHtmlString(kTransparentBackgroundPage)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onJavaScriptAlertExample(BuildContext%2520context)%2520%7B%2520%2520%2520%2520webViewController.setOnJavaScriptAlertDialog((%2520%2520%2520%2520%2520%2520JavaScriptAlertDialogRequest%2520request%2C%2520%2520%2520%2520)%2520async%2520%7B%2520%2520%2520%2520%2520%2520await%2520_showAlert(context%2C%2520request.message)%3B%2520%2520%2520%2520%7D)%3B%2520%2520%2520%2520webViewController.setOnJavaScriptConfirmDialog((%2520%2520%2520%2520%2520%2520JavaScriptConfirmDialogRequest%2520request%2C%2520%2520%2520%2520)%2520async%2520%7B%2520%2520%2520%2520%2520%2520final%2520bool%2520result%2520%3D%2520await%2520_showConfirm(context%2C%2520request.message)%3B%2520%2520%2520%2520%2520%2520return%2520result%3B%2520%2520%2520%2520%7D)%3B%2520%2520%2520%2520webViewController.setOnJavaScriptTextInputDialog((%2520%2520%2520%2520%2520%2520JavaScriptTextInputDialogRequest%2520request%2C%2520%2520%2520%2520)%2520async%2520%7B%2520%2520%2520%2520%2520%2520final%2520String%2520result%2520%3D%2520await%2520_showTextInput(%2520%2520%2520%2520%2520%2520%2520%2520context%2C%2520%2520%2520%2520%2520%2520%2520%2520request.message%2C%2520%2520%2520%2520%2520%2520%2520%2520request.defaultText%2C%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520return%2520result%3B%2520%2520%2520%2520%7D)%3B%2520%2520%2520%2520return%2520webViewController.loadHtmlString(kAlertTestPage)%3B%2520%2520%7D%2520%2520Widget%2520_getCookieList(String%2520cookies)%2520%7B%2520%2520%2520%2520if%2520(cookies%2520%3D%3D%2520%26%2339%3B%26quot%3B%26quot%3B%26%2339%3B)%2520%7B%2520%2520%2520%2520%2520%2520return%2520Container()%3B%2520%2520%2520%2520%7D%2520%2520%2520%2520final%2520List%26lt%3BString%26gt%3B%2520cookieList%2520%3D%2520cookies.split(%26%2339%3B%3B%26%2339%3B)%3B%2520%2520%2520%2520final%2520Iterable%26lt%3BText%26gt%3B%2520cookieWidgets%2520%3D%2520cookieList.map(%2520%2520%2520%2520%2520%2520(String%2520cookie)%2520%3D%26gt%3B%2520Text(cookie)%2C%2520%2520%2520%2520)%3B%2520%2520%2520%2520return%2520Column(%2520%2520%2520%2520%2520%2520mainAxisAlignment%3A%2520MainAxisAlignment.end%2C%2520%2520%2520%2520%2520%2520mainAxisSize%3A%2520MainAxisSize.min%2C%2520%2520%2520%2520%2520%2520children%3A%2520cookieWidgets.toList()%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520static%2520Future%26lt%3BString%26gt%3B%2520_prepareLocalFile()%2520async%2520%7B%2520%2520%2520%2520final%2520String%2520tmpDir%2520%3D%2520(await%2520getTemporaryDirectory()).path%3B%2520%2520%2520%2520final%2520indexFile%2520%3D%2520File(%2520%2520%2520%2520%2520%2520%26lt%3BString%26gt%3B%7BtmpDir%2C%2520%26%2339%3Bwww%26%2339%3B%2C%2520%26%2339%3Bindex.html%26%2339%3B%7D.join(Platform.pathSeparator)%2C%2520%2520%2520%2520)%3B%2520%2520%2520%2520await%2520indexFile.create(recursive%3A%2520true)%3B%2520%2520%2520%2520await%2520indexFile.writeAsString(kLocalExamplePage)%3B%2520%2520%2520%2520return%2520indexFile.path%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onLogExample()%2520%7B%2520%2520%2520%2520webViewController.setOnConsoleMessage((%2520%2520%2520%2520%2520%2520JavaScriptConsoleMessage%2520consoleMessage%2C%2520%2520%2520%2520)%2520%7B%2520%2520%2520%2520%2520%2520debugPrint(%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%3D%3D%2520JS%2520%3D%3D%2520%24%7BconsoleMessage.level.name%7D%3A%2520%24%7BconsoleMessage.message%7D%26%2339%3B%2C%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%7D)%3B%2520%2520%2520%2520return%2520webViewController.loadHtmlString(kLogExamplePage)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_promptForUrl(BuildContext%2520context)%2520%7B%2520%2520%2520%2520final%2520urlTextController%2520%3D%2520TextEditingController()%3B%2520%2520%2520%2520return%2520showDialog%26lt%3BString%26gt%3B(%2520%2520%2520%2520%2520%2520context%3A%2520context%2C%2520%2520%2520%2520%2520%2520builder%3A%2520(BuildContext%2520context)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520return%2520AlertDialog(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520title%3A%2520const%2520Text(%26%2339%3BInput%2520URL%2520to%2520visit%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520content%3A%2520TextField(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520decoration%3A%2520const%2520InputDecoration(labelText%3A%2520%26%2339%3BURL%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520autofocus%3A%2520true%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520controller%3A%2520urlTextController%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%26lt%3BWidget%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520TextButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520if%2520(urlTextController.text.isNotEmpty)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520final%2520Uri%3F%2520uri%2520%3D%2520Uri.tryParse(urlTextController.text)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520if%2520(uri%2520!%3D%2520null%2520%26amp%3B%26amp%3B%2520uri.scheme.isNotEmpty)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520webViewController.loadRequest(LoadRequestParams(uri%3A%2520uri))%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.pop(context)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520const%2520Text(%26%2339%3BVisit%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_showAlert(BuildContext%2520context%2C%2520String%2520message)%2520async%2520%7B%2520%2520%2520%2520return%2520showDialog%26lt%3Bvoid%26gt%3B(%2520%2520%2520%2520%2520%2520context%3A%2520context%2C%2520%2520%2520%2520%2520%2520builder%3A%2520(BuildContext%2520ctx)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520return%2520AlertDialog(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520content%3A%2520Text(message)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%26lt%3BWidget%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520TextButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(ctx).pop()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520const%2520Text(%26%2339%3BOK%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520)%3B%2520%2520%7D%2520%2520Future%26lt%3Bbool%26gt%3B%2520_showConfirm(BuildContext%2520context%2C%2520String%2520message)%2520async%2520%7B%2520%2520%2520%2520return%2520await%2520showDialog%26lt%3Bbool%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520context%3A%2520context%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520builder%3A%2520(BuildContext%2520ctx)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520AlertDialog(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520content%3A%2520Text(message)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%26lt%3BWidget%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520TextButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(ctx).pop(false)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520const%2520Text(%26%2339%3BCancel%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520TextButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(ctx).pop(true)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520const%2520Text(%26%2339%3BOK%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2520%3F%3F%2520%2520%2520%2520%2520%2520%2520%2520false%3B%2520%2520%7D%2520%2520Future%26lt%3BString%26gt%3B%2520_showTextInput(%2520%2520%2520%2520BuildContext%2520context%2C%2520%2520%2520%2520String%2520message%2C%2520%2520%2520%2520String%3F%2520defaultText%2C%2520%2520)%2520async%2520%7B%2520%2520%2520%2520return%2520await%2520showDialog%26lt%3BString%26gt%3B(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520context%3A%2520context%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520builder%3A%2520(BuildContext%2520ctx)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520AlertDialog(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520content%3A%2520Text(message)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520actions%3A%2520%26lt%3BWidget%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520TextButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520Navigator.of(ctx).pop(%26%2339%3BText%2520test%26%2339%3B)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520child%3A%2520const%2520Text(%26%2339%3BEnter%26%2339%3B)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2520%3F%3F%2520%2520%2520%2520%2520%2520%2520%2520%26%2339%3B%26%2339%3B%3B%2520%2520%7D%2520%2520Future%26lt%3Bvoid%26gt%3B%2520_onViewportMetaExample()%2520%7B%2520%2520%2520%2520return%2520webViewController.loadHtmlString(kViewportMetaPage)%3B%2520%2520%7D%7Dclass%2520NavigationControls%2520extends%2520StatelessWidget%2520%7B%2520%2520const%2520NavigationControls(%7Bsuper.key%2C%2520required%2520this.webViewController%7D)%3B%2520%2520final%2520PlatformWebViewController%2520webViewController%3B%2520%2520%40override%2520%2520Widget%2520build(BuildContext%2520context)%2520%7B%2520%2520%2520%2520return%2520Row(%2520%2520%2520%2520%2520%2520children%3A%2520%26lt%3BWidget%26gt%3B%5B%2520%2520%2520%2520%2520%2520%2520%2520IconButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520icon%3A%2520const%2520Icon(Icons.arrow_back_ios)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520async%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520if%2520(await%2520webViewController.canGoBack())%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520await%2520webViewController.goBack()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520else%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520if%2520(context.mounted)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520ScaffoldMessenger.of(context).showSnackBar(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520const%2520SnackBar(content%3A%2520Text(%26%2339%3BNo%2520back%2520history%2520item%26%2339%3B))%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520IconButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520icon%3A%2520const%2520Icon(Icons.arrow_forward_ios)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520async%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520if%2520(await%2520webViewController.canGoForward())%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520await%2520webViewController.goForward()%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520else%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520if%2520(context.mounted)%2520%7B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520ScaffoldMessenger.of(context).showSnackBar(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520const%2520SnackBar(content%3A%2520Text(%26%2339%3BNo%2520forward%2520history%2520item%26%2339%3B))%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520)%3B%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%2520%2520IconButton(%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520icon%3A%2520const%2520Icon(Icons.replay)%2C%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520onPressed%3A%2520()%2520%3D%26gt%3B%2520webViewController.reload()%2C%2520%2520%2520%2520%2520%2520%2520%2520)%2C%2520%2520%2520%2520%2520%2520%5D%2C%2520%2520%2520%2520)%3B%2520%2520%7D%7D%253C%2Fcode">