Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit cf433da

Browse files
committed
Use JavascriptChannels in the example app
1 parent 59e1248 commit cf433da

1 file changed

Lines changed: 36 additions & 20 deletions

File tree

  • packages/webview_flutter/example/lib

packages/webview_flutter/example/lib/main.dart

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5878
enum 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

Comments
 (0)