修复处理内容包括公告 WebView、文件预览页、分享页兜底获取下载链接的隐藏 WebView。
This commit is contained in:
@@ -1,7 +1,13 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart' as desktop;
|
||||
import 'package:webview_flutter/webview_flutter.dart' as mobile;
|
||||
|
||||
bool get _useDesktopWebView =>
|
||||
!kIsWeb && (Platform.isWindows || Platform.isLinux);
|
||||
|
||||
class AnnouncementDialog extends StatefulWidget {
|
||||
final String title;
|
||||
@@ -26,11 +32,8 @@ class AnnouncementDialog extends StatefulWidget {
|
||||
await showDialog<void>(
|
||||
context: context,
|
||||
barrierDismissible: true,
|
||||
builder: (_) => AnnouncementDialog(
|
||||
title: title,
|
||||
html: html,
|
||||
baseUrl: baseUrl,
|
||||
),
|
||||
builder: (_) =>
|
||||
AnnouncementDialog(title: title, html: html, baseUrl: baseUrl),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -39,35 +42,39 @@ class AnnouncementDialog extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _AnnouncementDialogState extends State<AnnouncementDialog> {
|
||||
late final WebViewController _controller;
|
||||
mobile.WebViewController? _mobileController;
|
||||
desktop.InAppWebViewController? _desktopController;
|
||||
late final String _html;
|
||||
late final String _baseUrl;
|
||||
bool _loading = true;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
_controller = WebViewController()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||||
..setBackgroundColor(Colors.transparent)
|
||||
..setNavigationDelegate(
|
||||
NavigationDelegate(
|
||||
onPageFinished: (_) {
|
||||
if (mounted) setState(() => _loading = false);
|
||||
},
|
||||
),
|
||||
);
|
||||
final origin = Uri.parse(widget.baseUrl).origin;
|
||||
_html = _wrapHtml(widget.html);
|
||||
_baseUrl = '$origin/';
|
||||
|
||||
_load();
|
||||
if (!_useDesktopWebView) {
|
||||
_mobileController = mobile.WebViewController()
|
||||
..setJavaScriptMode(mobile.JavaScriptMode.unrestricted)
|
||||
..setBackgroundColor(Colors.transparent)
|
||||
..setNavigationDelegate(
|
||||
mobile.NavigationDelegate(
|
||||
onPageFinished: (_) {
|
||||
if (mounted) setState(() => _loading = false);
|
||||
},
|
||||
),
|
||||
)
|
||||
..loadHtmlString(_html, baseUrl: _baseUrl);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _load() async {
|
||||
final origin = Uri.parse(widget.baseUrl).origin;
|
||||
final html = _wrapHtml(widget.html);
|
||||
|
||||
await _controller.loadHtmlString(
|
||||
html,
|
||||
baseUrl: '$origin/',
|
||||
);
|
||||
@override
|
||||
void dispose() {
|
||||
_desktopController?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
String _wrapHtml(String body) {
|
||||
@@ -162,7 +169,7 @@ $body
|
||||
Expanded(
|
||||
child: Stack(
|
||||
children: [
|
||||
WebViewWidget(controller: _controller),
|
||||
_buildWebView(),
|
||||
if (_loading)
|
||||
const Center(child: CircularProgressIndicator()),
|
||||
],
|
||||
@@ -174,4 +181,29 @@ $body
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildWebView() {
|
||||
if (_useDesktopWebView) {
|
||||
return desktop.InAppWebView(
|
||||
initialData: desktop.InAppWebViewInitialData(
|
||||
data: _html,
|
||||
baseUrl: desktop.WebUri(_baseUrl),
|
||||
),
|
||||
initialSettings: desktop.InAppWebViewSettings(
|
||||
javaScriptEnabled: true,
|
||||
domStorageEnabled: true,
|
||||
transparentBackground: true,
|
||||
supportZoom: false,
|
||||
),
|
||||
onWebViewCreated: (controller) {
|
||||
_desktopController = controller;
|
||||
},
|
||||
onLoadStop: (_, url) {
|
||||
if (mounted) setState(() => _loading = false);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
return mobile.WebViewWidget(controller: _mobileController!);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user