Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/webview_flutter/webview_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
129 changes: 64 additions & 65 deletions packages/webview_flutter/webview_flutter/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import 'package:flutter/material.dart';
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>
Expand Down Expand Up @@ -71,6 +71,10 @@ const String kTransparentBackgroundPage = '''
''';

class WebViewExample extends StatefulWidget {
const WebViewExample({this.cookieManager});

final CookieManager? cookieManager;

@override
_WebViewExampleState createState() => _WebViewExampleState();
}
Expand All @@ -96,42 +100,38 @@ class _WebViewExampleState extends State<WebViewExample> {
// 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(),
);
}
Expand All @@ -140,8 +140,7 @@ class _WebViewExampleState extends State<WebViewExample> {
return JavascriptChannel(
name: 'Toaster',
onMessageReceived: (JavascriptMessage message) {
// ignore: deprecated_member_use
Scaffold.of(context).showSnackBar(
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
});
Expand All @@ -152,19 +151,24 @@ class _WebViewExampleState extends State<WebViewExample> {
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),
);
});
}
}
Expand All @@ -186,10 +190,11 @@ enum MenuOptions {
}

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) {
Expand Down Expand Up @@ -315,8 +320,7 @@ class SampleMenu extends StatelessWidget {
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,
Expand All @@ -332,8 +336,7 @@ class SampleMenu extends StatelessWidget {
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.'),
));
}
Expand All @@ -348,8 +351,7 @@ class SampleMenu extends StatelessWidget {
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.'),
));
}
Expand All @@ -360,8 +362,7 @@ class SampleMenu extends StatelessWidget {
if (!hadCookies) {
message = 'There are no cookies.';
}
// ignore: deprecated_member_use
Scaffold.of(context).showSnackBar(SnackBar(
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(message),
));
}
Expand All @@ -375,7 +376,7 @@ class SampleMenu extends StatelessWidget {

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'),
);
Expand Down Expand Up @@ -466,8 +467,7 @@ class NavigationControls extends StatelessWidget {
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;
Expand All @@ -482,8 +482,7 @@ class NavigationControls extends StatelessWidget {
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')),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
2 changes: 1 addition & 1 deletion packages/webview_flutter/webview_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: webview_flutter
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"
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
Loading