Skip to content

Commit 1a1b331

Browse files
committed
Added multiplatform support (pub.dev badges)
1 parent 1fc97f1 commit 1a1b331

7 files changed

+58
-11
lines changed

lib/flutter_html.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:flutter_html/image_render.dart';
77
import 'package:flutter_html/src/html_elements.dart';
88
import 'package:flutter_html/style.dart';
99
import 'package:html/dom.dart' as dom;
10-
import 'package:webview_flutter/webview_flutter.dart';
10+
import 'package:flutter_html/src/navigation_delegate.dart';
1111

1212
//export render context api
1313
export 'package:flutter_html/html_parser.dart';
@@ -18,6 +18,7 @@ export 'package:flutter_html/src/interactable_element.dart';
1818
export 'package:flutter_html/src/layout_element.dart';
1919
export 'package:flutter_html/src/replaced_element.dart';
2020
export 'package:flutter_html/src/styled_element.dart';
21+
export 'package:flutter_html/src/navigation_delegate.dart';
2122
//export style api
2223
export 'package:flutter_html/style.dart';
2324

lib/html_parser.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ import 'package:flutter_html/src/anchor.dart';
1313
import 'package:flutter_html/src/css_parser.dart';
1414
import 'package:flutter_html/src/html_elements.dart';
1515
import 'package:flutter_html/src/layout_element.dart';
16+
import 'package:flutter_html/src/navigation_delegate.dart';
1617
import 'package:flutter_html/src/utils.dart';
1718
import 'package:flutter_html/style.dart';
1819
import 'package:html/dom.dart' as dom;
1920
import 'package:html/parser.dart' as htmlparser;
2021
import 'package:numerus/numerus.dart';
21-
import 'package:webview_flutter/webview_flutter.dart';
2222

2323
typedef OnTap = void Function(
2424
String? url,

lib/src/navigation_delegate.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import 'dart:async';
2+
3+
/// Information about a navigation action that is about to be executed.
4+
class NavigationRequest {
5+
NavigationRequest({required this.url, required this.isForMainFrame});
6+
7+
/// The URL that will be loaded if the navigation is executed.
8+
final String url;
9+
10+
/// Whether the navigation request is to be loaded as the main frame.
11+
final bool isForMainFrame;
12+
13+
@override
14+
String toString() {
15+
return '$runtimeType(url: $url, isForMainFrame: $isForMainFrame)';
16+
}
17+
}
18+
19+
/// A decision on how to handle a navigation request.
20+
enum NavigationDecision {
21+
/// Prevent the navigation from taking place.
22+
prevent,
23+
24+
/// Allow the navigation to take place.
25+
navigate,
26+
}
27+
28+
/// Decides how to handle a specific navigation request.
29+
///
30+
/// The returned [NavigationDecision] determines how the navigation described by
31+
/// `navigation` should be handled.
32+
///
33+
/// See also: [WebView.navigationDelegate].
34+
typedef FutureOr<NavigationDecision> NavigationDelegate(
35+
NavigationRequest navigation);

lib/src/replaced_element.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:flutter/widgets.dart';
77
import 'package:flutter_html/html_parser.dart';
88
import 'package:flutter_html/src/anchor.dart';
99
import 'package:flutter_html/src/html_elements.dart';
10+
import 'package:flutter_html/src/navigation_delegate.dart';
1011
import 'package:flutter_html/src/utils.dart';
1112
import 'package:flutter_html/src/widgets/iframe_unsupported.dart'
1213
if (dart.library.io) 'package:flutter_html/src/widgets/iframe_mobile.dart'
@@ -16,7 +17,6 @@ import 'package:flutter_math_fork/flutter_math.dart';
1617
import 'package:flutter_svg/flutter_svg.dart';
1718
import 'package:html/dom.dart' as dom;
1819
import 'package:video_player/video_player.dart';
19-
import 'package:webview_flutter/webview_flutter.dart';
2020

2121
/// A [ReplacedElement] is a type of [StyledElement] that does not require its [children] to be rendered.
2222
///

lib/src/widgets/iframe_mobile.dart

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import 'package:flutter/foundation.dart';
22
import 'package:flutter/gestures.dart';
33
import 'package:flutter/material.dart';
44
import 'package:flutter_html/html_parser.dart';
5+
import 'package:flutter_html/src/navigation_delegate.dart';
56
import 'package:flutter_html/src/replaced_element.dart';
67
import 'package:flutter_html/style.dart';
7-
import 'package:webview_flutter/webview_flutter.dart';
8+
import 'package:webview_flutter/webview_flutter.dart' as webview;
89
import 'package:html/dom.dart' as dom;
910

1011
/// [IframeContentElement is a [ReplacedElement] with web content.
@@ -30,13 +31,23 @@ class IframeContentElement extends ReplacedElement {
3031
return Container(
3132
width: width ?? (height ?? 150) * 2,
3233
height: height ?? (width ?? 300) / 2,
33-
child: WebView(
34+
child: webview.WebView(
3435
initialUrl: src,
3536
key: key,
3637
javascriptMode: sandboxMode == null || sandboxMode == "allow-scripts"
37-
? JavascriptMode.unrestricted
38-
: JavascriptMode.disabled,
39-
navigationDelegate: navigationDelegate,
38+
? webview.JavascriptMode.unrestricted
39+
: webview.JavascriptMode.disabled,
40+
navigationDelegate: (request) async {
41+
final result = await navigationDelegate!(NavigationRequest(
42+
url: request.url,
43+
isForMainFrame: request.isForMainFrame,
44+
));
45+
if (result == NavigationDecision.prevent) {
46+
return webview.NavigationDecision.prevent;
47+
} else {
48+
return webview.NavigationDecision.navigate;
49+
}
50+
},
4051
gestureRecognizers: {
4152
Factory<VerticalDragGestureRecognizer>(() => VerticalDragGestureRecognizer())
4253
},

lib/src/widgets/iframe_unsupported.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_html/html_parser.dart';
3+
import 'package:flutter_html/src/navigation_delegate.dart';
34
import 'package:flutter_html/src/replaced_element.dart';
45
import 'package:flutter_html/style.dart';
5-
import 'package:webview_flutter/webview_flutter.dart';
66
import 'package:html/dom.dart' as dom;
77

88
/// [IframeContentElement is a [ReplacedElement] with web content.
@@ -30,4 +30,4 @@ class IframeContentElement extends ReplacedElement {
3030
child: Text("Iframes are currently not supported in this environment"),
3131
);
3232
}
33-
}
33+
}

lib/src/widgets/iframe_web.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_html/html_parser.dart';
33
import 'package:flutter_html/shims/dart_ui.dart' as ui;
4+
import 'package:flutter_html/src/navigation_delegate.dart';
45
import 'package:flutter_html/src/replaced_element.dart';
56
import 'package:flutter_html/src/utils.dart';
67
import 'package:flutter_html/style.dart';
7-
import 'package:webview_flutter/webview_flutter.dart';
88
import 'package:html/dom.dart' as dom;
99
// ignore: avoid_web_libraries_in_flutter
1010
import 'dart:html' as html;

0 commit comments

Comments
 (0)