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

Commit 4209dba

Browse files
[webview_flutter] Implementation of the app facing WebViewWidget for v4 (#6367)
1 parent f6e933b commit 4209dba

File tree

4 files changed

+398
-0
lines changed

4 files changed

+398
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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/cupertino.dart';
6+
import 'package:flutter/foundation.dart';
7+
import 'package:flutter/gestures.dart';
8+
import 'package:webview_flutter_platform_interface/v4/webview_flutter_platform_interface.dart';
9+
10+
import 'webview_controller.dart';
11+
12+
/// Displays a native WebView as a Widget.
13+
class WebViewWidget extends StatelessWidget {
14+
/// Constructs a [WebViewWidget].
15+
WebViewWidget({
16+
Key? key,
17+
required WebViewController controller,
18+
TextDirection layoutDirection = TextDirection.ltr,
19+
Set<Factory<OneSequenceGestureRecognizer>> gestureRecognizers =
20+
const <Factory<OneSequenceGestureRecognizer>>{},
21+
}) : this.fromPlatformCreationParams(
22+
key: key,
23+
params: PlatformWebViewWidgetCreationParams(
24+
controller: controller.platform,
25+
layoutDirection: layoutDirection,
26+
gestureRecognizers: gestureRecognizers,
27+
),
28+
);
29+
30+
/// Constructs a [WebViewWidget] from creation params for a specific
31+
/// platform.
32+
WebViewWidget.fromPlatformCreationParams({
33+
Key? key,
34+
required PlatformWebViewWidgetCreationParams params,
35+
}) : this.fromPlatform(key: key, platform: PlatformWebViewWidget(params));
36+
37+
/// Constructs a [WebViewWidget] from a specific platform implementation.
38+
WebViewWidget.fromPlatform({Key? key, required this.platform})
39+
: super(key: key);
40+
41+
/// Implementation of [PlatformWebViewWidget] for the current platform.
42+
final PlatformWebViewWidget platform;
43+
44+
/// The layout direction to use for the embedded WebView.
45+
late final TextDirection layoutDirection = platform.params.layoutDirection;
46+
47+
/// Specifies which gestures should be consumed by the web view.
48+
///
49+
/// It is possible for other gesture recognizers to be competing with the web
50+
/// view on pointer events, e.g if the web view is inside a [ListView] the
51+
/// [ListView] will want to handle vertical drags. The web view will claim
52+
/// gestures that are recognized by any of the recognizers on this list.
53+
///
54+
/// When `gestureRecognizers` is empty (default), the web view will only
55+
/// handle pointer events for gestures that were not claimed by any other
56+
/// gesture recognizer.
57+
late final Set<Factory<OneSequenceGestureRecognizer>> gestureRecognizers =
58+
platform.params.gestureRecognizers;
59+
60+
@override
61+
Widget build(BuildContext context) {
62+
return platform.build(context);
63+
}
64+
}

packages/webview_flutter/webview_flutter/lib/src/v4/webview_flutter.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ export 'package:webview_flutter_platform_interface/v4/webview_flutter_platform_i
99

1010
export 'src/webview_controller.dart';
1111
export 'src/webview_cookie_manager.dart';
12+
export 'src/webview_widget.dart';
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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/foundation.dart';
6+
import 'package:flutter/gestures.dart';
7+
import 'package:flutter/widgets.dart';
8+
import 'package:flutter_test/flutter_test.dart';
9+
import 'package:mockito/annotations.dart';
10+
import 'package:mockito/mockito.dart';
11+
import 'package:webview_flutter/src/v4/webview_flutter.dart';
12+
import 'package:webview_flutter_platform_interface/v4/webview_flutter_platform_interface.dart';
13+
14+
import 'webview_widget_test.mocks.dart';
15+
16+
@GenerateMocks(<Type>[PlatformWebViewController, PlatformWebViewWidget])
17+
void main() {
18+
TestWidgetsFlutterBinding.ensureInitialized();
19+
20+
group('WebViewWidget', () {
21+
testWidgets('build', (WidgetTester tester) async {
22+
final MockPlatformWebViewWidget mockPlatformWebViewWidget =
23+
MockPlatformWebViewWidget();
24+
when(mockPlatformWebViewWidget.build(any)).thenReturn(Container());
25+
26+
await tester.pumpWidget(WebViewWidget.fromPlatform(
27+
platform: mockPlatformWebViewWidget,
28+
));
29+
30+
expect(find.byType(Container), findsOneWidget);
31+
});
32+
33+
testWidgets(
34+
'constructor parameters are correctly passed to creation params',
35+
(WidgetTester tester) async {
36+
WebViewPlatform.instance = TestWebViewPlatform();
37+
38+
final MockPlatformWebViewController mockPlatformWebViewController =
39+
MockPlatformWebViewController();
40+
final WebViewController webViewController =
41+
WebViewController.fromPlatform(
42+
mockPlatformWebViewController,
43+
);
44+
45+
final WebViewWidget webViewWidget = WebViewWidget(
46+
key: GlobalKey(),
47+
controller: webViewController,
48+
layoutDirection: TextDirection.rtl,
49+
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{
50+
Factory<OneSequenceGestureRecognizer>(() => EagerGestureRecognizer()),
51+
},
52+
);
53+
54+
// The key passed to the default constructor is used by the super class
55+
// and not passed to the platform implementation.
56+
expect(webViewWidget.platform.params.key, isNull);
57+
expect(
58+
webViewWidget.platform.params.controller,
59+
webViewController.platform,
60+
);
61+
expect(webViewWidget.platform.params.layoutDirection, TextDirection.rtl);
62+
expect(
63+
webViewWidget.platform.params.gestureRecognizers.isNotEmpty,
64+
isTrue,
65+
);
66+
});
67+
});
68+
}
69+
70+
class TestWebViewPlatform extends WebViewPlatform {
71+
@override
72+
PlatformWebViewWidget createPlatformWebViewWidget(
73+
PlatformWebViewWidgetCreationParams params,
74+
) {
75+
return TestPlatformWebViewWidget(params);
76+
}
77+
}
78+
79+
class TestPlatformWebViewWidget extends PlatformWebViewWidget {
80+
TestPlatformWebViewWidget(PlatformWebViewWidgetCreationParams params)
81+
: super.implementation(params);
82+
83+
@override
84+
Widget build(BuildContext context) {
85+
throw UnimplementedError();
86+
}
87+
}

0 commit comments

Comments
 (0)