invoice/lib/ui/app/app_webview.dart

99 lines
2.3 KiB
Dart

// Dart imports:
// Flutter imports:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
// Package imports:
import 'package:webview_flutter/webview_flutter.dart';
import 'package:invoiceninja_flutter/utils/web_stub.dart'
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
class AppWebView extends StatelessWidget {
const AppWebView({this.html});
final String? html;
@override
Widget build(BuildContext context) {
return kIsWeb
? _WebWebView(html: html)
: _MobileWebView(
html: html,
width: MediaQuery.of(context).size.width - 20,
);
}
}
class _WebWebView extends StatelessWidget {
const _WebWebView({this.html});
final String? html;
@override
Widget build(BuildContext context) {
final encodedHtml =
'data:text/html;charset=utf-8,' + Uri.encodeComponent(html!);
WebUtils.registerWebView(encodedHtml);
return AbsorbPointer(
child: HtmlElementView(viewType: encodedHtml),
);
}
}
class _MobileWebView extends StatefulWidget {
const _MobileWebView({
Key? key,
required this.html,
required this.width,
}) : super(key: key);
final String? html;
final double width;
@override
_MobileWebViewState createState() => _MobileWebViewState();
}
class _MobileWebViewState extends State<_MobileWebView>
with AutomaticKeepAliveClientMixin<_MobileWebView> {
late WebViewController _webViewController;
@override
bool get wantKeepAlive => true;
@override
void initState() {
super.initState();
_webViewController = WebViewController()
..setJavaScriptMode(JavaScriptMode.disabled)
..setBackgroundColor(const Color(0x00000000));
if ((widget.html ?? '').isNotEmpty) {
_webViewController.loadHtmlString(
widget.html!.replaceFirst('width="570"', 'width="${widget.width}"'));
}
}
@override
void didUpdateWidget(oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.html != oldWidget.html) {
_webViewController.loadHtmlString(
widget.html!.replaceFirst('width="570"', 'width="${widget.width}"'));
}
}
@override
Widget build(BuildContext context) {
super.build(context);
return WebViewWidget(
controller: _webViewController,
);
}
}