Skip to content

Commit f4106e5

Browse files
author
chetanr250
committed
feat: Implement HTML rendering with browser interactivity using webview_flutter: foss42#155:
1 parent 04b486d commit f4106e5

File tree

5 files changed

+81
-2
lines changed

5 files changed

+81
-2
lines changed

lib/consts.dart

+1
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,7 @@ const kLabelAddFormField = "Add Form Field";
773773
const kLabelNotSent = "Not Sent";
774774
const kLabelResponse = "Response";
775775
const kLabelResponseBody = "Response Body";
776+
const kLabelPreview = "Preview";
776777
const kTooltipClearResponse = "Clear Response";
777778
const kHeaderRow = ["Header Name", "Header Value"];
778779
const kLabelRequestHeaders = "Request Headers";

lib/screens/home_page/editor_pane/details_card/response_pane.dart

+14
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class ResponseTabs extends ConsumerWidget {
7777
children: const [
7878
ResponseBodyTab(),
7979
ResponseHeadersTab(),
80+
ResponsePreviewTab(),
8081
],
8182
);
8283
}
@@ -111,3 +112,16 @@ class ResponseHeadersTab extends ConsumerWidget {
111112
);
112113
}
113114
}
115+
116+
class ResponsePreviewTab extends ConsumerWidget {
117+
const ResponsePreviewTab({super.key});
118+
119+
@override
120+
Widget build(BuildContext context, WidgetRef ref) {
121+
final selectedRequestModel = ref.watch(selectedRequestModelProvider);
122+
final responseModel = selectedRequestModel?.httpResponseModel;
123+
return ResponsePreview(
124+
responseModel: responseModel,
125+
);
126+
}
127+
}

lib/widgets/response_widgets.dart

+32-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:apidash/utils/utils.dart';
77
import 'package:apidash/widgets/widgets.dart';
88
import 'package:apidash/models/models.dart';
99
import 'package:apidash/consts.dart';
10+
import 'package:webview_flutter/webview_flutter.dart';
1011

1112
class NotSentWidget extends StatelessWidget {
1213
const NotSentWidget({super.key});
@@ -193,7 +194,7 @@ class _ResponseTabViewState extends State<ResponseTabView>
193194
void initState() {
194195
super.initState();
195196
_controller = TabController(
196-
length: 2,
197+
length: 3,
197198
animationDuration: kTabAnimationDuration,
198199
vsync: this,
199200
);
@@ -216,6 +217,9 @@ class _ResponseTabViewState extends State<ResponseTabView>
216217
TabLabel(
217218
text: kLabelHeaders,
218219
),
220+
TabLabel(
221+
text: kLabelPreview,
222+
),
219223
],
220224
),
221225
Expanded(
@@ -518,3 +522,30 @@ class _BodySuccessState extends State<BodySuccess> {
518522
);
519523
}
520524
}
525+
526+
class ResponsePreview extends StatelessWidget {
527+
const ResponsePreview({super.key, required this.responseModel});
528+
final responseModel;
529+
530+
@override
531+
Widget build(BuildContext context) {
532+
final controller = WebViewController()
533+
..setJavaScriptMode(JavaScriptMode.unrestricted)
534+
..setNavigationDelegate(
535+
NavigationDelegate(
536+
onWebResourceError: (WebResourceError error) {
537+
ErrorMessage(message: error.description);
538+
},
539+
),
540+
);
541+
542+
// Load HTML content
543+
WidgetsBinding.instance.addPostFrameCallback((_) {
544+
controller.loadHtmlString(responseModel!.body!);
545+
});
546+
547+
return Scaffold(
548+
body: WebViewWidget(controller: controller),
549+
);
550+
}
551+
}

pubspec.lock

+33-1
Original file line numberDiff line numberDiff line change
@@ -1700,6 +1700,38 @@ packages:
17001700
url: "https://pub.dev"
17011701
source: hosted
17021702
version: "1.2.1"
1703+
webview_flutter:
1704+
dependency: "direct main"
1705+
description:
1706+
name: webview_flutter
1707+
sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec"
1708+
url: "https://pub.dev"
1709+
source: hosted
1710+
version: "4.10.0"
1711+
webview_flutter_android:
1712+
dependency: transitive
1713+
description:
1714+
name: webview_flutter_android
1715+
sha256: "74693a212d990b32e0b7055d27db973a18abf31c53942063948cdfaaef9787ba"
1716+
url: "https://pub.dev"
1717+
source: hosted
1718+
version: "4.0.0"
1719+
webview_flutter_platform_interface:
1720+
dependency: transitive
1721+
description:
1722+
name: webview_flutter_platform_interface
1723+
sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d
1724+
url: "https://pub.dev"
1725+
source: hosted
1726+
version: "2.10.0"
1727+
webview_flutter_wkwebview:
1728+
dependency: transitive
1729+
description:
1730+
name: webview_flutter_wkwebview
1731+
sha256: d4034901d96357beb1b6717ebf7d583c88e40cfc6eb85fe76dd1bf0979a9f251
1732+
url: "https://pub.dev"
1733+
source: hosted
1734+
version: "3.16.0"
17031735
win32:
17041736
dependency: transitive
17051737
description:
@@ -1750,5 +1782,5 @@ packages:
17501782
source: hosted
17511783
version: "3.1.2"
17521784
sdks:
1753-
dart: ">=3.5.0-259.0.dev <3.999.0"
1785+
dart: ">=3.5.0 <3.999.0"
17541786
flutter: ">=3.24.2"

pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ dependencies:
7575
url: https://github.com/google/flutter-desktop-embedding.git
7676
path: plugins/window_size
7777
xml: ^6.3.0
78+
webview_flutter: ^4.10.0
7879

7980
dependency_overrides:
8081
extended_text_field: ^16.0.0

0 commit comments

Comments
 (0)