Skip to content

Commit b9ea303

Browse files
authored
[webview_flutter] Migrate deprecated Scaffold snackbars (flutter#5150)
1 parent 7b94e2f commit b9ea303

10 files changed

Lines changed: 168 additions & 142 deletions

File tree

packages/webview_flutter/webview_flutter/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
## NEXT
1+
## 3.0.2
22

3+
* Migrates deprecated `Scaffold.showSnackBar` to `ScaffoldMessenger` in example app.
34
* Adds OS version support information to README.
45

56
## 3.0.1

packages/webview_flutter/webview_flutter/example/lib/main.dart

Lines changed: 64 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import 'package:flutter/material.dart';
1313
import 'package:path_provider/path_provider.dart';
1414
import 'package:webview_flutter/webview_flutter.dart';
1515

16-
void main() => runApp(MaterialApp(home: WebViewExample()));
16+
void main() => runApp(const MaterialApp(home: WebViewExample()));
1717

1818
const String kNavigationExamplePage = '''
1919
<!DOCTYPE html><html>
@@ -71,6 +71,10 @@ const String kTransparentBackgroundPage = '''
7171
''';
7272

7373
class WebViewExample extends StatefulWidget {
74+
const WebViewExample({this.cookieManager});
75+
76+
final CookieManager? cookieManager;
77+
7478
@override
7579
_WebViewExampleState createState() => _WebViewExampleState();
7680
}
@@ -96,42 +100,38 @@ class _WebViewExampleState extends State<WebViewExample> {
96100
// This drop down menu demonstrates that Flutter widgets can be shown over the web view.
97101
actions: <Widget>[
98102
NavigationControls(_controller.future),
99-
SampleMenu(_controller.future),
103+
SampleMenu(_controller.future, widget.cookieManager),
100104
],
101105
),
102-
// We're using a Builder here so we have a context that is below the Scaffold
103-
// to allow calling Scaffold.of(context) so we can show a snackbar.
104-
body: Builder(builder: (BuildContext context) {
105-
return WebView(
106-
initialUrl: 'https://flutter.dev',
107-
javascriptMode: JavascriptMode.unrestricted,
108-
onWebViewCreated: (WebViewController webViewController) {
109-
_controller.complete(webViewController);
110-
},
111-
onProgress: (int progress) {
112-
print('WebView is loading (progress : $progress%)');
113-
},
114-
javascriptChannels: <JavascriptChannel>{
115-
_toasterJavascriptChannel(context),
116-
},
117-
navigationDelegate: (NavigationRequest request) {
118-
if (request.url.startsWith('https://www.youtube.com/')) {
119-
print('blocking navigation to $request}');
120-
return NavigationDecision.prevent;
121-
}
122-
print('allowing navigation to $request');
123-
return NavigationDecision.navigate;
124-
},
125-
onPageStarted: (String url) {
126-
print('Page started loading: $url');
127-
},
128-
onPageFinished: (String url) {
129-
print('Page finished loading: $url');
130-
},
131-
gestureNavigationEnabled: true,
132-
backgroundColor: const Color(0x00000000),
133-
);
134-
}),
106+
body: WebView(
107+
initialUrl: 'https://flutter.dev',
108+
javascriptMode: JavascriptMode.unrestricted,
109+
onWebViewCreated: (WebViewController webViewController) {
110+
_controller.complete(webViewController);
111+
},
112+
onProgress: (int progress) {
113+
print('WebView is loading (progress : $progress%)');
114+
},
115+
javascriptChannels: <JavascriptChannel>{
116+
_toasterJavascriptChannel(context),
117+
},
118+
navigationDelegate: (NavigationRequest request) {
119+
if (request.url.startsWith('https://www.youtube.com/')) {
120+
print('blocking navigation to $request}');
121+
return NavigationDecision.prevent;
122+
}
123+
print('allowing navigation to $request');
124+
return NavigationDecision.navigate;
125+
},
126+
onPageStarted: (String url) {
127+
print('Page started loading: $url');
128+
},
129+
onPageFinished: (String url) {
130+
print('Page finished loading: $url');
131+
},
132+
gestureNavigationEnabled: true,
133+
backgroundColor: const Color(0x00000000),
134+
),
135135
floatingActionButton: favoriteButton(),
136136
);
137137
}
@@ -140,8 +140,7 @@ class _WebViewExampleState extends State<WebViewExample> {
140140
return JavascriptChannel(
141141
name: 'Toaster',
142142
onMessageReceived: (JavascriptMessage message) {
143-
// ignore: deprecated_member_use
144-
Scaffold.of(context).showSnackBar(
143+
ScaffoldMessenger.of(context).showSnackBar(
145144
SnackBar(content: Text(message.message)),
146145
);
147146
});
@@ -152,19 +151,24 @@ class _WebViewExampleState extends State<WebViewExample> {
152151
future: _controller.future,
153152
builder: (BuildContext context,
154153
AsyncSnapshot<WebViewController> controller) {
155-
if (controller.hasData) {
156-
return FloatingActionButton(
157-
onPressed: () async {
158-
final String url = (await controller.data!.currentUrl())!;
159-
// ignore: deprecated_member_use
160-
Scaffold.of(context).showSnackBar(
161-
SnackBar(content: Text('Favorited $url')),
162-
);
163-
},
164-
child: const Icon(Icons.favorite),
165-
);
166-
}
167-
return Container();
154+
return FloatingActionButton(
155+
onPressed: () async {
156+
String? url;
157+
if (controller.hasData) {
158+
url = (await controller.data!.currentUrl())!;
159+
}
160+
ScaffoldMessenger.of(context).showSnackBar(
161+
SnackBar(
162+
content: Text(
163+
controller.hasData
164+
? 'Favorited $url'
165+
: 'Unable to favorite',
166+
),
167+
),
168+
);
169+
},
170+
child: const Icon(Icons.favorite),
171+
);
168172
});
169173
}
170174
}
@@ -186,10 +190,11 @@ enum MenuOptions {
186190
}
187191

188192
class SampleMenu extends StatelessWidget {
189-
SampleMenu(this.controller);
193+
SampleMenu(this.controller, CookieManager? cookieManager)
194+
: cookieManager = cookieManager ?? CookieManager();
190195

191196
final Future<WebViewController> controller;
192-
final CookieManager cookieManager = CookieManager();
197+
late final CookieManager cookieManager;
193198

194199
@override
195200
Widget build(BuildContext context) {
@@ -315,8 +320,7 @@ class SampleMenu extends StatelessWidget {
315320
WebViewController controller, BuildContext context) async {
316321
final String cookies =
317322
await controller.runJavascriptReturningResult('document.cookie');
318-
// ignore: deprecated_member_use
319-
Scaffold.of(context).showSnackBar(SnackBar(
323+
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
320324
content: Column(
321325
mainAxisAlignment: MainAxisAlignment.end,
322326
mainAxisSize: MainAxisSize.min,
@@ -332,8 +336,7 @@ class SampleMenu extends StatelessWidget {
332336
WebViewController controller, BuildContext context) async {
333337
await controller.runJavascript(
334338
'caches.open("test_caches_entry"); localStorage["test_localStorage"] = "dummy_entry";');
335-
// ignore: deprecated_member_use
336-
Scaffold.of(context).showSnackBar(const SnackBar(
339+
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
337340
content: Text('Added a test entry to cache.'),
338341
));
339342
}
@@ -348,8 +351,7 @@ class SampleMenu extends StatelessWidget {
348351
Future<void> _onClearCache(
349352
WebViewController controller, BuildContext context) async {
350353
await controller.clearCache();
351-
// ignore: deprecated_member_use
352-
Scaffold.of(context).showSnackBar(const SnackBar(
354+
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
353355
content: Text('Cache cleared.'),
354356
));
355357
}
@@ -360,8 +362,7 @@ class SampleMenu extends StatelessWidget {
360362
if (!hadCookies) {
361363
message = 'There are no cookies.';
362364
}
363-
// ignore: deprecated_member_use
364-
Scaffold.of(context).showSnackBar(SnackBar(
365+
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
365366
content: Text(message),
366367
));
367368
}
@@ -375,7 +376,7 @@ class SampleMenu extends StatelessWidget {
375376

376377
Future<void> _onSetCookie(
377378
WebViewController controller, BuildContext context) async {
378-
await CookieManager().setCookie(
379+
await cookieManager.setCookie(
379380
const WebViewCookie(
380381
name: 'foo', value: 'bar', domain: 'httpbin.org', path: '/anything'),
381382
);
@@ -466,8 +467,7 @@ class NavigationControls extends StatelessWidget {
466467
if (await controller!.canGoBack()) {
467468
await controller.goBack();
468469
} else {
469-
// ignore: deprecated_member_use
470-
Scaffold.of(context).showSnackBar(
470+
ScaffoldMessenger.of(context).showSnackBar(
471471
const SnackBar(content: Text('No back history item')),
472472
);
473473
return;
@@ -482,8 +482,7 @@ class NavigationControls extends StatelessWidget {
482482
if (await controller!.canGoForward()) {
483483
await controller.goForward();
484484
} else {
485-
// ignore: deprecated_member_use
486-
Scaffold.of(context).showSnackBar(
485+
ScaffoldMessenger.of(context).showSnackBar(
487486
const SnackBar(
488487
content: Text('No forward history item')),
489488
);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'package:flutter/material.dart';
6+
import 'package:flutter_test/flutter_test.dart';
7+
import 'package:webview_flutter/webview_flutter.dart';
8+
import 'package:webview_flutter_example/main.dart';
9+
10+
void main() {
11+
testWidgets('Test snackbar from ScaffoldMessenger',
12+
(WidgetTester tester) async {
13+
await tester.pumpWidget(
14+
MaterialApp(
15+
home: WebViewExample(cookieManager: FakeCookieManager()),
16+
),
17+
);
18+
expect(find.byIcon(Icons.favorite), findsOneWidget);
19+
await tester.tap(find.byIcon(Icons.favorite));
20+
await tester.pump();
21+
expect(find.byType(SnackBar), findsOneWidget);
22+
});
23+
}
24+
25+
class FakeCookieManager implements CookieManager {
26+
factory FakeCookieManager() {
27+
return _instance ??= FakeCookieManager._();
28+
}
29+
30+
FakeCookieManager._();
31+
32+
static FakeCookieManager? _instance;
33+
34+
@override
35+
Future<bool> clearCookies() => throw UnimplementedError();
36+
37+
@override
38+
Future<void> setCookie(WebViewCookie cookie) => throw UnimplementedError();
39+
}

packages/webview_flutter/webview_flutter/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: webview_flutter
22
description: A Flutter plugin that provides a WebView widget on Android and iOS.
33
repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
5-
version: 3.0.1
5+
version: 3.0.2
66

77
environment:
88
sdk: ">=2.14.0 <3.0.0"

packages/webview_flutter/webview_flutter_android/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.8.5
2+
3+
* Migrates deprecated `Scaffold.showSnackBar` to `ScaffoldMessenger` in example app.
4+
15
## 2.8.4
26

37
* Fixes bug preventing `mockito` code generation for tests.

0 commit comments

Comments
 (0)