@@ -23,17 +23,37 @@ class WebViewExample extends StatelessWidget {
2323 SampleMenu (_controller.future),
2424 ],
2525 ),
26- body: WebView (
27- initialUrl: 'https://flutter.io' ,
28- javascriptMode: JavascriptMode .unrestricted,
29- onWebViewCreated: (WebViewController webViewController) {
30- _controller.complete (webViewController);
31- },
26+ // We're using a Builder here so we have a context that is below the Scaffold
27+ // to allow calling Scaffold.maketoast
28+ body: Builder (
29+ builder: (BuildContext context) {
30+ return WebView (
31+ initialUrl: 'https://flutter.io' ,
32+ javascriptMode: JavascriptMode .unrestricted,
33+ onWebViewCreated: (WebViewController webViewController) {
34+ _controller.complete (webViewController);
35+ },
36+ javascriptChannels: < JavascriptChannel > [
37+ _toasterJavascriptChannel (context),
38+ ].toSet (),
39+ );
40+ }
3241 ),
3342 floatingActionButton: favoriteButton (),
3443 );
3544 }
3645
46+ JavascriptChannel _toasterJavascriptChannel (BuildContext context) {
47+ return JavascriptChannel (
48+ name: 'Toaster' ,
49+ onMessageReceived: (JavascriptMessage message) {
50+ Scaffold .of (context).showSnackBar (
51+ SnackBar (content: Text (message.message)),
52+ );
53+ }
54+ );
55+ }
56+
3757 Widget favoriteButton () {
3858 return FutureBuilder <WebViewController >(
3959 future: _controller.future,
@@ -44,7 +64,7 @@ class WebViewExample extends StatelessWidget {
4464 onPressed: () async {
4565 final String url = await controller.data.currentUrl ();
4666 Scaffold .of (context).showSnackBar (
47- SnackBar (content: Text (" Favorited $url " )),
67+ SnackBar (content: Text (' Favorited $url ' )),
4868 );
4969 },
5070 child: const Icon (Icons .favorite),
@@ -56,7 +76,7 @@ class WebViewExample extends StatelessWidget {
5676}
5777
5878enum MenuOptions {
59- evaluateJavascript ,
79+ showUserAgent ,
6080 toast,
6181}
6282
@@ -73,8 +93,8 @@ class SampleMenu extends StatelessWidget {
7393 return PopupMenuButton <MenuOptions >(
7494 onSelected: (MenuOptions value) {
7595 switch (value) {
76- case MenuOptions .evaluateJavascript :
77- _onEvaluateJavascript (controller.data, context);
96+ case MenuOptions .showUserAgent :
97+ _onShowUserAgent (controller.data, context);
7898 break ;
7999 case MenuOptions .toast:
80100 Scaffold .of (context).showSnackBar (
@@ -87,8 +107,8 @@ class SampleMenu extends StatelessWidget {
87107 },
88108 itemBuilder: (BuildContext context) => < PopupMenuItem <MenuOptions >> [
89109 PopupMenuItem <MenuOptions >(
90- value: MenuOptions .evaluateJavascript ,
91- child: const Text ('Evaluate JavaScript ' ),
110+ value: MenuOptions .showUserAgent ,
111+ child: const Text ('Show user agent ' ),
92112 enabled: controller.hasData,
93113 ),
94114 const PopupMenuItem <MenuOptions >(
@@ -101,15 +121,11 @@ class SampleMenu extends StatelessWidget {
101121 );
102122 }
103123
104- void _onEvaluateJavascript (
124+ void _onShowUserAgent (
105125 WebViewController controller, BuildContext context) async {
106- final String result = await controller
107- .evaluateJavascript ("document.body.style.backgroundColor = 'red'" );
108- Scaffold .of (context).showSnackBar (
109- SnackBar (
110- content: Text ('JavaScript evaluated, the result is: $result ' ),
111- ),
112- );
126+ // Send a message with the user agent string to the Toaster JavaScript channel we registered
127+ // with the WebView.
128+ controller.evaluateJavascript ('Toaster.postMessage("User Agent: " + navigator.userAgent);' );
113129 }
114130}
115131
0 commit comments