[webview_flutter] Migrate deprecated Scaffold snackbars (#5150)
diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md
index dde4472..f8a6e25 100644
--- a/packages/webview_flutter/webview_flutter/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 3.0.2
+* Migrates deprecated `Scaffold.showSnackBar` to `ScaffoldMessenger` in example app.
* Adds OS version support information to README.
## 3.0.1
diff --git a/packages/webview_flutter/webview_flutter/example/lib/main.dart b/packages/webview_flutter/webview_flutter/example/lib/main.dart
index 88c240a..51080be 100644
--- a/packages/webview_flutter/webview_flutter/example/lib/main.dart
+++ b/packages/webview_flutter/webview_flutter/example/lib/main.dart
@@ -13,7 +13,7 @@
import 'package:path_provider/path_provider.dart';
import 'package:webview_flutter/webview_flutter.dart';
-void main() => runApp(MaterialApp(home: WebViewExample()));
+void main() => runApp(const MaterialApp(home: WebViewExample()));
const String kNavigationExamplePage = '''
<!DOCTYPE html><html>
@@ -71,6 +71,10 @@
''';
class WebViewExample extends StatefulWidget {
+ const WebViewExample({this.cookieManager});
+
+ final CookieManager? cookieManager;
+
@override
_WebViewExampleState createState() => _WebViewExampleState();
}
@@ -96,42 +100,38 @@
// This drop down menu demonstrates that Flutter widgets can be shown over the web view.
actions: <Widget>[
NavigationControls(_controller.future),
- SampleMenu(_controller.future),
+ SampleMenu(_controller.future, widget.cookieManager),
],
),
- // We're using a Builder here so we have a context that is below the Scaffold
- // to allow calling Scaffold.of(context) so we can show a snackbar.
- body: Builder(builder: (BuildContext context) {
- return WebView(
- initialUrl: 'https://flutter.dev',
- javascriptMode: JavascriptMode.unrestricted,
- onWebViewCreated: (WebViewController webViewController) {
- _controller.complete(webViewController);
- },
- onProgress: (int progress) {
- print('WebView is loading (progress : $progress%)');
- },
- javascriptChannels: <JavascriptChannel>{
- _toasterJavascriptChannel(context),
- },
- navigationDelegate: (NavigationRequest request) {
- if (request.url.startsWith('https://www.youtube.com/')) {
- print('blocking navigation to $request}');
- return NavigationDecision.prevent;
- }
- print('allowing navigation to $request');
- return NavigationDecision.navigate;
- },
- onPageStarted: (String url) {
- print('Page started loading: $url');
- },
- onPageFinished: (String url) {
- print('Page finished loading: $url');
- },
- gestureNavigationEnabled: true,
- backgroundColor: const Color(0x00000000),
- );
- }),
+ body: WebView(
+ initialUrl: 'https://flutter.dev',
+ javascriptMode: JavascriptMode.unrestricted,
+ onWebViewCreated: (WebViewController webViewController) {
+ _controller.complete(webViewController);
+ },
+ onProgress: (int progress) {
+ print('WebView is loading (progress : $progress%)');
+ },
+ javascriptChannels: <JavascriptChannel>{
+ _toasterJavascriptChannel(context),
+ },
+ navigationDelegate: (NavigationRequest request) {
+ if (request.url.startsWith('https://www.youtube.com/')) {
+ print('blocking navigation to $request}');
+ return NavigationDecision.prevent;
+ }
+ print('allowing navigation to $request');
+ return NavigationDecision.navigate;
+ },
+ onPageStarted: (String url) {
+ print('Page started loading: $url');
+ },
+ onPageFinished: (String url) {
+ print('Page finished loading: $url');
+ },
+ gestureNavigationEnabled: true,
+ backgroundColor: const Color(0x00000000),
+ ),
floatingActionButton: favoriteButton(),
);
}
@@ -140,8 +140,7 @@
return JavascriptChannel(
name: 'Toaster',
onMessageReceived: (JavascriptMessage message) {
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
});
@@ -152,19 +151,24 @@
future: _controller.future,
builder: (BuildContext context,
AsyncSnapshot<WebViewController> controller) {
- if (controller.hasData) {
- return FloatingActionButton(
- onPressed: () async {
- final String url = (await controller.data!.currentUrl())!;
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
- SnackBar(content: Text('Favorited $url')),
- );
- },
- child: const Icon(Icons.favorite),
- );
- }
- return Container();
+ return FloatingActionButton(
+ onPressed: () async {
+ String? url;
+ if (controller.hasData) {
+ url = (await controller.data!.currentUrl())!;
+ }
+ ScaffoldMessenger.of(context).showSnackBar(
+ SnackBar(
+ content: Text(
+ controller.hasData
+ ? 'Favorited $url'
+ : 'Unable to favorite',
+ ),
+ ),
+ );
+ },
+ child: const Icon(Icons.favorite),
+ );
});
}
}
@@ -186,10 +190,11 @@
}
class SampleMenu extends StatelessWidget {
- SampleMenu(this.controller);
+ SampleMenu(this.controller, CookieManager? cookieManager)
+ : cookieManager = cookieManager ?? CookieManager();
final Future<WebViewController> controller;
- final CookieManager cookieManager = CookieManager();
+ late final CookieManager cookieManager;
@override
Widget build(BuildContext context) {
@@ -315,8 +320,7 @@
WebViewController controller, BuildContext context) async {
final String cookies =
await controller.runJavascriptReturningResult('document.cookie');
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(SnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Column(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
@@ -332,8 +336,7 @@
WebViewController controller, BuildContext context) async {
await controller.runJavascript(
'caches.open("test_caches_entry"); localStorage["test_localStorage"] = "dummy_entry";');
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(const SnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text('Added a test entry to cache.'),
));
}
@@ -348,8 +351,7 @@
Future<void> _onClearCache(
WebViewController controller, BuildContext context) async {
await controller.clearCache();
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(const SnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text('Cache cleared.'),
));
}
@@ -360,8 +362,7 @@
if (!hadCookies) {
message = 'There are no cookies.';
}
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(SnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(message),
));
}
@@ -375,7 +376,7 @@
Future<void> _onSetCookie(
WebViewController controller, BuildContext context) async {
- await CookieManager().setCookie(
+ await cookieManager.setCookie(
const WebViewCookie(
name: 'foo', value: 'bar', domain: 'httpbin.org', path: '/anything'),
);
@@ -466,8 +467,7 @@
if (await controller!.canGoBack()) {
await controller.goBack();
} else {
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('No back history item')),
);
return;
@@ -482,8 +482,7 @@
if (await controller!.canGoForward()) {
await controller.goForward();
} else {
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('No forward history item')),
);
diff --git a/packages/webview_flutter/webview_flutter/example/test/main_test.dart b/packages/webview_flutter/webview_flutter/example/test/main_test.dart
new file mode 100644
index 0000000..8676333
--- /dev/null
+++ b/packages/webview_flutter/webview_flutter/example/test/main_test.dart
@@ -0,0 +1,39 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:webview_flutter/webview_flutter.dart';
+import 'package:webview_flutter_example/main.dart';
+
+void main() {
+ testWidgets('Test snackbar from ScaffoldMessenger',
+ (WidgetTester tester) async {
+ await tester.pumpWidget(
+ MaterialApp(
+ home: WebViewExample(cookieManager: FakeCookieManager()),
+ ),
+ );
+ expect(find.byIcon(Icons.favorite), findsOneWidget);
+ await tester.tap(find.byIcon(Icons.favorite));
+ await tester.pump();
+ expect(find.byType(SnackBar), findsOneWidget);
+ });
+}
+
+class FakeCookieManager implements CookieManager {
+ factory FakeCookieManager() {
+ return _instance ??= FakeCookieManager._();
+ }
+
+ FakeCookieManager._();
+
+ static FakeCookieManager? _instance;
+
+ @override
+ Future<bool> clearCookies() => throw UnimplementedError();
+
+ @override
+ Future<void> setCookie(WebViewCookie cookie) => throw UnimplementedError();
+}
diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml
index 322f4ad..1035098 100644
--- a/packages/webview_flutter/webview_flutter/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin that provides a WebView widget on Android and iOS.
repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 3.0.1
+version: 3.0.2
environment:
sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
index ad81b0f..fb5a2b8 100644
--- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.8.5
+
+* Migrates deprecated `Scaffold.showSnackBar` to `ScaffoldMessenger` in example app.
+
## 2.8.4
* Fixes bug preventing `mockito` code generation for tests.
diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/main.dart b/packages/webview_flutter/webview_flutter_android/example/lib/main.dart
index 0d0cd59..3dd107b 100644
--- a/packages/webview_flutter/webview_flutter_android/example/lib/main.dart
+++ b/packages/webview_flutter/webview_flutter_android/example/lib/main.dart
@@ -110,37 +110,33 @@
_SampleMenu(_controller.future),
],
),
- // We're using a Builder here so we have a context that is below the Scaffold
- // to allow calling Scaffold.of(context) so we can show a snackbar.
- body: Builder(builder: (BuildContext context) {
- return WebView(
- initialUrl: 'https://flutter.dev',
- onWebViewCreated: (WebViewController controller) {
- _controller.complete(controller);
- },
- onProgress: (int progress) {
- print('WebView is loading (progress : $progress%)');
- },
- navigationDelegate: (NavigationRequest request) {
- if (request.url.startsWith('https://www.youtube.com/')) {
- print('blocking navigation to $request}');
- return NavigationDecision.prevent;
- }
- print('allowing navigation to $request');
- return NavigationDecision.navigate;
- },
- onPageStarted: (String url) {
- print('Page started loading: $url');
- },
- onPageFinished: (String url) {
- print('Page finished loading: $url');
- },
- javascriptChannels: _createJavascriptChannels(context),
- javascriptMode: JavascriptMode.unrestricted,
- userAgent: 'Custom_User_Agent',
- backgroundColor: const Color(0x80000000),
- );
- }),
+ body: WebView(
+ initialUrl: 'https://flutter.dev',
+ onWebViewCreated: (WebViewController controller) {
+ _controller.complete(controller);
+ },
+ onProgress: (int progress) {
+ print('WebView is loading (progress : $progress%)');
+ },
+ navigationDelegate: (NavigationRequest request) {
+ if (request.url.startsWith('https://www.youtube.com/')) {
+ print('blocking navigation to $request}');
+ return NavigationDecision.prevent;
+ }
+ print('allowing navigation to $request');
+ return NavigationDecision.navigate;
+ },
+ onPageStarted: (String url) {
+ print('Page started loading: $url');
+ },
+ onPageFinished: (String url) {
+ print('Page finished loading: $url');
+ },
+ javascriptChannels: _createJavascriptChannels(context),
+ javascriptMode: JavascriptMode.unrestricted,
+ userAgent: 'Custom_User_Agent',
+ backgroundColor: const Color(0x80000000),
+ ),
floatingActionButton: favoriteButton(),
);
}
@@ -154,8 +150,7 @@
return FloatingActionButton(
onPressed: () async {
final String url = (await controller.data!.currentUrl())!;
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Favorited $url')),
);
},
@@ -323,8 +318,7 @@
WebViewController controller, BuildContext context) async {
final String cookies =
await controller.runJavascriptReturningResult('document.cookie');
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(SnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Column(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
@@ -340,8 +334,7 @@
WebViewController controller, BuildContext context) async {
await controller.runJavascript(
'caches.open("test_caches_entry"); localStorage["test_localStorage"] = "dummy_entry";');
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(const SnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text('Added a test entry to cache.'),
));
}
@@ -356,8 +349,7 @@
Future<void> _onClearCache(
WebViewController controller, BuildContext context) async {
await controller.clearCache();
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(const SnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text('Cache cleared.'),
));
}
@@ -369,8 +361,7 @@
if (!hadCookies) {
message = 'There are no cookies.';
}
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(SnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(message),
));
}
@@ -474,8 +465,7 @@
if (await controller!.canGoBack()) {
await controller.goBack();
} else {
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('No back history item')),
);
return;
@@ -490,8 +480,7 @@
if (await controller!.canGoForward()) {
await controller.goForward();
} else {
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('No forward history item')),
);
diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
index 5c3c83a..3fae698 100644
--- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin that provides a WebView widget on Android.
repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 2.8.4
+version: 2.8.5
environment:
sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
index c3dd872..bad900d 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
@@ -1,6 +1,7 @@
-## NEXT
+## 2.7.2
* Fixes an integration test race condition.
+* Migrates deprecated `Scaffold.showSnackBar` to `ScaffoldMessenger` in example app.
## 2.7.1
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart
index d4e0ec4..e126de8 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/main.dart
@@ -105,27 +105,23 @@
_SampleMenu(_controller.future),
],
),
- // We're using a Builder here so we have a context that is below the Scaffold
- // to allow calling Scaffold.of(context) so we can show a snackbar.
- body: Builder(builder: (BuildContext context) {
- return WebView(
- initialUrl: 'https://flutter.dev/',
- onWebViewCreated: (WebViewController controller) {
- _controller.complete(controller);
- },
- javascriptChannels: _createJavascriptChannels(context),
- javascriptMode: JavascriptMode.unrestricted,
- navigationDelegate: (NavigationRequest request) {
- if (request.url.startsWith('https://www.youtube.com/')) {
- print('blocking navigation to $request}');
- return NavigationDecision.prevent;
- }
- print('allowing navigation to $request');
- return NavigationDecision.navigate;
- },
- backgroundColor: const Color(0x80000000),
- );
- }),
+ body: WebView(
+ initialUrl: 'https://flutter.dev/',
+ onWebViewCreated: (WebViewController controller) {
+ _controller.complete(controller);
+ },
+ javascriptChannels: _createJavascriptChannels(context),
+ javascriptMode: JavascriptMode.unrestricted,
+ navigationDelegate: (NavigationRequest request) {
+ if (request.url.startsWith('https://www.youtube.com/')) {
+ print('blocking navigation to $request}');
+ return NavigationDecision.prevent;
+ }
+ print('allowing navigation to $request');
+ return NavigationDecision.navigate;
+ },
+ backgroundColor: const Color(0x80000000),
+ ),
floatingActionButton: favoriteButton(),
);
}
@@ -139,8 +135,7 @@
return FloatingActionButton(
onPressed: () async {
final String url = (await controller.data!.currentUrl())!;
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Favorited $url')),
);
},
@@ -456,8 +451,7 @@
if (await controller!.canGoBack()) {
await controller.goBack();
} else {
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('No back history item')),
);
return;
@@ -472,8 +466,7 @@
if (await controller!.canGoForward()) {
await controller.goForward();
} else {
- // ignore: deprecated_member_use
- Scaffold.of(context).showSnackBar(
+ ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('No forward history item')),
);
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
index 219d6ce..75e7cca 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_wkwebview
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 2.7.1
+version: 2.7.2
environment:
sdk: ">=2.14.0 <3.0.0"